Oracle提高SQL執(zhí)行效率的3種方法
更新時間:2013年09月21日 15:24:23 作者:
Oracle提供了多種方法在執(zhí)行帶有大量執(zhí)行計劃的復雜查詢時剖析過程會拖累系統(tǒng)的性能,感興趣的朋友可以了解下
Oracle提供了多種方法用于減少花在剖析Oracle SQL表達式上的時間,在執(zhí)行帶有大量執(zhí)行計劃的復雜查詢時剖析過程會拖累系統(tǒng)的性能?,F(xiàn)在我們來簡要地看看這些方法中的幾種。
1、使用ordered提示
Oracle必須花費大量的時間來剖析多表格的合并,用以確定表格合并的最佳順序。如果SQL表達式涉及七個乃至更多的表格合并,那么有時就會需要超過30分鐘的時間來剖析,因為Oracle必須評估表格合并所有可能的順序。八個表格就會有40,000多種順序。Ordered這個提示(hint)和其他的提示一起使用能夠產(chǎn)生合適的合并順序。
Ordered這個提示會要求列在SQL表達式FROM字句里的表格按照指定的順序進行合并,F(xiàn)ROM字句里的第一個表格會指定驅(qū)動表格(driving table)。驅(qū)動表格應該是返回最小行數(shù)的表格。使用ordered提示會跳過非常耗時和耗資源的剖析操作,并加快Oracle SQL的執(zhí)行。
Listing A如下:
以下是引用片段:
Listing A
select /*+ ordered use_nl(bonus)
parallel(e, 4) */ e.ename, hiredate, b.comm from emp e, bonus b
where e.ename = b.ename ;
Listing A里是一個復雜查詢的例子,這個查詢被強制進行一個嵌套循環(huán),從而與對emp表格進行的并行查詢合并。要注意,我已經(jīng)使用ordered提示來引導Oracle去按照WHERE子句所列出的順序來評估表格。
2、使用theordered_predicates
ordered_predicates提示在查詢的WHERE子句里指定的,并被用來指定布爾判斷(Boolean predicate)被評估的順序。在沒有ordered_predicates的情況下,Oracle會使用下面這些步驟來評估SQL判斷的順序:
子查詢的評估先于外層WHERE子句里的Boolean條件。
所有沒有內(nèi)置函數(shù)或者子查詢的布爾條件都按照其在WHERE子句里相反的順序進行評估,即最后一條判斷最先被評估。
每個判斷都帶有內(nèi)置函數(shù)的布爾判斷都依據(jù)其預計的評估值按遞增排列。
你可以使用ordered_predicates提示來強制取代這些缺省的評估規(guī)則,那么你WHERE子句里的項目就會按照其在查詢里出現(xiàn)的順序被評估。在查詢的WHERE子句里使用了PL/SQL函數(shù)的情況下,通常會使用ordered_predicates提示。如果你知道限制最多的判斷并且希望Oracle最先評估這些判斷的時候,在這種情況下,它也是非常有用的。用法提示:你不能使用ordered_predicates提示來保存對索引鍵進行判斷評估的順序。
3、限制表格合并評估的數(shù)量
提高SQL剖析性能的最后一種方法是強制取代Oracle的一個參數(shù),這個參數(shù)控制著在評估一個查詢的時候,基于消耗的優(yōu)化器所評估的可能合并數(shù)量。
optimizer_search_limit這個參數(shù)會指定表格合并組合的最大數(shù)量,后者將會在Oracle試圖確定合并多表格最佳方式的時候被評估。這個參數(shù)有助于防止優(yōu)化器花更多的時間來評估可能的合并順序,而不是把時間花在尋找最佳合并順序上。optimizer_search_limit還控制著用于調(diào)用star join提示的闕值,當查詢里的表格數(shù)量低于optimizer_search_limit(其缺省的值是5)的時候,star提示就會被光顧。
1、使用ordered提示
Oracle必須花費大量的時間來剖析多表格的合并,用以確定表格合并的最佳順序。如果SQL表達式涉及七個乃至更多的表格合并,那么有時就會需要超過30分鐘的時間來剖析,因為Oracle必須評估表格合并所有可能的順序。八個表格就會有40,000多種順序。Ordered這個提示(hint)和其他的提示一起使用能夠產(chǎn)生合適的合并順序。
Ordered這個提示會要求列在SQL表達式FROM字句里的表格按照指定的順序進行合并,F(xiàn)ROM字句里的第一個表格會指定驅(qū)動表格(driving table)。驅(qū)動表格應該是返回最小行數(shù)的表格。使用ordered提示會跳過非常耗時和耗資源的剖析操作,并加快Oracle SQL的執(zhí)行。
Listing A如下:
以下是引用片段:
Listing A
select /*+ ordered use_nl(bonus)
parallel(e, 4) */ e.ename, hiredate, b.comm from emp e, bonus b
where e.ename = b.ename ;
Listing A里是一個復雜查詢的例子,這個查詢被強制進行一個嵌套循環(huán),從而與對emp表格進行的并行查詢合并。要注意,我已經(jīng)使用ordered提示來引導Oracle去按照WHERE子句所列出的順序來評估表格。
2、使用theordered_predicates
ordered_predicates提示在查詢的WHERE子句里指定的,并被用來指定布爾判斷(Boolean predicate)被評估的順序。在沒有ordered_predicates的情況下,Oracle會使用下面這些步驟來評估SQL判斷的順序:
子查詢的評估先于外層WHERE子句里的Boolean條件。
所有沒有內(nèi)置函數(shù)或者子查詢的布爾條件都按照其在WHERE子句里相反的順序進行評估,即最后一條判斷最先被評估。
每個判斷都帶有內(nèi)置函數(shù)的布爾判斷都依據(jù)其預計的評估值按遞增排列。
你可以使用ordered_predicates提示來強制取代這些缺省的評估規(guī)則,那么你WHERE子句里的項目就會按照其在查詢里出現(xiàn)的順序被評估。在查詢的WHERE子句里使用了PL/SQL函數(shù)的情況下,通常會使用ordered_predicates提示。如果你知道限制最多的判斷并且希望Oracle最先評估這些判斷的時候,在這種情況下,它也是非常有用的。用法提示:你不能使用ordered_predicates提示來保存對索引鍵進行判斷評估的順序。
3、限制表格合并評估的數(shù)量
提高SQL剖析性能的最后一種方法是強制取代Oracle的一個參數(shù),這個參數(shù)控制著在評估一個查詢的時候,基于消耗的優(yōu)化器所評估的可能合并數(shù)量。
optimizer_search_limit這個參數(shù)會指定表格合并組合的最大數(shù)量,后者將會在Oracle試圖確定合并多表格最佳方式的時候被評估。這個參數(shù)有助于防止優(yōu)化器花更多的時間來評估可能的合并順序,而不是把時間花在尋找最佳合并順序上。optimizer_search_limit還控制著用于調(diào)用star join提示的闕值,當查詢里的表格數(shù)量低于optimizer_search_limit(其缺省的值是5)的時候,star提示就會被光顧。
相關文章
Linux?CentOS7安裝Oracle11g的超完美新手教程
Linux下安裝Oracle相比windows安裝Oracle要顯得繁瑣很多,繁瑣在前期準備工作很多,下面這篇文章主要給大家介紹了關于Linux?CentOS7安裝Oracle11g的超完美教程,需要的朋友可以參考下2022-07-07winserver 2012R2 安裝oracle及創(chuàng)建表流程(推薦)
這篇文章主要介紹了winserver 2012R2 安裝oracle及創(chuàng)建表流程,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-06-06MSSQL與Oracle數(shù)據(jù)庫事務隔離級別與鎖機制對比
事務隔離級別是并發(fā)控制的整體解決方案,其實際上是綜合利用各種類型的鎖和行版本控制,來解決并發(fā)問題。鎖是數(shù)據(jù)庫并發(fā)控制的內(nèi)部機制,是基礎。對用戶來說,只有當事務隔離級別無法解決一些并發(fā)問題和需求時,才有必要在語句中手動設置鎖。2014-08-08Oracle 12CR2查詢轉(zhuǎn)換教程之表擴展詳解
Oracle 12cR2版本已經(jīng)發(fā)布有一段時間,下面這篇文章主要給大家介紹了關于Oracle 12CR2查詢轉(zhuǎn)換教程之表擴展的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學習學習吧2018-11-11