本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
RLS 效能的最佳實務
以下最佳實務可確保 Amazon Redshift 在受 RLS 保護的資料表上獲得更好的效能。
運算子和函數的安全性
查詢受 RLS 保護的資料表時,使用某些運算子或函數可能會導致效能降低。Amazon Redshift 會將運算子和函數分類為在查詢受 RLS 保護的資料表時是安全或不安全的。當函數或運算子沒有因為輸入而有任何可觀察到的副作用時,函數或運算子就會被歸類為 RLS 安全。特別是,RLS 安全函數或運算子不能是以下其中一項:
-
輸出一個輸入值,或任何依賴於輸入值的值,無論有沒有錯誤訊息。
-
失敗或傳回依賴於輸入值的錯誤。
RLS 不安全的運算子包括:
-
算術運算子 — +、-、/、*、%。
-
文字運算子 — LIKE 和 SIMILAR TO。
-
轉換運算子。
-
UDF。
使用下列 SELECT 陳述式來檢查運算子和函數的安全性。
SELECT proname, proc_is_rls_safe(oid) FROM pg_proc;
在受 RLS 保護的資料表上規劃查詢時,Amazon Redshift 會對包含 RLS 不安全運算子和函數的使用者述詞的評估順序施加限制。查詢受 RLS 保護的資料表時,參照 RLS 不安全運算子或函數的查詢可能會導致效能降低。當 Amazon Redshift 無法將 RLS 不安全述詞推送至基底資料表掃描以利用排序索引鍵時,效能可能會大幅降低。為了獲得更好的效能,請避免使用利用排序索引鍵的 RLS 不安全述詞進行查詢。若要確認 Amazon Redshift 能夠向下推送運算子和函數,您可以將 EXPLAIN 陳述式與系統許可 EXPLACE RLS 結合使用。
結果快取
為了縮短查詢執行期並改善系統效能,Amazon Redshift 會將特定查詢類型的結果快取在領導者節點的記憶體中。
當未受保護資料表的所有條件皆成立,且下列所有條件皆成立時,Amazon Redshift 會在新查詢掃描受 RLS 保護的資料表時使用快取結果:
-
政策中的資料表或檢視尚未經過修改。
-
政策並未使用每次執行時都必須求值的函數,例如 GETDATE 或 CURRENT_USER。
為了獲得更好的效能,請避免使用不符合前述條件的政策述詞。
如需 Amazon Redshift 中結果快取的詳細資訊,請參閱 結果快取 。
複雜政策
為了獲得更好的效能,請避免在聯結多個資料表的子查詢中使用複雜的政策。