天天看點

View Merge 在安全控制上的變化,是 BUG 還是增強 ?

什麼是 View Merge

View Merge 是 12C 引入的新特性,也是一種優化手段。當查詢中引用了 View 或 inline view 時,優化器可以将主查詢中的查詢條件并入視圖當中去進行優化選擇以獲得代價最小的執行計劃。而如果視圖不屬于目前執行語句的使用者,View Merge 就可能存在潛在 OPTIMIZER_SECURE_VIEW_MERGING(預設是 TRUE)控制。當執行語句的使用者缺乏對視圖的 MERGE VIEW 權限,也沒有 MERGE ANY VIEW 權限時,是否允許優化器進行 View Merge 優化。

View Merge 問題重制

下面是一個安全控制導緻語句未能正确選擇索引的示範。首先建立相應的測試使用者(demo)并授予相應的權限。

SQL 代碼如下:

建立相應的測試函數。

建立測試使用者 demo 2,授予連接配接與 resource 的權限。

建立測試表 t1,t2 以及測試視圖 v1,v2。并往表中加入測試資料,同時授予 demo 通路的權限。

将 share pool 以前儲存的 SQL 執行計劃全部清空,釋放少數的共享池資源,保證 SQL 執行計劃的重新解析。

檢視執行計劃。

擷取正确的索引通路方式

在上面的查詢計劃中,未能正确選擇索引通路方式。當我們賦予使用者 MERGE VIEW 權限(或修改 OPTIMIZER_SECURE_VIEW_MERGING 為 FALSE)後,執行計劃擷取到了正确的索引通路方式。

授權的 SQL 代碼如下:

再對 share pool 中原有的執行計劃進行清空一次,便于重新解析。

具體的 SQL 代碼如下:

對上面語句再解析一遍,擷取該語句的執行計劃。

具體 SQL 代碼與執行計劃如下:

可以看到上面的執行計劃已經正确選擇索引通路方式了。

修改 optimizer_secure_view_merging 參數。

研究收獲

從上面的案例可以分析出 View Merge 是 12C 的一個新特性,因為這個安全控制導緻在查詢計劃中未能正确選擇索引通路方式,隻需要取消掉這個新特性或者将 MERGE ANY VIEW 授予使用者後就可以得到相應正确的索引通路方式。

原文釋出時間為:2018-03-13

本文作者:黃玮