[AD/ADAM] 10000件以上のデータが登録された環境でサーバソートすると 0x8007202C (2)/4 - 降順ソートの障害

みなさんごきげんよう、ういこです。
今回も、前回と同じく、大量件数保持 AD (or ADAM) に対してのサーバソートについての記事です。ただし、今回は降順ソートの挙動についてとなります。昇順ソートと降順ソート、基本は同じ…はずだと思いきや、じつは昇順ソートと降順ソート、内部実装(プログラムの書き方)自体が異なっているのです。
さらに、降順の場合だけ、障害があり、二重の意味で挙動が異なるという結果となってしまっています。
降順ソートでこの問題にすでに直面されていらっしゃった皆様、弊社製品の不具合のためにご迷惑をおかけしたことをお詫び申し上げます。

【問題】 10000 件以上、大量に ADAM および AD にオブジェクトが登録されている環境に対し、ソートを実行すると

"サーバーは要求された重大な拡張子をサポートしていません。(0x8007202C)"

というエラーが返され、ソートができない。しかし、Name など一部の属性では問題なく動作する。 ただし、降順ソートの場合、すべての属性に対してソートができず、上記エラーが発生する。

【解説】Active Directory の大容量データに対するサーバ ソートについて
(1) 昇順ソート ~ インデックスつき属性と、インデックスなし属性での挙動の違い
(2) 降順ソート ~ 既知の問題 ← このコンテンツです!
(3) Virtual List View は対処方法となりえるか?(3 回目予定)
(4) まとめ (4 回目予定)

- これまでの経緯
サーバ ソート(データをサーバ側で「整える(取得したデータの並べ替えを行う))の昇順ソートの場合は、インデックス化されていない属性をソートキーに指定した場合は、データの並べ替えのためサーバ側で一時的にデータを格納するテーブルが作成され、このテーブル内で指定されたキーによる整列を行います。
この一時的なソートに用いられるテーブルのサイズは、"MaxTempTableSize" という LDAP ポリシーで決められており、既定は 10000 です。
ソートする対象のレコード数が MaxTempTableSize を超えた場合、ソート処理は行われません。
一方、インデックス化された属性のソートの場合にはこの一時データ格納テーブルを使わないためこの制限に抵触しません。
このため、インデックス化された属性の場合はうまくいき、インデックス化されてない属性をソートキーに指定して昇順ソートを行った場合は上記問題が発生してしまうことになるのでした。

- 降順ソート時の現象およびその原因
降順ソートに関しては、MaxTempTableSize のサイズ制限抵触以外の問題が存在し、インデックス付与済みの属性もこの問題の影響を受けてしまいます。 昇順ソートと降順ソートは、同じ処理ではありません。内部でどちらのソートを実行するかという目印(フラグ)の値を保持しており、処理が分岐しています。
インデックス化属性であっても降順ソート時大量件数が存在する場合、非インデックス属性の昇順ソート時の動作と同様のエラーが発生する問題があります。この問題は製品の障害となります。そのため、降順ソートを実装する必要があるシステムの場合は、属性のインデックス化は回避手段とはなりません。
実は、この問題は修正リクエストが米国にて行われたのですが、修正時の副作用が広範囲になるという判断から修正が見送られたという経緯があります。

- 再現サンプル コード
さて、[Active Directory スキーマ] スナップ インを使い、インデックスがふられていない属性にインデックス化したとします。昇順ソートはうまくいくでしょう。しかし、降順ソートにした場合、解消したはずの "サーバーは要求された重大な拡張子をサポートしていません。(0x8007202C)" がまた発生してしまいます。

<< VBScript の場合 >>
cmd.Properties("Sort On") = "company DESC"

<<.NET Framework の場合>>
ds.Sort.Direction = SortDirection.Descending 

(※) サンプル全文はこちら ⇒ https://blogs.technet.com/jpilmblg/archive/2009/07/24/ad-adam-10000-0x8007202c-1-4.aspx

- 対処方法
対処方法は、LDAP ポリシーの MaxTempTableSize を拡張することだけです。拡張方法はこちらがご参考いただけます。

[AD初級編] AD と ADAM の微妙な違い 2 ~ ntdsutil と dsmgmt で LDAP ポリシーを管理しよう!~ https://blogs.technet.com/jpilmblg/archive/2009/06/25/ad-ad-adam-2-ntdsutil-dsmgmt-ldap.aspx

上記リンクのページの "dsmgmt : ADAM でポリシーを変更する (AD も手順 2 からは共通) " の 7. のところを、以下のようにして、8. の commit changes を実行すればよいだけです。以下は、サイズを 50000 件でも対応できるように拡張した例です。

ldap policy : set MaxTempTableSize to 50000

あらためて弊社製品の問題につきまして製品担当としてお詫び申し上げます。

~ ういこう ~