Menu Close

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: 任意。インデックスのタイプ。eqsubpres など。値は、インデックス定義に指定された実際の nsIndexType の 1 つにする必要があります。たとえば、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 の値が適用されます。