4.4. 粒度の細かい ID リストサイズ
大規模なデータベースでは、一部のクエリーが大量の CPU および RAM リソースを消費する可能性があります。パフォーマンスを向上させるために、nsslapd-idlistscanlimit 属性を使用して、データベース内のすべてのインデックスに適用されるデフォルトの ID スキャン制限を設定できます。ただし、特定インデックスの制限や、ID リストの不使用を定義すると便利な場合があります。nsIndexIDListScanLimit 属性を使用して、さまざまなタイプの検索フィルターの ID リストスキャン制限を個別に設定できます。
たとえば、制限を設定するには、
objectClass
属性で、nsIndexIDListScanLimit パラメーターを DN cn=objectclass,cn=index,cn=userRoot,cn=ldbm database,cn=plugins,cn=config
に追加します。
nsIndexIDListScanLimit 属性は複数値であり、次のパラメーターリストを値として取ります。
nsIndexIDListScanLimit: limit=NNN [type=eq[,sub,...]] [flags=AND[,XXX,...]] [values=val[,val,...]]
limit
: ID リストの最大サイズ。有効な値は以下のとおりです。-1
: 無制限。0
: インデックスを使用しない。1 から最大 32 ビットの整数 (2147483647)
: ID の最大数。
type
: 任意。インデックスのタイプ。eq
、sub
、pres
など。値はインデックス定義に指定された実際のnsIndexType
のいずれかにする必要があります。たとえば、nsIndexType=eq が定義されていない場合、type=eq は使用できません。flags
: 任意。スキャン制限を適用する動作を変更するフラグ。有効な値は以下のとおりです。AND
: 属性が AND 句に含まれる検索のみにスキャン制限を適用します。OR
: 属性が OR 句に含まれる検索のみにスキャン制限を適用します。
値
: 任意。制限を適用するために検索フィルターと一致する必要がある値のコンマ区切りリスト。一致は一度に 1 回ずつ行われるため、いずれかの値が一致すると値は一致します。値は、一度に 1 つのタイプでのみ使用する必要があります。値はインデックスタイプに対応する必要があり、インデックスが適用される属性の構文に対応する必要があります。たとえば、整数ベースの属性uidNumber
を指定し、この属性がeq
のインデックスになっている場合は、type=eq values=abc を使用できません。値にスペース、コンマ、NULL、またはエスケープが必要なその他の値が含まれている場合は、LDAP フィルターエスケープ構文を使用する必要があります。バックスラッシュ (\) の後に文字の 2 桁の 16 進 コードを続けます。次の例では、DN 値のコンマが\2C
でエスケープされています。nsIndexIDListScanLimit: limit=0 type=eq values=uid=user\2Cou=People\2Cdc=example\2Cdc=com
例4.1 nsIndexIDListScanLimit の設定
オブジェクトクラス
inetOrgPerson
を含む 1,000 万のエントリーを持つ大規模なデータベースでは、(&(objectClass=inetOrgPerson)(uid=user)) を検索すると、objectClass=inetOrgPerson に一致する 1,000 万の ID すべてを含む ID リストが最初に作成されます。データベースがフィルターの 2 つ目の部分を適用すると、結果リストで uid=user に一致するオブジェクトが検索されます。この場合、特定のインデックスの制限を定義するか、ID リストをまったく使用しないと便利です。
AND 句で objectClass=inetOrgPerson の ID リストが作成されないように設定するには、次の nsIndexIDListScanLimit を追加します。
# ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
dn: cn=objectclass,cn=index,cn=userRoot,cn=ldbm database,cn=plugins,cn=config
changetype: modify
replace: nsIndexIDListScanLimit
nsIndexIDListScanLimit: limit=0 type=eq flags=AND values=inetOrgPerson
modifying entry "cn=objectclass,cn=index,cn=userRoot,cn=ldbm database,cn=plugins,cn=config"
AND 句で使用する場合、objectClass=inetOrgPerson の ID リストは作成されません。他のすべての状況では、
nsslapd-idlistscanlimit
の値が適用されます。