Oracle查詢轉(zhuǎn)換初探-創(chuàng)新互聯(lián)

概述

Oracle查詢轉(zhuǎn)換器的作用是把原始sql重寫(xiě)為語(yǔ)義相同的語(yǔ)句,目的是為了獲得更高效的sql。
查詢轉(zhuǎn)換主要有四種技術(shù):子查詢展開(kāi),視圖合并,謂詞推入,星型轉(zhuǎn)換。
了解查詢轉(zhuǎn)換是掌握SQL優(yōu)化的基礎(chǔ),本文將對(duì)這四種技術(shù)做一些簡(jiǎn)單的介紹。

十載的三河網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整三河建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“三河網(wǎng)站設(shè)計(jì)”,“三河網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

子查詢展開(kāi)

子查詢展開(kāi)是指優(yōu)化器不再把子查詢作為獨(dú)立的單元處理,而是轉(zhuǎn)換成等價(jià)的join方式。轉(zhuǎn)換有兩種方式:一是將子查詢的結(jié)果集作為視圖,與外層表或視圖做join;二是將子查詢中的表或視圖拆出來(lái),與外層表或視圖做join。子查詢前包含以下條件可以被展開(kāi):

·        any(= any和in等價(jià))

·        all(<> all和not in等價(jià))

·        exists

·        not exists

single row條件(where后面接=,<,>,<=,>=等條件)
子查詢展開(kāi)的例子:
 Oracle 查詢轉(zhuǎn)換初探

最終轉(zhuǎn)換的語(yǔ)句:
 Oracle 查詢轉(zhuǎn)換初探

可以看到子查詢中的dept表被拆出來(lái),與外部查詢塊的emp表做inner join。可以這樣轉(zhuǎn)換的前提是dept表的deptno列是唯一鍵。如果deptno列不是唯一鍵,將做semi join(即所謂的半連接):
 Oracle 查詢轉(zhuǎn)換初探

如果不做子查詢展開(kāi),就會(huì)走filter類(lèi)型的執(zhí)行計(jì)劃,并且子查詢放在最后一步執(zhí)行,作用是對(duì)emp全表掃描之后的結(jié)果集進(jìn)行過(guò)濾:
 Oracle 查詢轉(zhuǎn)換初探
看一個(gè)子查詢結(jié)果集作為內(nèi)聯(lián)視圖與外層查詢塊做join的例子:
 Oracle 查詢轉(zhuǎn)換初探

執(zhí)行計(jì)劃仍然走了hash join semi,要使得轉(zhuǎn)換是等價(jià)的,必須先完成子查詢中departments和locations的join,結(jié)果集作為內(nèi)聯(lián)視圖VM_NSO_1,與外層查詢塊的結(jié)果集做join。

下面的執(zhí)行計(jì)劃中,子查詢的結(jié)果被作為nest loop的驅(qū)動(dòng)表,為保證結(jié)果集正確,需要對(duì)子查詢做hash unique去重。
 Oracle 查詢轉(zhuǎn)換初探

如果滿足(不限于)下面的條件,子查詢展開(kāi)可能導(dǎo)致轉(zhuǎn)換不等價(jià),因此將不作展開(kāi):

·        where后面的連接符為=all或者<> any

·        exists后面的子查詢中帶有rownum

·        exists后面的子查詢中帶有having子句,cube子句或者rollup子句

例如下面的例子:
 Oracle 查詢轉(zhuǎn)換初探

視圖合并

視圖合并是指對(duì)包含視圖的查詢做出轉(zhuǎn)換,使查詢只包含基表。視圖合并提供了更多的訪問(wèn)路徑和join的可能性。也就是說(shuō),不做視圖合并的執(zhí)行計(jì)劃包含在做了視圖合并的執(zhí)行計(jì)劃中。下面的例子可以幫助理解這句話:
 Oracle 查詢轉(zhuǎn)換初探

如果不做視圖合并,執(zhí)行計(jì)劃如下:
 Oracle 查詢轉(zhuǎn)換初探

可以看到不對(duì)emp100做視圖合并,執(zhí)行計(jì)劃中出現(xiàn)view字樣,name列對(duì)應(yīng)的就是視圖名emp100。
第二個(gè)執(zhí)行計(jì)劃除了多了view的一行,訪問(wèn)路徑和成本是和第一個(gè)相同的。
如果視圖定義中包含下列內(nèi)容,將不能做視圖合并:

·        集合操作符(UNION,UNION ALL,INTERSECT,MINUS)

·        connect by子句

·        rownum偽列
做這些限制是為了防止視圖合并之后得到錯(cuò)誤的結(jié)果集。
不能視圖合并的例子:
 Oracle 查詢轉(zhuǎn)換初探

復(fù)雜視圖合并

復(fù)雜視圖合并技術(shù)允許對(duì)包含gourp by或者distinct的視圖做展開(kāi)。

 Oracle 查詢轉(zhuǎn)換初探

_COMPLEX_VIEW_MERGING參數(shù)控制是否激活復(fù)雜視圖合并,在9i之后默認(rèn)為true,同時(shí)受OPTIMIZER_FEATURES_ENABLE參數(shù)控制:
 Oracle 查詢轉(zhuǎn)換初探

外連接視圖合并

使用了外連接的sql中,視圖合并需要滿足下列條件之一:

