9.3. ID の長いリストをロードするときのパフォーマンスを向上させるためにインデックススキャン制限を設定する
大規模なディレクトリーでは、検索結果リストが膨大になる可能性があります。たとえば、inetorgperson 属性を備えた 100 万のエントリーを持つディレクトリーは、(objectclass=inetorgperson) などのフィルターを使用した検索でこれらすべてのエントリーを返します。
データベースから長い ID リストを読み込むと、検索パフォーマンスが大幅に低下します。ID リストのスキャン制限は、キーがプライマリーインデックス全体と一致すると見なされる前に、Directory Server が読み取る ID の数に制限を設定します。これは、Directory Server が検索を、異なるリソース制限のセットを持つインデックスなしの検索として扱うことを意味します。
大規模なインデックスでは、インデックスに一致する検索をインデックス化されていないの検索として扱う方が実際には効率的です。検索操作では、ディレクトリーとディレクトリー自体のサイズに近いサイズのインデックスを検索するのではなく、結果を処理するためにディレクトリー全体を 1 か所だけ検索する必要があります。
インデックススキャンの制限は、グローバルに、または特定のデータベースに対して設定できます。
9.3.1. コマンドラインを使用したグローバルインデックススキャン制限の設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、Directory Server の ID リストのスキャン制限は 4000 です。ほとんどのシナリオでは、この値は一般的な範囲のデータベースサイズとアクセスパターンに対して良好なパフォーマンスを提供するため、デフォルト値を変更する必要はありません。データベースインデックスが 4000 エントリーよりわずかに多くても、ディレクトリー全体よりもかなり小さい場合は、ID リストのスキャン制限を上げると検索が改善されます。
一方、制限を下げると、4000 エントリーの上限に達する検索が大幅に高速になりますが、すべてのエントリーをスキャンする必要はありません。
手順
ID リストのスキャン制限を更新します。
# dsconf <instance_name> backend config set --idlistscanlimit=8000このコマンドは、制限を
8000エントリーに設定します。インスタンスを再起動します。
# dsctl <instance_name> restart
9.3.2. Web コンソールを使用したグローバルインデックススキャン制限の設定 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、Directory Server の ID リストのスキャン制限は 4000 です。ほとんどのシナリオでは、この値は一般的な範囲のデータベースサイズとアクセスパターンに対して良好なパフォーマンスを提供するため、デフォルト値を変更する必要はありません。データベースインデックスが 4000 エントリーよりわずかに多くても、ディレクトリー全体よりもかなり小さい場合は、ID リストのスキャン制限を上げると検索が改善されます。
一方、制限を下げると、4000 エントリーの上限に達する検索が大幅に高速になりますが、すべてのエントリーをスキャンする必要はありません。
手順
-
に移動します。 - ID List Scan Limit フィールドを更新します。
- をクリックします。
- 右上隅の をクリックし、Restart Instance を選択します。
9.3.3. コマンドラインを使用してデータベースにインデックススキャン制限を設定する リンクのコピーリンクがクリップボードにコピーされました!
場合によっては、特定のインデックスに制限を定義したり、ID リストをまったく使用しない方が便利な場合があります。さまざまなタイプの検索フィルターの ID リストスキャン制限を個別に設定できます。
たとえば、オブジェクトクラス inetOrgPerson を含む 1,000 万のエントリーを持つ大規模なデータベースでは、(&(objectClass=inetOrgPerson)(uid=user)) フィルターはまず objectClass=inetOrgPerson に一致する 1,000 万の ID すべてを含む ID リストを作成します。データベースがフィルターの 2 番目の部分を適用すると、uid=user に一致するオブジェクトの結果一覧を検索します。この場合、特定のインデックスに制限を定義するか、ID リストをまったく使用しないようにすると便利です。
この手順では、AND 句で objectClass=inetOrgPerson 条件の ID リストを作成しないように Directory Server を設定する方法を示します。
手順
nsIndexIDListScanLimitパラメーターを設定します。# ldapmodify -D "cn=Directory Manager" -W -H ldap://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これらの設定では、Directory Server は
AND句のobjectClass=inetOrgPerson条件の ID リストを作成しません。その他のすべての状況では、Directory Server はグローバル ID リストのスキャン制限値を適用します。nsIndexIDListScanLimitパラメーターは、次の構文を使用します。nsIndexIDListScanLimit: limit=NNN [type=eq[,sub,...]] [flags=AND[,XXX,...]] [values=val[,val,...]]limit: ID リストの最大サイズを設定します。有効な値は以下のとおりです。-
-1: 無制限。 -
0: インデックスを使用しない。 -
1から 32 ビット整数の最大値 (2147483647): ID の最大数
-
type: オプション: スキャン制限の動作を変更するフラグを設定します。有効な値は以下のとおりです。-
AND:AND句に属性が含まれる検索にのみスキャン制限を適用します。 -
OR:OR句に属性が含まれる検索にのみスキャン制限を適用します。
-
values: オプション: 制限を適用するために検索フィルターに一致する必要がある値のコンマ区切りリスト。一致は一度に 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