からめもぶろぐ。

俺たちは雰囲気で OAuth をやっている

SharePoint REST API を使うときの 5,000 件問題について振り返ってみる

みんな大好き SharePoint の 5,000 件問題ですが、いつも結局のところを忘れてしまうので、備忘録として整理しておきます。
先にこちらの記事を見ておくといろいろ参考になります。

idea.tostring.jp

準備

SharePoint に連番と色とサイズの列を持つ簡単なリストを作成します。色は「白」「黒」の 2 種類、サイズは「小」「中」「大」の 3 種類の値が入ります。

f:id:karamem0:20201125105327p:plain

アイテム数としては 12,500 件を登録しました。よって、色でフィルターした場合は 6,250 件、サイズでフィルターした場合は 4,166 件が取得できることになります。

f:id:karamem0:20201125105501p:plain

色とサイズの列にインデックスがついています。

f:id:karamem0:20201125105813p:plain

検証

Postman を使って API を呼び出します。

まずは何もフィルターしない場合です。フィルターがない場合は ID 順に最初の 100 件が取得されます。件数は $top の指定で変更することが可能ですが、5,000 を超える数を指定するとエラーになります。

f:id:karamem0:20201125110004p:plain

フィルターにインデックスされていない列を指定した場合はエラーになります。これは内部的にフィルター操作によって 5,000 件を超えるデータを操作しようとするためです。このため、フィルターをする列にはインデックスを指定することが必須になります。

f:id:karamem0:20201125105857p:plain

インデックス化されているサイズをフィルターとして指定してみます。検索が成功していることがわかります。

f:id:karamem0:20201125112242p:plain

しかし色でフィルターするとエラーになってしまいます。これはフィルターの結果の件数が 5,000 件を超えているためです。つまり、何でもインデックスすればよいというわけではなく、データが分散されることが予想される列をインデックスの対象として選択するべきであることを示しています。

f:id:karamem0:20201125112429p:plain

複数条件を指定したときは、結果は 5,000 件以下になるはずですが、これはエラーになります。これはまず色でフィルターされ、その結果に対してサイズのフィルターが処理されるためです。最初のフィルターの結果が 5,000 件を超えるとエラーが発生します。

f:id:karamem0:20201125112844p:plain

条件の順番を変更してみると成功することからも動作が理解できると思います。複数条件を指定する際は、できるだけ絞り込みが可能な列を先に指定することでパフォーマンスの改善にも繋がります。

f:id:karamem0:20201125113513p:plain

まとめ

以上の検証結果をまとめてみます。

  • 5,000 件を超える列のフィルターにはインデックスが必須になる
  • インデックスしても結果が 5,000 件を超える場合はフィルターは無効になる
  • 複数条件でフィルターする場合は順序を考慮する

「なぜエラーになるのか」の仕組みさえ覚えておけば 5,000 件問題は決して難しくありません。動作を理解しうまく設計してあげることが肝心です。