·        視圖為外連接的驅(qū)動(dòng)表

·        視圖的定義只包含單表
下例中視圖v1包含兩張基表,在做外連接的驅(qū)動(dòng)表時(shí)發(fā)生視圖合并,做被驅(qū)動(dòng)表則沒(méi)有。
 Oracle 查詢轉(zhuǎn)換初探  Oracle 查詢轉(zhuǎn)換初探

謂詞推入

優(yōu)化器在處理不能合并的視圖時(shí),可以選擇將外部查詢的謂詞推入該視圖的查詢塊,或者將視圖中的謂詞拉出到主查詢。這樣更早的處理視圖的結(jié)果集,有可能會(huì)減小后續(xù)步驟操作所需的成本。
謂詞推入到視圖內(nèi)部的例子:
 Oracle 查詢轉(zhuǎn)換初探

注意到執(zhí)行計(jì)劃中條件EMPLOYEE_ID<205被推入到視圖內(nèi)部,將兩張基表各過(guò)濾一次,然后對(duì)結(jié)果集做union。
兩表關(guān)聯(lián)時(shí),連接條件也可以做推入,先來(lái)看不做謂詞推入的執(zhí)行計(jì)劃: Oracle 查詢轉(zhuǎn)換初探

執(zhí)行計(jì)劃中emp13作為驅(qū)動(dòng)表與departments表做nest loop,我們使用hint強(qiáng)制發(fā)生謂詞推入:
 Oracle 查詢轉(zhuǎn)換初探

可以看到執(zhí)行計(jì)劃中出現(xiàn)PUSHED PREDICATE字樣,條件e.department_id=d.department_id被轉(zhuǎn)換成等值條件對(duì)employees表做過(guò)濾。join的謂詞推入往往產(chǎn)生nest loop的執(zhí)行計(jì)劃(驅(qū)動(dòng)表的每一行驅(qū)動(dòng)被驅(qū)動(dòng)表,來(lái)做謂詞的過(guò)濾)。如果是大數(shù)據(jù)集的sql,可以使用hint no_push_pred或者設(shè)置參數(shù)_push_join_predicate為false禁止謂詞推入。

星型轉(zhuǎn)換

星型轉(zhuǎn)換為提高星型查詢的效率發(fā)生,在原有條件基礎(chǔ)上會(huì)產(chǎn)生新的子查詢對(duì)事實(shí)表做過(guò)濾,然后通過(guò)對(duì)事實(shí)表相應(yīng)連接列的位圖索引做位圖操作,達(dá)到過(guò)濾事實(shí)表結(jié)果集的目的。
是否開(kāi)啟星型轉(zhuǎn)換受參數(shù)star_transformation_enabled控制,可以設(shè)置為:
true:優(yōu)化器將考慮基于成本的星型查詢轉(zhuǎn)換;
false:禁止星型轉(zhuǎn)換;
temp_disable:優(yōu)化器將考慮基于成本的星型查詢轉(zhuǎn)換,但是轉(zhuǎn)換中不會(huì)使用臨時(shí)表。
首先看一下星型轉(zhuǎn)換的例子:

 Oracle 查詢轉(zhuǎn)換初探  Oracle 查詢轉(zhuǎn)換初探

注意到執(zhí)行計(jì)劃首先對(duì)各個(gè)維度表過(guò)濾出結(jié)果集,然后訪問(wèn)sales表連接列上的索引,做bitmap and操作之后,回表訪問(wèn)數(shù)據(jù)。事實(shí)上整個(gè)過(guò)程類(lèi)似于將查詢轉(zhuǎn)換為如下等價(jià)sql:

 Oracle 查詢轉(zhuǎn)換初探

下面看一下star_transformation_enabled參數(shù)設(shè)置為true的結(jié)果:

 Oracle 查詢轉(zhuǎn)換初探
 Oracle 查詢轉(zhuǎn)換初探
 Oracle 查詢轉(zhuǎn)換初探
 Oracle 查詢轉(zhuǎn)換初探

注意到執(zhí)行計(jì)劃中先對(duì)customers根據(jù)過(guò)濾條件cu.country_id =52789得到臨時(shí)表SYS_TEMP_0FD9D6601_11F1D1,后續(xù)步驟中每次需要訪問(wèn)customers表時(shí)則由臨時(shí)表來(lái)替換,這也是為了總共減少所訪問(wèn)的數(shù)據(jù)量所考慮。
星型轉(zhuǎn)換同樣有一些限制條件,本文暫不討論。

以上是對(duì)四類(lèi)查詢轉(zhuǎn)換概念性的描述,對(duì)于具體的應(yīng)用場(chǎng)景中的SQL要具體分析如何利用這些技術(shù)。查詢轉(zhuǎn)換還有諸如子查詢合并,連接因式分解,表擴(kuò)展,表裁剪,物化視圖重寫(xiě)等技術(shù)。有機(jī)會(huì)將再寫(xiě)文章介紹,或者有興趣的同學(xué)自行研究。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)cdcxhl.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

當(dāng)前名稱:Oracle查詢轉(zhuǎn)換初探-創(chuàng)新互聯(lián)
新聞來(lái)源:http://muchs.cn/article46/dspohg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動(dòng)態(tài)網(wǎng)站、外貿(mào)建站、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站營(yíng)銷(xiāo)定制開(kāi)發(fā)、小程序開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)