PowerApps からは、簡単に SQL Server / SQL Database のデータの一覧を取得することができますが、大量のデータを検索する必要がある場合には、データベースに対して、どのようなクエリが実行されているかを把握しておくことが重要です。
PowerApps では「委任」という考え方があり、データ取得に対しての負荷 (データ/ネットワークアクセス)を最小限にするような仕組みが含まれています。
これらの機能によって、どのようなクエリが SQL Server に対して実行されているか確認してみます。
SQL Server に対してデータを取得した場合、次のようなクエリが実行されています。
execute sp_executesql N'select top 100 [$Ordered].[id], [$Ordered].[V1], [$Ordered].[V2], [$Ordered].[CreateDate] from [dbo].[T1] as [$Ordered] order by [$Ordered].[id]'
主キーでソートされた先頭 100 件が取得されるようになっており、一覧の初期データとしては、この結果が使用されています。
一覧で 100 件以上のデータが取得されないかというとそういことはなく、スクロールすると追加のデータ取得が行われます。
この際には、次のようなクエリが実行されています。
execute sp_executesql N'select top 100 [id], [V1], [V2], [CreateDate] from (select [$Ordered].[id], [$Ordered].[V1], [$Ordered].[V2], [$Ordered].[CreateDate], row_number() over (order by [$Ordered].[id]) as [$Row] from [dbo].[T1] as [$Ordered]) as [$Paged] where [$Paged].[$Row] between 101 and 200 order by [$Paged].[$Row]'
主キーを使用して付与された RowNumber を元にして、ページングが行われ、次の 100 件の取得が行われます。
実行プランとしては次のような感じですね。
この辺の、データ取得に対しての処理の軽減をデータソース側に任せられているのが、委任による効果かと。
SQL Server をデータソースとした場合に、委任の対象となる操作については、委任可能なデータ ソース に記載されています。
SQL Server の場合、委任可能な対象の操作 (関数) はかなり多く、SQL Server の各種構文を使用して処理の効率化が行われているのでしょうね。
以下のような画面構成となるように、Filter 関数 (If(Filtered,Filter(‘[dbo].[T1]’,id = Value(TextInput1.Text)),'[dbo].[T1]’)) を使用した検索機能を付けてみます。
(検索のアイコンをクリックした際に検索を実行させるため、ロジックについては Need a simple search button を参考にしています)
Filter 関数を使用した場合、次のようなクエリが実行されています。
execute sp_executesql N'select top 100 [$Ordered].[id], [$Ordered].[V1], [$Ordered].[V2], [$Ordered].[CreateDate] from ( select [_].[id], [_].[V1], [_].[V2], [_].[CreateDate] from [dbo].[T1] as [_] where [_].[id] = 11 ) as [$Ordered] order by [$Ordered].[id]'
Filter 関数を実行する際には、id でフィルターしているため、クエリについても、それを元に組み立てられていることが確認できますね。
DB を透過的に使用できる PowerApps のようなアプリケーションを使用する場合、どのようなクエリが実行されているかは意識しておいた方がよいかと思いますので、まずは、一覧 / 検索系についてざっくりと調べてみました。
[…] PowerApps から SQL Server / Database への一覧検索のクエリの動作を把握する(Microsoft MVP 小澤 真之さん) […]
PowerAppsを始めるために必要なリンク集まとめ - 吉田の備忘録
28 1月 19 at 01:22