查詢重寫

47328983發表於2013-01-07

物化檢視另外一個重要的特性為查詢重寫。查詢重寫的物件為普通查詢語句。在查詢語句中,Oracle總是搜尋from子句中所指定的資料來源(表或檢視)。查詢重寫是指,當進行查詢時,Oracle改寫查詢語句,搜尋其他資料來源,以在保證相同結果的情況下提高執行效率。而這個新的資料來源,則往往是物化檢視。

當然,使用查詢重寫,首先要啟用物化檢視的查詢重寫功能。例如,對於檢視mv_object_count,啟用查詢重寫功能的SQL語句如下所示。

SQL> alter materialized view mv_object_count enable query rewrite; 
 
Materialized view altered
alter materialized view mv_object_count用於修改檢視mv_object_count的屬性;enable query rewrite則用於啟用查詢重寫。
www.2cto.com

此時,查詢表tmp_user_objects中各種資料庫物件的個數,並利用PL/SQL Developer的執行計劃檢視執行過程細節,如圖11-14所示。

查詢重寫



圖11-14  查詢重寫功能的執行細節
從圖中可以看出,雖然在整個查詢語句中,並未使用物化檢視mv_object_count。但由於查詢重寫功能的存在,Oracle自動將資料查詢的資料來源指向了mv_object_count。此時,SQL語句執行的花費基數為2。

可以首先禁用查詢重寫功能,然後檢視相同SQL語句的執行計劃。

SQL> alter materialized view mv_object_count disable query rewrite; 
 
 
Materialized view altered
disable query rewrite用於禁用mv_object_count的查詢重寫。而查詢語句的執行計劃如圖11-15所示。

查詢重寫 
圖11-15  禁用查詢重寫後的執行計劃

在執行計劃中可以看出,Oracle使用了from子句指定的查詢物件--tmp_user_objects進行查詢。查詢語句的花費基數為4。

【示例11-24】 值得注意的是,並非與物化檢視的查詢定義完全相同的查詢語句,才可以享有查詢重寫功能所帶來的好處。

首先啟用mv_object_count的查詢重寫功能。

SQL> alter materialized view mv_object_count enable query rewrite; 
 
Materialized view altered
然後,通過利用SQL查詢獲得表tmp_object_count的記錄總數,並在PL/SQL Developer的執行計劃中檢視,如圖11-16所示。

查詢重寫
圖11-16  在執行計劃中檢視查詢重寫功能
Oracle在執行過程中,會發現利用物化檢視mv_object_count可以獲得相同的查詢結果,並且更有效率,因此便使用了查詢重寫。這一切換過程是Oracle自動完成的,使用者無須手動控制

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/241379/viewspace-752247/,如需轉載,請註明出處,否則將追究法律責任。

相關文章