行レベルセキュリティ(以下RLS)のレスポンスを向上させる手法を検討しております。
改善したい点は、ダッシュボードでのフィルター操作を行った場合RLSフィルターを足した為レスポンスが遅くなってしまったので、出来る限り早くしたいというのが目的です。
現状試していることを記載させていただきます。
「トランザクションデータ・テーブル」と「資格テーブル」をリレーションシップ結合
→資格テーブルのカラム構成は、「ユーザ」、「会社コード」の2カラム。
ユーザが閲覧可能なレコードを会社コードで制御。
if username() = [ユーザ] then "ok" else "non" end 左記の計算フィールドを使用してフィルターに使用。
ユーザ数は147
会社コード数は47
1ユーザが閲覧可能な会社コード数は1〜47
現状各ユーザが閲覧可能予定な最大数でカウントすると、資格テーブルは約2600レコードとなります。
トランのレコード数は約29万レコードです。間を置かず100万レコードにはなる見込みです。
・ライブ接続にて設定
接続方法を抽出にして試してもみましたが、他に関数を工夫することで早くなったりはしますでしょうか?
username()をismemberof()やcontains()などに変更するなど。
自分で調べたところ、データ接続をライブから抽出に変更した場合改善が見られるかと思いましたが、体感では少し早くなったかな?という感触でした。
他に変更すべき項目に関して、知見をお持ちであればご教示頂けますと大変助かります。
私も同じく、Rawデータ×̻資格データ(1対1)でリレーションし、RLSを実装しておりました
同じく、Rawデータに接続可能な資格データn数分レコードが増加し、判定処理に時間がかかるようになりました
対処方法としては、以下を実装したところ、速度改善が見られました
1.資格レコードを「,」(カンマ区切り)で接続可能ユーザーを結合して1カラムに格納し、Rawデータと(1対n)でリレーションする
2.フィルター判定で、contains()で判定する
3.データソースフィルターで上記判定を追加する
お役に立てるかどうかわかりませんが、参考になれば幸いです。