先輩「A子さん、このリスト…検索しても一部しか出てこないって言ってなかった?」



「そうなんです!SharePointのデータが3000件くらいあるのに、検索しても途中までしかヒットしなくて…」



「それ、“2000件問題”だね」



「え、なにそれ怖い…バグですか?」



「バグじゃなくて仕様。PowerAppsはデータを全部取ってるわけじゃないんだよ」



「え?全部じゃないんですか!?」



「うん。条件によっては“最初の2000件だけ”しか見てない状態になる」



「それって…気づかないと普通にミスりますよね?」



「その通り。だから実務だとちゃんと対策しないと事故る」
1. 2000件問題の解説
PowerAppsを使い始めると、ある程度データが増えたタイミングでぶつかるのが「2000件問題」です。
見た目では正常に動いているように見えるため、気づかないまま運用してしまい、後から大きなミスに繋がるケースも少なくありません。
結論:2000件問題は「Delegation(委任)制限」によって発生し、対策しない限り正しいデータを扱えません。
具体的には👇
- 条件によっては「最初の2000件」しか処理されない
- 検索・フィルター結果が不正確になる
- データ量が増えるほどリスクが上がる
つまり、小規模では問題なくても、実務規模になると確実に詰みます。
そのためPowerAppsでは、
- Delegation対応の関数を使う
- データ設計を見直す
- そもそも扱い方を変える
といった対策が必須になります。
2000件問題が「仕様」である理由
大事なのは、これがバグではなく「意図的な制限」だという点です。なぜそんなことするんだ?と感じるのは当然ですが、背景には重要な理由があります。
PowerAppsはクラウドアプリケーションです。ユーザーのブラウザで実行されるため、大量データをクライアント側に一度に読み込もうとすると、メモリやネットワーク帯域幅に大きな負荷がかかります。そうなると:
- アプリ自体が重くなり、操作がカクカクになる
- データ取得に時間がかかりすぎてタイムアウトする
- スマートフォンやタブレットで開けなくなる
- 複数ユーザーが同時利用するとサーバーが悲鳴を上げる
こうした事態を防ぐため、Microsoftは「無条件で全データを取得するのではなく、処理能力に応じた範囲に制限する」という設計にしたわけです。
2. なぜ2000件制限があるのか
PowerAppsはクラウド上で動作するため、クライアント側に大量データを直接読み込むとパフォーマンス低下やタイムアウトの原因になります。
そのため、デフォルトで「データの取得はサーバー側に委任(Delegation)」し、クライアントが処理する件数に制限をかけています。
つまり、PowerAppsの考え方は以下のようになっています:
- 最初は2000件だけ取得して、ユーザーにはその範囲内で画面に表示
- その2000件に対して検索やフィルターを実行
- 2000件を超えるデータが必要な場合は、明示的に「もっと取得してくれ」と指示する必要がある
この「明示的な指示」というのが、Delegation対応の関数を適切に使うということです。
Delegationの仕組みをもう少し詳しく
「委任(Delegation)」という言葉は、「データベースに処理を委ねる」という意味です。
PowerAppsで「Filter(テーブル, Status = “Active”)」と書くと:
- Delegation対応なら:SharePointやSQL Serverが「Status = ‘Active’ のデータだけを絞り込んで返す」という処理を実行
- Delegation非対応なら:全データ(最大2000件)をPowerAppsに取得してから、アプリ側で絞り込み処理を実行
Delegation対応なら、データベース側で効率よく処理してくれるため、2000件制限の影響を受けにくくなるという仕組みです。
3. 現在の制限値を確認する方法
まずは自分の環境で、どの設定になっているか確認しましょう。
- PowerApps Studioを開く
- [ファイル] > [設定] > [詳細設定] を選択
- 「非委任クエリのデータ行数の上限」の項目を確認
- 既定値は 500件
- 最大値は 2000件
「非委任クエリ」ってなに?
ここまでの説明で「委任(Delegation)」という言葉が出てきましたが、その反対が「非委任」です。
つまり:
- 委任クエリ:データベース側で処理されるため、大量データも扱える(例:Filterで単純な条件)
- 非委任クエリ:PowerApps側で処理されるため、取得できるデータは制限される(例:複雑な関数を組み合わせた絞り込み)
「非委任クエリのデータ行数の上限」という設定は、「PowerApps側で処理する際に、最大何件まで取得できるか」という制限値です。
デフォルトが500件という保守的な値になっているのは、Microsoftが「多くの場合、500件あれば十分でしょ」と想定しているからだと思われます。ただし、実務アプリでは足りないことがほとんどなので、2000件に上げることが多いです。
4. 解決策(回避策)
ここからが実践的な内容です。2000件問題にぶつかった時に、どう対処するか。私が実務で使ってきた方法を4パターン紹介します。
4-1. Delegation対応の関数・条件を使う(推奨)
最もシンプルで効果的な方法は、最初からDelegation対応の関数を使うことです。
PowerAppsでは一部の関数・演算子が委任に対応しており、Filter, Sort, Search などを正しく使えば、サーバー側で絞り込みが行われ、2000件制限の影響を受けません。
例(委任対応パターン):
Filter(
'顧客リスト',
Status = "Active"
)
このコードなら、SharePointデータベース側で「Status = ‘Active’ のレコードだけを抽出してくれます。結果が100件でも10000件でも、全て取得できます。
例(複数条件での委任対応パターン):
Filter(
'顧客リスト',
Status = "Active",
Region = "東京"
)
複数の条件でも大丈夫。データベース側が全て処理してくれます。
ただし、以下のような関数を組み合わせると委任非対応になります:
Filter(
'顧客リスト',
Left(Title, 3) = "ABC"
)
※Leftは委任非対応(SharePointの場合)
「Titleというフィールドの左から3文字が ‘ABC’ のレコードを取得したい」という要求は、残念ながらSharePointには委任できません。なぜなら、SharePointの内部で「Left関数」が実装されていないからです。
どの関数が委任対応か調べるには?
Microsoft公式の「Delegationの概要」ページに、データソース別の詳細なリストが掲載されています。
- SharePoint Online用の対応関数リスト
- SQL Server用の対応関数リスト
- Dataverse用の対応関数リスト
データソースによって対応状況が異なるため、使う前に必ず確認しましょう。私は何度も「あ、これ委任非対応だ…」と気づいてコード書き直したことがあります。
PowerApps Studioでも、非対応の関数を使うと青い波線でエラーが表示されます。その段階で気づけば、まだ直しやすいです。
4-2. データ分割取得(複雑だが強力)
「委任対応の関数では実現できないけど、どうしてもその処理が必要」という場合があります。そんな時は、2000件を超えるデータを複数回に分けて取得し、コレクション(PowerAppsの一時的なメモリ領域)に蓄積するテクニックが使えます。
例:ID順に2000件ずつ取得
ClearCollect(
colData,
Filter(データソース, ID <= 2000)
);
Collect(
colData,
Filter(データソース, ID > 2000 && ID <= 4000)
);
処理の流れ:
- 1行目:ID が 2000以下のレコード全てを、
colDataというコレクションに初期化(ClearCollectで上書き) - 2行目:ID が 2001〜4000のレコードを
colDataに追加(Collectで追記)
こうすることで、4000件のデータが colData に溜まります。さらに必要なら:
Collect(
colData,
Filter(データソース, ID > 4000 && ID <= 6000)
);
こんな感じで、6000件、8000件…と増やしていけます。
ただし、この方法には注意点がある
利点:
- 複雑な処理でも対応できる(委任非対応関数を使える)
- 取得データ数に上限がない(理論上)
欠点:
- 処理の流れが複雑になり、バグが増えやすい
- 何度もデータベースにアクセスするため、通信量が増える
- コレクションはメモリに溜められるため、デバイスのメモリが圧迫される
- スマートフォンで大量データを扱うと「メモリ不足」で落ちる可能性がある
実務では、よほどのことがない限りこの方法は使わず、後述する「4-3」「4-4」の方が安全です。
4-3. データソース側で絞り込み(実務向け)
「PowerAppsで複雑な処理をするのではなく、データソース側で予め準備する」という考え方です。
例えば、SharePointの場合:
- 「Active案件」というビューを作成し、そこには「Status = Active」のレコードだけを表示
- PowerAppsからは、このビューを参照する
Filter(
'案件リスト_Active案件ビュー',
Region = "東京"
)
最初から「Activeなレコード」だけが入ったビューを使えば、PowerApps側の処理は軽くなります。
さらに効果的な設計:複数の小さなビューに分割
1つのテーブルに10000件のレコードがあるなら:
- 「案件_2024年」(1000件)
- 「案件_2023年」(3000件)
- 「案件_2022年以前」(6000件)
こんな感じで複数のビューに分けてしまえば、それぞれが数千件以下になるため、2000件制限の問題を根本的に回避できます。
私はこの方法を推奨しています。理由は:
- PowerAppsのコードがシンプルになる
- バグが減る
- パフォーマンスが安定する
- SharePoint側も「年度別」などカテゴリ化されるため、データ管理がしやすくなる
4-4. Dataverseへの移行(長期的な解決策)
SharePointの2000件問題に悩まされ続けるなら、思い切ってDataverseに移行するのも選択肢です。
Dataverseはマイクロソフトが「PowerAppsと統合する前提で設計した」データベースです。SharePointと比べると:
- Delegation対応関数が多い:複雑な処理でも委任対応になることが多い
- テーブル定義が柔軟:リレーション、ルックアップ、フォーマット設定などが細かく指定できる
- セキュリティが堅牢:SharePointより行レベルセキュリティ(RLS)を細かく制御できる
- 大容量対応:100万件を超えるレコードでも安定
ただし、Dataverseにも制約があります:
- ライセンスコストがかかる:容量に応じて月額課金
- 移行が手間:SharePointから大量データをコピーする処理が必要
- 学習コストがある:SharePointより仕様が複雑
「1000件程度なら4-3で対応」「5000件以上でDataverseへの移行を検討」くらいの感覚で良いでしょう。



