大量のデータを読み込むと、アプリのパフォーマンスが低下し、「メモリ不足」のエラーが発生する可能性が高くなります。セキュリティ フィルタを設定すると、ユーザーに代わって AppSheet が読み込むデータの量を削減できます。
セキュリティ フィルタはテーブル内の各行に対して評価される式であり、結果を真(true)または偽(false)で返します。その行がアプリに含まれていれば true が、含まれていなければ false が返されます。セキュリティ フィルタは主にセキュリティ機能として設計されているものですが、スケーラビリティ機能として使用することも可能です。
通常セキュリティ フィルタは、行のデータとユーザー特有の一部のデータ(ユーザーのメールアドレスや一部のユーザー設定の値など)を照合します。たとえば、アプリのユーザーのメールアドレスが、特定の列にそのメールアドレスの値を持つレコードのみを取得するために使用される可能性があります。
セキュリティ フィルタを使ってスケーリングを行う方法について詳しくは、以下のセクションで説明します。
- セキュリティ フィルタとテーブル スライスの違い
- スプレッドシート データに対するセキュリティ フィルタ
- データベース データに対するセキュリティ フィルタ
- データベース データに対する効率的なセキュリティ フィルタの定義
- AppSheet データベースでのセキュリティ フィルタ
セキュリティ フィルタとテーブル スライスの違い
以下の動画で説明されているとおり、セキュリティ フィルタの機能はテーブル スライスのものとは異なります。スライスはデータをすべてクライアントにダウンロードしてから、そのデータをフィルタします。セキュリティ フィルタは式の条件を満たすレコードのみを取得するため、クライアントにダウンロードされるコンテンツが制限されます。
Quick Tip Friday - Security Filters
スプレッドシート データに対するセキュリティ フィルタ
スプレッドシートのソースからデータを読み込む際、スプレッドシートまたはワークシート全体がクラウド バックエンドから取得された後でセキュリティ フィルタが適用されます。このため、同期プロセスのこの最初のステップに要する時間は短縮されません。ただし、ステップ 2(アプリへのデータ送信)に要する時間、およびステップ 3(データをアプリとともにローカルに保存)に要する時間とスペースは大幅に短縮できます。
データベース データに対するセキュリティ フィルタ
データベース ソースに対してセキュリティ フィルタを使用する際は、システムによってセキュリティ フィルタがデータベース クエリに変換される可能性があります。たとえば、基盤となるデータベース テーブルには 100 万行のレコードがあるものの、セキュリティ フィルタによって Email 列の値が mary@mydomain.com
であるレコードのみをテーブルに表示するように制限する場合、これを実行する方法は 2 つあります。
- データベースから 100 万行すべてを AppSheet のバックエンドに取り込み、フィルタを評価して条件に一致する 10 レコードのみを保持する。または、
- データベースにクエリ
SELECT * from MyTable where Email =mary@mydomain.com
を送信する
このクエリに一致する 10 レコードのみがデータベースから返されます。
明らかに、2 番目の方法のほうがはるかに効率的です。データベース システムには、このようなクエリを迅速に実行できるインデックスなどの技術が組み込まれています。セキュリティ フィルタを効率的なクエリにマッピングできれば、AppSheet は数百万のデータベース レコードの処理を行えるようスケーリングが可能です。
AppSheet は以下のデータベース プロバイダに対して、セキュリティ フィルタを SQL クエリとして送信します。
- AppSheet データベース
- Google BigQuery
- MySQL
- Microsoft SQL Server
- MariaDB
- Oracle
- Postgres
- Redshift
- Salesforce
データベース データに対する効率的なセキュリティ フィルタの定義
セキュリティ フィルタの効率性が高いのは、フィルタが単一の列と特定の値との単純な比較条件に簡約されている場合、または AND()
でそのような比較条件が結合されている場合です。これよりも条件が複雑になると、データセットが拡大するにつれてほぼ確実に効率性が低下します。
以下は、AppSheet が認識して SQL クエリにプッシュする単純な条件をまとめたものです。
[列] = 定数値
[列] < 定数値
[列] > 定数値
[列] <= 定数値
[列] >= 定数値
IN([列], {定数値 1, 定数値 2, ... 定数値 N})
AND(単純条件 1, 単純条件 2, ... 単純条件 N)
注:
- Salesforce をデータ提供元として使用している場合、
AND()
条件とIN()
条件は機能しません。 -
一般的に、効率性を図るためには、セキュリティ フィルタに複雑な
NOT()
やOR()
の式を入れないようにしてください。ただし、これらの式は Google BigQuery や AppSheet データベースに接続されたテーブルと互換性があります。
これ以外のほとんどの条件(NOT()
や OR()
の式など)は SQL クエリにプッシュされません。プラットフォームは部分的な条件をプッシュするよう努めます。次に例を示します。
-
AND([列 1] = 5, LEN(CONCATENATE([列 2], " file")) < 20)
- 2 つ目の条件は式にLEN(CONCATENATE([列 2], " file"))
が含まれているため単純条件ではありませんが、最初の条件は単純条件であるため、最初の条件のみが SQL クエリにプッシュされます。
重要なのは、式自体がより複雑であったとしても、実行直前に単純な形式に簡約できることが多いという点です。次に例を示します。
-
AND([列] = 5, USERROLE() = "Admin")
- 実行時、AppSheet はユーザーロールを把握しています。ユーザーが管理者で[列] = 5
の場合、この式はTRUE
(「すべての行を取得する」の意味)と評価されます。 -
IN([列], SELECT(AnotherTable[他の列], [Email 列] = USEREMAIL())) -
SELECT()
関数全体が実行時に定数リストとして評価されてから、このセキュリティ フィルタが実行されます。そのため、この式全体がIN([列], 値のリスト)
に簡約され、SQL クエリにプッシュできる状態となります。
一般的に、効率性を図るためには、セキュリティ フィルタに複雑な NOT()
や OR()
の式を入れないようにしてください。複雑な式がある場合、取得されるテーブルの列をそれらの式で使うことは避けるべきです。
AppSheet データベースでのセキュリティ フィルタ
AppSheet データベースを使用する AppSheet アプリは、セキュリティ フィルタを使用することで同期速度を大幅に向上させることができます。以下のセクションでは、AppSheet データベースに対する、パフォーマンスを最適化したセキュリティ フィルタの形式について説明します。
列フィルタの演算子
最適化される列フィルタでは、以下の演算子がサポートされます。
- テキスト型: =(等しい)と <>(等しくない)
- 数値型と時間型: =(等しい)、<>(等しくない)、<(より小さい)、>(より大きい)、<=(以下)、>=(以上)
最適化される列フィルタ
以下の列フィルタは、AppSheet データベースでのパフォーマンスが最適化されています。
Text
LongText
Name
Number
Decimal
Date
Datetime
Duration
Email
Percent
Phone
Price
Url
最適化される関数
AND()
、OR()
、NOT()
、IN()
の各関数を使用した多階層の式で最適化される列フィルタを使用します。
IN()
関数は LIST()
関数と一緒に使用できます。例: IN([column_name],LIST(_,_,_))
以下は、時間型およびテキスト型の列フィルタを使用して、OR()
、NOT()
、IN()
関数で最適化されたセキュリティ フィルタの例です。
OR([time_column]<>TIME("15:30"),NOT(IN([name_column],LIST("Jane Doe", "Adam"))))
最適化されない列の型
以下の列の型は、AppSheet データベースのセキュリティ フィルタ向けに最適化されておらず、同期速度の向上は見込めません。フィルタは正常に機能します。
Address
とLatLong
Enum
(Color、Progress など)Enumlist
Reference
RowId
Time
(部分的にサポート。「=」(等しい)以外のすべての演算子で使用可能)。Yes/No
セキュリティ フィルタの最適化に関する重要な注意事項
以下の表に、AppSheet データベースでのセキュリティ フィルタの最適化に関する重要な注意事項を示します。他の形式のセキュリティ フィルタも正しく評価されますが、同期時間のパフォーマンスの最適化という利点はありません。
型 | 必要な更新 |
Duration |
TIME() の値から "00:00:00" を減算します: [duration_column]=TIME("00:00:10") - "00:00:00" |
Number |
|
Percent |
小数点の前にゼロを付けます: [percent_column]=0.10 |
Phone |
フィルタの条件を引用符で囲んだ文字列として指定します: [phone_column]="+1231231234" |
Text |
Text 型の列でフィルタする場合は、テキスト リテラルの代わりに引用符なしの数字を使用しないでください。たとえば、フィルタの条件は IN([text_column],LIST(10,20)) ではなく、IN([text_column],LIST("10","20")) のように指定します。 |
Time |
TIME() 関数を使用します: [time_column]=TIME("03:30:00") |
|
AppSheet のアプリエディタで、列の型を Text に変更し、フィルタの条件を引用符で囲んで指定します: [url_column]="appsheet.com" |