Oracle提高SQL執(zhí)行效率的3種方法
更新時(shí)間:2013年09月21日 15:24:23 作者:
Oracle提供了多種方法在執(zhí)行帶有大量執(zhí)行計(jì)劃的復(fù)雜查詢時(shí)剖析過(guò)程會(huì)拖累系統(tǒng)的性能,感興趣的朋友可以了解下
Oracle提供了多種方法用于減少花在剖析Oracle SQL表達(dá)式上的時(shí)間,在執(zhí)行帶有大量執(zhí)行計(jì)劃的復(fù)雜查詢時(shí)剖析過(guò)程會(huì)拖累系統(tǒng)的性能。現(xiàn)在我們來(lái)簡(jiǎn)要地看看這些方法中的幾種。
1、使用ordered提示
Oracle必須花費(fèi)大量的時(shí)間來(lái)剖析多表格的合并,用以確定表格合并的最佳順序。如果SQL表達(dá)式涉及七個(gè)乃至更多的表格合并,那么有時(shí)就會(huì)需要超過(guò)30分鐘的時(shí)間來(lái)剖析,因?yàn)镺racle必須評(píng)估表格合并所有可能的順序。八個(gè)表格就會(huì)有40,000多種順序。Ordered這個(gè)提示(hint)和其他的提示一起使用能夠產(chǎn)生合適的合并順序。
Ordered這個(gè)提示會(huì)要求列在SQL表達(dá)式FROM字句里的表格按照指定的順序進(jìn)行合并,F(xiàn)ROM字句里的第一個(gè)表格會(huì)指定驅(qū)動(dòng)表格(driving table)。驅(qū)動(dòng)表格應(yīng)該是返回最小行數(shù)的表格。使用ordered提示會(huì)跳過(guò)非常耗時(shí)和耗資源的剖析操作,并加快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里是一個(gè)復(fù)雜查詢的例子,這個(gè)查詢被強(qiáng)制進(jìn)行一個(gè)嵌套循環(huán),從而與對(duì)emp表格進(jìn)行的并行查詢合并。要注意,我已經(jīng)使用ordered提示來(lái)引導(dǎo)Oracle去按照WHERE子句所列出的順序來(lái)評(píng)估表格。
2、使用theordered_predicates
ordered_predicates提示在查詢的WHERE子句里指定的,并被用來(lái)指定布爾判斷(Boolean predicate)被評(píng)估的順序。在沒(méi)有ordered_predicates的情況下,Oracle會(huì)使用下面這些步驟來(lái)評(píng)估SQL判斷的順序:
子查詢的評(píng)估先于外層WHERE子句里的Boolean條件。
所有沒(méi)有內(nèi)置函數(shù)或者子查詢的布爾條件都按照其在WHERE子句里相反的順序進(jìn)行評(píng)估,即最后一條判斷最先被評(píng)估。
每個(gè)判斷都帶有內(nèi)置函數(shù)的布爾判斷都依據(jù)其預(yù)計(jì)的評(píng)估值按遞增排列。
你可以使用ordered_predicates提示來(lái)強(qiáng)制取代這些缺省的評(píng)估規(guī)則,那么你WHERE子句里的項(xiàng)目就會(huì)按照其在查詢里出現(xiàn)的順序被評(píng)估。在查詢的WHERE子句里使用了PL/SQL函數(shù)的情況下,通常會(huì)使用ordered_predicates提示。如果你知道限制最多的判斷并且希望Oracle最先評(píng)估這些判斷的時(shí)候,在這種情況下,它也是非常有用的。用法提示:你不能使用ordered_predicates提示來(lái)保存對(duì)索引鍵進(jìn)行判斷評(píng)估的順序。
3、限制表格合并評(píng)估的數(shù)量
提高SQL剖析性能的最后一種方法是強(qiáng)制取代Oracle的一個(gè)參數(shù),這個(gè)參數(shù)控制著在評(píng)估一個(gè)查詢的時(shí)候,基于消耗的優(yōu)化器所評(píng)估的可能合并數(shù)量。
optimizer_search_limit這個(gè)參數(shù)會(huì)指定表格合并組合的最大數(shù)量,后者將會(huì)在Oracle試圖確定合并多表格最佳方式的時(shí)候被評(píng)估。這個(gè)參數(shù)有助于防止優(yōu)化器花更多的時(shí)間來(lái)評(píng)估可能的合并順序,而不是把時(shí)間花在尋找最佳合并順序上。optimizer_search_limit還控制著用于調(diào)用star join提示的闕值,當(dāng)查詢里的表格數(shù)量低于optimizer_search_limit(其缺省的值是5)的時(shí)候,star提示就會(huì)被光顧。
1、使用ordered提示
Oracle必須花費(fèi)大量的時(shí)間來(lái)剖析多表格的合并,用以確定表格合并的最佳順序。如果SQL表達(dá)式涉及七個(gè)乃至更多的表格合并,那么有時(shí)就會(huì)需要超過(guò)30分鐘的時(shí)間來(lái)剖析,因?yàn)镺racle必須評(píng)估表格合并所有可能的順序。八個(gè)表格就會(huì)有40,000多種順序。Ordered這個(gè)提示(hint)和其他的提示一起使用能夠產(chǎn)生合適的合并順序。
Ordered這個(gè)提示會(huì)要求列在SQL表達(dá)式FROM字句里的表格按照指定的順序進(jìn)行合并,F(xiàn)ROM字句里的第一個(gè)表格會(huì)指定驅(qū)動(dòng)表格(driving table)。驅(qū)動(dòng)表格應(yīng)該是返回最小行數(shù)的表格。使用ordered提示會(huì)跳過(guò)非常耗時(shí)和耗資源的剖析操作,并加快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里是一個(gè)復(fù)雜查詢的例子,這個(gè)查詢被強(qiáng)制進(jìn)行一個(gè)嵌套循環(huán),從而與對(duì)emp表格進(jìn)行的并行查詢合并。要注意,我已經(jīng)使用ordered提示來(lái)引導(dǎo)Oracle去按照WHERE子句所列出的順序來(lái)評(píng)估表格。
2、使用theordered_predicates
ordered_predicates提示在查詢的WHERE子句里指定的,并被用來(lái)指定布爾判斷(Boolean predicate)被評(píng)估的順序。在沒(méi)有ordered_predicates的情況下,Oracle會(huì)使用下面這些步驟來(lái)評(píng)估SQL判斷的順序:
子查詢的評(píng)估先于外層WHERE子句里的Boolean條件。
所有沒(méi)有內(nèi)置函數(shù)或者子查詢的布爾條件都按照其在WHERE子句里相反的順序進(jìn)行評(píng)估,即最后一條判斷最先被評(píng)估。
每個(gè)判斷都帶有內(nèi)置函數(shù)的布爾判斷都依據(jù)其預(yù)計(jì)的評(píng)估值按遞增排列。
你可以使用ordered_predicates提示來(lái)強(qiáng)制取代這些缺省的評(píng)估規(guī)則,那么你WHERE子句里的項(xiàng)目就會(huì)按照其在查詢里出現(xiàn)的順序被評(píng)估。在查詢的WHERE子句里使用了PL/SQL函數(shù)的情況下,通常會(huì)使用ordered_predicates提示。如果你知道限制最多的判斷并且希望Oracle最先評(píng)估這些判斷的時(shí)候,在這種情況下,它也是非常有用的。用法提示:你不能使用ordered_predicates提示來(lái)保存對(duì)索引鍵進(jìn)行判斷評(píng)估的順序。
3、限制表格合并評(píng)估的數(shù)量
提高SQL剖析性能的最后一種方法是強(qiáng)制取代Oracle的一個(gè)參數(shù),這個(gè)參數(shù)控制著在評(píng)估一個(gè)查詢的時(shí)候,基于消耗的優(yōu)化器所評(píng)估的可能合并數(shù)量。
optimizer_search_limit這個(gè)參數(shù)會(huì)指定表格合并組合的最大數(shù)量,后者將會(huì)在Oracle試圖確定合并多表格最佳方式的時(shí)候被評(píng)估。這個(gè)參數(shù)有助于防止優(yōu)化器花更多的時(shí)間來(lái)評(píng)估可能的合并順序,而不是把時(shí)間花在尋找最佳合并順序上。optimizer_search_limit還控制著用于調(diào)用star join提示的闕值,當(dāng)查詢里的表格數(shù)量低于optimizer_search_limit(其缺省的值是5)的時(shí)候,star提示就會(huì)被光顧。
相關(guān)文章
Oracle計(jì)算時(shí)間差為毫秒的實(shí)現(xiàn)代碼
這里我是用分隔字符串單獨(dú)計(jì)算毫秒部分,如果有更好的辦法,請(qǐng)大家分享一下,下面是查詢時(shí)間差為毫秒的模板,需要的朋友可以參考下2017-03-03
Oracle中scott表結(jié)構(gòu)與簡(jiǎn)單查詢實(shí)例分析
這篇文章主要介紹了Oracle中scott表結(jié)構(gòu)與簡(jiǎn)單查詢,實(shí)例分析Oracle查詢的相關(guān)技巧,需要的朋友可以參考下2015-04-04
Oracle使用MyBatis中RowBounds實(shí)現(xiàn)分頁(yè)查詢功能
這篇文章主要介紹了Oracle使用MyBatis中RowBounds實(shí)現(xiàn)分頁(yè)查詢 ,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-07-07
Oracle存儲(chǔ)過(guò)程新手入門教程(附學(xué)習(xí)用例)
存儲(chǔ)過(guò)程就是作為可執(zhí)行對(duì)象存放在數(shù)據(jù)庫(kù)中的一個(gè)或多個(gè)SQL命令,下面這篇文章主要給大家介紹了關(guān)于Oracle存儲(chǔ)過(guò)程新手入門教程的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-03-03
Oracle實(shí)現(xiàn)動(dòng)態(tài)SQL的拼裝要領(lǐng)
這篇文章主要介紹了Oracle實(shí)現(xiàn)動(dòng)態(tài)SQL的拼裝要領(lǐng),對(duì)于Oracle的進(jìn)一步學(xué)習(xí)來(lái)說(shuō)非常重要,需要的朋友可以參考下2014-07-07
Oracle系列學(xué)習(xí)之Oracle正則表達(dá)式詳解
正則表達(dá)式應(yīng)用廣泛,在數(shù)據(jù)庫(kù)中也有很大的應(yīng)用空間,這篇文章主要給大家介紹了關(guān)于Oracle系列學(xué)習(xí)之Oracle正則表達(dá)式的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
Oracle創(chuàng)建只讀賬號(hào)的詳細(xì)步驟
本文介紹了Oracle創(chuàng)建只讀賬號(hào)的詳細(xì)步驟,有此需求的朋友可以參考下過(guò)程2021-06-06
Oracle批量導(dǎo)入文本文件快速的方法(sqlldr實(shí)現(xiàn))
批量導(dǎo)入文本文件在Oracle數(shù)據(jù)庫(kù)操作中經(jīng)常遇見,今天給大家介紹一種通過(guò)sqlldr批處理實(shí)現(xiàn)的方法,有需要的朋友們可以參考借鑒,下面來(lái)一起看看。2016-09-09