「Dataverseって聞いたことあるけど、けっこう高いんですよね?」



「そうだね。だからSharePointで対応できるなら、そっちを優先する。移行は段階的に検討するくらいの気持ちで」
5. よくあるつまずきポイント
「テストでは動いてたのに、本番で検索がおかしい」
最もよくある悲劇です。開発時に100件のテストデータで確認→本番で5000件のリアルデータを入れたら、突然検索結果がおかしくなる。
理由:委任非対応の関数を使っていた場合、テストデータ(100件)では2000件制限に引っかからないため、気づかないままです。
対策:開発時から「本番データ規模」を意識し、テストデータを5000件以上用意してテストする。
「Filterを使ったのに、やっぱり出てこない件数がある」
Filter関数を使ったから安心…と思ったら、実は非委任条件を組み合わせていた。
Filter(
'顧客リスト',
Status = "Active" && Mid(Title, 2, 1) = "A"
)
このコードでは、Mid(Title, 2, 1) が委任非対応のため、全体が非委任扱いになり、最初の2000件の範囲内でしか検索されません。
対策:委任対応関数だけを組み合わせるか、複数のFilter層に分ける。
// 委任対応の絞り込みを先に
Filter(
Filter(
'顧客リスト',
Status = "Active"
),
// その後、アプリ側で非対応関数を使う
Mid(Title, 2, 1) = "A"
)
先にStatus で絞り込んで少数に減らしてから、Mid関数を適用すれば、被害を最小限にできます。
「スマートフォンで大量データを取得したら落ちた」
4-2の「データ分割取得」でコレクションを大きくしすぎた場合によく起こります。
コレクションはメモリに溜められるため、5000件のレコード(各10フィールド)を溜めようとすると、スマートフォンのメモリを圧迫します。
対策:PowerAppsアプリは「必要なデータだけ、その時だけ」という設計を心がけ、コレクションの肥大化を避ける。
6. 実務での使い分けガイド
データ件数が500件未満の場合
→ 正直なところ、あまり気にしなくてOK。委任対応関数を使えば十分です。
データ件数が500件〜2000件の場合
→ 委任対応関数を意識する。複雑な処理が必要なら4-3(ビューで絞り込み)を検討。
データ件数が2000件〜5000件の場合
→ ビューで分割(4-3)が必須。「最初の2000件」という制限が現実味を持ってくる範囲です。
データ件数が5000件を超える場合
→ 4-3(ビュー分割)で対応するか、4-4(Dataverse移行)を真剣に検討。SharePointだけでは限界を感じ始める数字です。
7. 2000件問題が起きているか判定する方法
「あ、これ2000件問題かな?」と疑う時の確認方法:
- 検索結果の件数がおかしい(「全体1000件のはず」が「検索結果500件」など)
- 同じ検索でも「時によって結果が変わる」(キャッシュの影響)
- 特定のレコードが「検索に引っかからない」のに「手動スクロールすると見つかる」
こんな症状が出たら、十中八九、2000件制限です。
確認コード:
// 取得できているレコード件数を表示
CountRows(Filter('テーブル', Status = "Active"))
// 全体のレコード件数を表示(要注意:これ自体が2000件制限を受ける)
CountRows('テーブル')
最後のCountRows結果が2000件ちょうどなら、その先のレコードが見えていない状態です。
8. まとめ
- PowerAppsの2000件制限はDelegationの仕様(バグじゃない)
- 委任対応関数(Filter, Sort, Search等)を使えばほぼ回避可能
- 非対応関数を使う場合は「ビューで事前フィルター(4-3)」が実務的
- 5000件を超えるなら、DataverseやSQL Server への移行を検討
- 本番データ規模でのテストが重要。テストデータ100件では気づかない
最後に
2000件問題は、PowerAppsユーザーなら誰もが経験する関門です。気づかないまま本番運用が始まると、「なぜか検索結果がおかしい」という報告が来て、深夜にバグ対応…みたいなことになります。
最初から「委任」を意識して設計すれば、ほぼ全て回避できるので、開発段階で習慣づけておくと後が楽です。
💡 補足
Microsoft公式の「Delegationの概要」ページには、データソース別の対応関数リストが詳しく載っています。
→ 公式ドキュメント(Microsoft Learn)
特にSharePointとDataverseでは対応状況が異なるため、どちらを使うかで戦略も変わります。アプリ開発前に一度目を通しておくと、後々の頭痛が減ります。









コメント