版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、ORACLE數(shù)據(jù)庫SQL優(yōu)化培訓(xùn)軟件一部2021年9月培訓(xùn)內(nèi)容 主要引見與SQL調(diào)整有關(guān)的內(nèi)容,內(nèi)容涉及多個(gè)方面: 1.SQL語句執(zhí)行的過程 2.ORACLE優(yōu)化器 3.表之間的關(guān)聯(lián) 4.如何得到SQL執(zhí)行方案 5.如何分析執(zhí)行方案等內(nèi)容.背景知識(shí) 在調(diào)整之前我們需求了解一些背景知識(shí),只需知道這些背景知識(shí),我們才干更好的調(diào)整sql語句 SQL語句處置的根本過程,主要包括: 查詢語句處置 DML語句處置(insert, update, delete) DDL 語句處置(create . , drop . , alter . , ) 事務(wù)控制(commit, rollback) .優(yōu)化原理 作為關(guān)
2、系數(shù)據(jù)庫管理系統(tǒng),要處理的一個(gè)重要問題就是如何提高查詢的效率,即所謂的查詢優(yōu)化。為什么會(huì)出現(xiàn)這個(gè)問題呢?我們知道SQL言語是一種非過程化的言語,即它只需用戶指出“做什么,而不需指出“如何做,這樣對(duì)用戶來說確實(shí)方便了,但系統(tǒng)的負(fù)擔(dān)就重了。系統(tǒng)要完成“如何做,就必然有個(gè)選擇、比較、權(quán)衡的過程,即如何選擇最正確的存取途徑和實(shí)現(xiàn)算法。.什么是優(yōu)化器 查詢優(yōu)化對(duì)提高查詢效率是至關(guān)重要的,在任何一個(gè)商品化的RDBMS中,都必需有一個(gè)專門擔(dān)任查詢語句優(yōu)化的程序,稱為優(yōu)化器;是SQL之前分析語句的工具 。 優(yōu)化器的優(yōu)化方式: 基于規(guī)那么RBO: 優(yōu)化器遵照Oracle內(nèi)部預(yù)定的規(guī)那么 基于代價(jià)CBO: 根據(jù)語
3、句執(zhí)行的代價(jià),主要指對(duì)CPU和內(nèi)存的占用。優(yōu)化器在判別能否運(yùn)用CBO時(shí),要參照表和索引的統(tǒng)計(jì)信息。統(tǒng)計(jì)信息要在對(duì)表做analyze后才會(huì)有。 .優(yōu)化器的優(yōu)化方式 Oracle優(yōu)化器的優(yōu)化方式主要有四種: Rule:基于規(guī)那么; Choose:默許方式。根據(jù)表或索引的統(tǒng)計(jì)信息,假設(shè)有統(tǒng)計(jì)信息,那么運(yùn)用CBO方式;假設(shè)沒有統(tǒng)計(jì)信息,相應(yīng)列有索引,那么運(yùn)用RBO方式。 First rows:與Choose類似。不同的是假設(shè)表有統(tǒng)計(jì)信息,它將以最快的方式前往查詢的前幾行,以獲得最正確呼應(yīng)時(shí)間。 All rows:即完全基于Cost的方式。當(dāng)一個(gè)表有統(tǒng)計(jì)信息時(shí),以最快方式前往表一切行,以獲得最大吞吐量。
4、沒有統(tǒng)計(jì)信息那么運(yùn)用RBO方式。 .優(yōu)化方式的選擇指定優(yōu)化方式CBO/RBO優(yōu)化方式為默許選擇方式 Choose 情況下,怎樣樣才干知道SQL是基于代價(jià)CBO查詢,還是基于規(guī)那么RBO查詢。COST無值闡明運(yùn)用基于規(guī)那么RBO方式COST有值闡明運(yùn)用基于代價(jià)CBO方式.COST 闡明什么COST是什么? cost屬性的值是一個(gè)在oracle內(nèi)部用來比較各個(gè)執(zhí)行方案所耗費(fèi)(IOCPU)的代價(jià)的值,從而使優(yōu)化器可以選擇最好的執(zhí)行方案。不同語句的cost值不具有可比性,只能對(duì)同一個(gè)語句的不同執(zhí)行方案的cost值進(jìn)展比較,越小越好。.程序員的要求 ORACLE系統(tǒng)中的優(yōu)化器做的比較簡單,因此這就要求用
5、戶要有較強(qiáng)的優(yōu)化認(rèn)識(shí)。程序員要想獲得較優(yōu)的查詢性能,就必需對(duì)表的大小、索引的選擇率以及更新和存取操作的頻度等統(tǒng)計(jì)信息了如指掌。ORACLE優(yōu)化對(duì)程序員的要求:.優(yōu)化原理優(yōu)化通常有兩方面的內(nèi)容,即邏輯優(yōu)化和物理優(yōu)化。邏輯優(yōu)化包括: 選擇運(yùn)算盡早執(zhí)行 投影與選擇運(yùn)算同時(shí)進(jìn)展,以防止反復(fù)掃描文件 公共子表達(dá)式預(yù)處置 謂詞的簡化處置 表達(dá)式的恒等變換等 邏輯優(yōu)化往往是一種等價(jià)變換,它的優(yōu)化會(huì)對(duì)查詢帶來絕對(duì)益處,這部分優(yōu)化與用戶無關(guān),完全由優(yōu)化器擔(dān)任,故我們不關(guān)懷這部分優(yōu)化。.優(yōu)化原理物理優(yōu)化包括: 選擇有效的存取途徑 選擇適宜的操作序列 提供較優(yōu)的操作實(shí)現(xiàn)方法 物理優(yōu)化那么往往是對(duì)動(dòng)態(tài)情況的一種權(quán)衡。
6、物理優(yōu)化目前采用的方法有:啟發(fā)式的、基于統(tǒng)計(jì)信息的。智能式的ORACLE的優(yōu)化器是啟發(fā)式的,它的中心是一些從閱歷中得到的準(zhǔn)那么,它的益處是系統(tǒng)代價(jià)小,但不利的方面是用戶的負(fù)擔(dān)太重。.什么是索引索引 運(yùn)用索引可快速訪問數(shù)據(jù)庫表中的特定信息。索引是對(duì)數(shù)據(jù)庫表中一列或多列的值進(jìn)展排序的一種構(gòu)造,提供指向存儲(chǔ)在表的指定列中的數(shù)據(jù)值的指針,然后根據(jù)指定的排序順序?qū)@些指針排序。索引列 可以基于數(shù)據(jù)庫表中的單列或多列創(chuàng)建索引。多列索引可以區(qū)分其中一列能夠有一樣值的行。索引類型 A獨(dú)一索引 獨(dú)一索引是不允許其中任何兩行具有一樣索引值的索引。 B主鍵索引 在數(shù)據(jù)庫中為表定義主鍵將自動(dòng)創(chuàng)建主鍵索引,主鍵索引是獨(dú)
7、一索引的特定類型。該索引要求主鍵中的每個(gè)值都獨(dú)一。 C聚散索引 在聚集索引中,表中行的物理順序與鍵值的邏輯索引順序一樣。一個(gè)表只能包含一個(gè)聚集索引。與非聚集索引相比,聚集索引通常提供更快的數(shù)據(jù)訪問速度。.查詢優(yōu)化實(shí)例及分析優(yōu) 化 準(zhǔn) 那么運(yùn)用ROWID的查詢效率最高;運(yùn)用獨(dú)一索引的查詢要快于運(yùn)用非獨(dú)一索引的查詢;運(yùn)用完好闡明索引的查詢快于運(yùn)用部分闡明索引的查詢;等條件的查詢快于范圍條件或不等條件的查詢;IS NULL條件的查詢不能運(yùn)用索引;盡量防止查詢中出現(xiàn)全表掃描。.單表查詢的優(yōu)化ORACLE中實(shí)現(xiàn)單表查詢的途徑有三種:運(yùn)用ROWIDACCESS BY ROWID索引掃描INDEX SCAN
8、全表掃描ACCESS FULL TABLE單表查詢優(yōu)化的目的: 如何選擇一個(gè)最正確存取途徑,顯然運(yùn)用ROWID的查詢效果最高,索引掃描次之,全表掃描效率最低。在一個(gè)單表查詢中,假設(shè)上述三種方法都可用,顯然要選擇運(yùn)用ROWID的方法,下面要引見的是如何在多個(gè)索引中選擇一個(gè)最正確的。在一個(gè)查詢中,假設(shè)有多個(gè)索引可用,ORACLE優(yōu)化器做如下任務(wù):選擇可利用的索引,即判別索引與謂詞的相容性;選擇查詢的驅(qū)動(dòng)索引: 假設(shè)有獨(dú)一索引出現(xiàn),那么以此索引為入口,其他索引不用。 假設(shè)有多個(gè)非獨(dú)一索引,且查詢謂詞為相等謂詞,那么采用索引合并的算法。.單表查詢的優(yōu)化索引與謂詞有如下的優(yōu)化關(guān)系:1獨(dú)一索引列常數(shù)2非獨(dú)
9、一索引列常數(shù)3索引列常數(shù)闡明: 出現(xiàn)(1)時(shí),(3)中的索引不用;出現(xiàn)(2)時(shí),(3)的索引不用。 索引合并的處置方法只用在表中有多個(gè)索引上,最多合并索引數(shù)目不超越五個(gè)。 當(dāng)且僅當(dāng)只需(3)情況下的索引時(shí),優(yōu)化器任選其一運(yùn)用。 備注:比索引合并更有效的方法是建立組合索引 組合索引有兩種運(yùn)用方式:全部闡明方式和部分闡明方式。 全部闡明方式:組合索引列全部出如今查詢中。 部分闡明方式:組合索引列前面一部分出如今查詢中。.單表查詢的優(yōu)化例子:SERV表建有組合索引: SERV_PLACE_X_IDX(PLACE_S_NODE, INTEGRAL, STATE)SERV表建有單索引: SERV_PLA
10、CE_S_NODE_IDX(PLACE_S_NODE) SERV_INTEGRAL_IDX(INTEGRAL) SERV_STATE_IDX(STATE)SQL語句: A)SELECT * FROM SERV T WHERE T.PLACE_S_NODE = 600488 AND T.INTEGRAL = 594000248 AND T.STATE = A; B) SELECT * FROM SERV T WHERE T.PLACE_S_NODE = 600488 AND T.INTEGRAL = 594000248; C)SELECT * FROM SERV T WHERE T.PLACE_
11、S_NODE = 600488 AND T.STATE = A;闡明: 例子A、 例子B優(yōu)化器選用的組合索引SERV_PLACE_X_IDX進(jìn)展索引掃描;例子A采用全部闡明方式,例子B采用部分闡明方式。例子C優(yōu)化器那么選用SERV_PLACE_S_NODE_IDX、SERV_STATE_IDX進(jìn)展索引合并,而不能運(yùn)用組合SERV_PLACE_X_IDX,由于PLACE_S_NODE、STATE不是組合索引列PLACE_S_NODE、INTEGRAL、STATE的前部.多表銜接的優(yōu)化處置銜接方式多表銜接的根底是兩表銜接,銜接優(yōu)化的主要任務(wù)有:1、有關(guān)銜接方式的選擇排序合并銜接(Sort Merg
12、e Join (SMJ) ) 銜接屬性上都建有索引,那么可利用索引已有的排序作合并銜接。但在銜接屬性上沒有索引時(shí),那么要首先對(duì)兩表在銜接屬性上排序,對(duì)排序結(jié)果再作銜接。SELECT A.MDSE_ID, B.NAME FROM MDSE A, DIM_MDSE_SPEC B WHERE A.MDSE_SPEC_ID = B.MDSE_SPEC_IDSELECT MDSE_ID, MDSE_SPEC_ID FROM MDSE ORDER BY MDSE_ID, MDSE_SPEC_IDSELECT NAME,MDSE_SPEC_ID FROM DIM_MDSE_SPEC ORDER BY NAM
13、E, MDSE_SPEC_IDSELECT A.MDSE_ID, B.NAME FROM A, B WHERE A.MDSE_SPEC_ID = B.MDSE_SPEC_ID.多表銜接的優(yōu)化處置銜接方式嵌套循環(huán)(Nested Loops (NL) ) 這個(gè)銜接方法有驅(qū)動(dòng)表(外部表)的概念。該銜接過程是一個(gè)2層嵌套循環(huán)。 銜接過程: 驅(qū)動(dòng)表的Row 1 - Probe -被驅(qū)動(dòng)表的Row 驅(qū)動(dòng)表的Row 2 - Probe -被驅(qū)動(dòng)表的Row 驅(qū)動(dòng)表的Row 3 - Probe -被驅(qū)動(dòng)表的Row . 驅(qū)動(dòng)表的Row n - Probe -被驅(qū)動(dòng)表的Row 在嵌套循環(huán)銜接中,Oracle讀取驅(qū)動(dòng)
14、表中的每一行,然后在被驅(qū)動(dòng)表中檢查能否有匹配的行,一切被匹配的行都被放到結(jié)果集中,然后處置驅(qū)動(dòng)表中的下一行。這個(gè)過程不斷繼續(xù),直到驅(qū)動(dòng)表中的一切行都被處置。這是從銜接操作中可以得到第一個(gè)匹配行的最快的方法之一,這種類型的銜接可以用在需求快速呼應(yīng)的語句中,以呼應(yīng)速度為主要目的。 闡明:嵌套循環(huán)銜接可以先前往曾經(jīng)銜接的行,而不用等待一切的銜接操作處置完才前往數(shù)據(jù),這可以實(shí)現(xiàn)快速的呼應(yīng)時(shí)間。.多表銜接的優(yōu)化處置銜接方式哈希銜接(Hash Join) 這種銜接是在Oracle 7.3以后引入的,從實(shí)際上來說比NL與SMJ更高效,而且只用在CBO優(yōu)化器中。 銜接過程: 1、構(gòu)建階段:優(yōu)化器首先選擇一張小
15、表做為驅(qū)動(dòng)表,運(yùn)用哈希函數(shù)對(duì)銜接列進(jìn)展計(jì)算產(chǎn)生一張哈希表。通常這個(gè)步驟是在內(nèi)存hash_area_size里面進(jìn)展的,因此運(yùn)算很快。 2、探測(cè)階段:優(yōu)化器對(duì)被驅(qū)動(dòng)表的銜接列運(yùn)用同樣的哈希函數(shù)計(jì)算得到的結(jié)果與前面構(gòu)成的哈希表進(jìn)展探測(cè)前往符合條件的記錄。這個(gè)階段中假設(shè)被驅(qū)動(dòng)表的銜接列的值沒有與驅(qū)動(dòng)表銜接列的值相等的話,那么這些記錄將會(huì)被丟棄而不進(jìn)展探測(cè)。 闡明:哈希銜接比較適用于前往大數(shù)據(jù)量結(jié)果集的銜接,且只適用于等值銜接。運(yùn)用哈希銜接必需是在CBO方式下,參數(shù)hash_join_enabled設(shè)置為true缺省值,還要設(shè)置 hash_area_size參數(shù),以使哈希銜接高效運(yùn)轉(zhuǎn),由于哈希銜接會(huì)在
16、該參數(shù)指定大小的內(nèi)存中運(yùn)轉(zhuǎn),過小的參數(shù)會(huì)使哈希銜接的性能比其他銜接方式還要低。 .多表銜接的優(yōu)化處置銜接方式總結(jié)一下,在哪種情況下用哪種銜接方法比較好: A排序合并銜接(Sort Merge Join, SMJ): a) 對(duì)于非等值銜接,這種銜接方式的效率是比較高的。 b) 假設(shè)在關(guān)聯(lián)的列上都有索引,效果更好。 c) 對(duì)于將2個(gè)較大的表源做銜接,該銜接方法比NL銜接要好一些。 B嵌套循環(huán)(Nested Loops, NL): a) 假設(shè)驅(qū)動(dòng)表(外部表)比較小,并且在被驅(qū)動(dòng)表(內(nèi)部表)上有獨(dú)一索引,或有高選擇性非獨(dú)一索引時(shí),運(yùn)用這種方法可以得到較好的效率。 b)嵌套循環(huán)銜接有其它銜接方法沒有的的
17、一個(gè)優(yōu)點(diǎn)是:可以先前往曾經(jīng)銜接的行,而不用等待一切的銜接操作處置完才前往數(shù)據(jù),這可以實(shí)現(xiàn)快速的呼應(yīng)時(shí)間。 C哈希銜接(Hash Join, HJ): a) 這種方法是在oracle7后來引入的,運(yùn)用了比較先進(jìn)的銜接實(shí)際,普通來說,其效率應(yīng)該好于其它2種銜接,但是這種銜接只能用在CBO優(yōu)化器中,而且需求設(shè)置適宜的hash_area_size參數(shù),才干獲得較好的性能。 b) 在2個(gè)較大的表源之間銜接時(shí)會(huì)獲得相對(duì)較好的效率,在一個(gè)表源較小時(shí)那么能獲得更好的效率。 c) 只能用于等值銜接中.多表銜接的優(yōu)化處置驅(qū)動(dòng)表的選擇多表銜接的根底是兩表銜接,銜接優(yōu)化的主要任務(wù)有:2、有關(guān)銜接次序的優(yōu)化驅(qū)動(dòng)表的選擇
18、基于規(guī)那么的優(yōu)化器 ORACLE的解析器按照從右到左的順序處置FROM子句中的表名,因此FROM子句中寫在最后的表根底表 driving table將被最先處置。 在FROM子句中包含多個(gè)表的情況下,他必需選擇記錄條數(shù)最少的表作為根底表。當(dāng)ORACLE處置多個(gè)表時(shí), 會(huì)運(yùn)用排序及合并的方式銜接它們。 首先,掃描第一個(gè)表FROM子句中最后的那個(gè)表并對(duì)記錄進(jìn)展派序。 然后掃描第二個(gè)表FROM子句中最后第二個(gè)表。 最后將一切從第二個(gè)表中檢索出的記錄與第一個(gè)表中適宜記錄進(jìn)展合并 。.多表銜接的優(yōu)化處置驅(qū)動(dòng)表的選擇例子A例子B例子A: 以SERV表為驅(qū)動(dòng)表,與VIP_INFO表做循環(huán)嵌套,產(chǎn)生的結(jié)果集與
19、MDSE表再做循環(huán)嵌套。例子B: 以MDSE表為驅(qū)動(dòng)表,與SERV表做循環(huán)嵌套,產(chǎn)生的結(jié)果集與VIP_INFO表再做循環(huán)嵌套。.where語句的銜接順序ORACLE采用自下而上的順序解析WHERE子句,根據(jù)這個(gè)原理,表之間的銜接必需寫在其他WHERE條件之前, 那些可以過濾掉最大數(shù)量記錄的條件必需寫在WHERE子句的末尾。 例子:.查詢優(yōu)化實(shí)例及分析SQL共享共享SQL語句 為了不反復(fù)解析一樣的SQL語句(由于解析操作比較費(fèi)資源,會(huì)導(dǎo)致性能下降),在第一次解析之后,ORACLE將SQL語句及解析后得到的執(zhí)行方案存放在內(nèi)存中。這塊位于系統(tǒng)全局區(qū)域SGA(systemglobalarea)的共享池
20、(sharedbufferpool)中的內(nèi)存可以被一切的數(shù)據(jù)庫用戶共享。因此,當(dāng)執(zhí)行一個(gè)SQL語句(有時(shí)被稱為一個(gè)游標(biāo))時(shí),假設(shè)該語句和之前的執(zhí)行過的某一語句完全一樣,并且之前執(zhí)行的該語句與其執(zhí)行方案依然在內(nèi)存中存在,那么ORACLE就不需求再進(jìn)展分析,直接得到該語句的執(zhí)行途徑。ORACLE的這個(gè)功能大大地提高了SQL的執(zhí)行性能并大大節(jié)省了內(nèi)存的運(yùn)用。 運(yùn)用這個(gè)功能的關(guān)鍵是將執(zhí)行過的語句盡能夠放到內(nèi)存中,所以這要求有大的共享池(經(jīng)過設(shè)置sharedbufferpool參數(shù)值)和盡能夠的運(yùn)用綁定變量的方法執(zhí)行SQL語句。.查詢優(yōu)化實(shí)例及分析SQL共享共享SQL語句條件 當(dāng)向Oracle提交一個(gè)S
21、QL語句,首先在共享內(nèi)存中查找能否有一樣的語句。留意:Oracle對(duì)兩者采取的是一種嚴(yán)厲匹配,要達(dá)成共享,SQL語句必需完全一樣(包括空格,換行等) 共享的三個(gè)條件: A字符級(jí)的比較 當(dāng)前被執(zhí)行的語句和共享池中的語句必需完全一樣 包括大小寫、空白和注釋 B兩條語句所指的對(duì)象必需完全一樣 C兩個(gè)SQL語句中綁定變量的名字必需一樣.查詢優(yōu)化實(shí)例及分析類型不一致查詢類型一致與不一致的查詢索引項(xiàng)為數(shù)值型 serv表serv_id number(10),建有serv_serv_id_idx(serv_id)索引.查詢優(yōu)化實(shí)例及分析類型不一致查詢類型一致與不一致的查詢索引項(xiàng)為字符型 serv表 acc_n
22、br varchar2(240) ,建有serv_acc_nbr_idx(acc_nbr)索引 .查詢優(yōu)化實(shí)例及分析類型不一致查詢類型一致與不一致的查詢總結(jié) 當(dāng)索引項(xiàng)為數(shù)值型的時(shí)候,在謂詞條件在類型不一致的情況下查詢, ORACLE的優(yōu)化器也可以援用該索引,是由于含有隱式轉(zhuǎn)換。 當(dāng)索引項(xiàng)為字符型的時(shí)候,謂詞條件就必需為字符,否那么ORACLE的優(yōu)化器不會(huì)運(yùn)用到該索引,而采用全表掃描的方式來執(zhí)行。 闡明:為了防止ORACLE對(duì)他的SQL進(jìn)展隱式的類型轉(zhuǎn)換, 最好把類型轉(zhuǎn)換用顯式表現(xiàn)出來。 留意:當(dāng)字符和數(shù)值比較時(shí), ORACLE會(huì)優(yōu)先轉(zhuǎn)換數(shù)值類型到字符類型。 例如: SELECT * FROM
23、SERV WHERE ACC_NUBER = 2394701; 轉(zhuǎn)換為下面語句: SELECT * FROM SERV WHERE TO_NUMBER(ACC_NUBER) = 2394701; SELECT * FROM SERV WHERE SERV_ID = 1800093946; 轉(zhuǎn)換為下面語句: SELECT * FROM SERV WHERE SERV_ID = TO_NUMBER(1800093946 ); .查詢優(yōu)化實(shí)例及分析操作符優(yōu)化不等條件的查詢闡明:對(duì)于不等查詢的兩種等價(jià)的不同方式,執(zhí)行方案是不一樣的假設(shè)serv表中acc_nbr=2394701的記錄占總記錄的比例小,運(yùn)
24、用索引效率較快;假設(shè)比例較大運(yùn)用索引也是沒有什么效果.查詢優(yōu)化實(shí)例及分析操作符優(yōu)化防止在索引列上運(yùn)用IS NULL和IS NOT NULL 防止在索引中運(yùn)用任何可以為空的列,ORACLE將無法運(yùn)用該索引。對(duì)于單列索引,假設(shè)列包含空值,索引中將不存在此記錄。 對(duì)于復(fù)合索引,假設(shè)每個(gè)列都為空,索引中同樣不存在此記錄。假設(shè)至少有一個(gè)列不為空,那么記錄存在于索引中。 闡明:ORACLE在其索引構(gòu)造中不存空值,因此對(duì)IS NULL條件的查詢采用的是全表掃描的方式,而不能夠運(yùn)用索引,且對(duì)這種條件的查詢不存在改寫方式。但是對(duì)IS NOT NULL的條件那么可用其它方法替代的。 對(duì)于IS NOT NULL的條
25、件可以如下的等價(jià)寫法: 對(duì)字符型 列名 空格串 對(duì)數(shù)值型 列名 0.查詢優(yōu)化實(shí)例及分析操作符優(yōu)化IN操作 用IN寫出來的SQL的優(yōu)點(diǎn)是比較容易寫及明晰易懂,但是用IN的SQL性能總是比較低的,從ORACLE執(zhí)行的步驟來分析用IN的SQL與不用IN的SQL是有區(qū)別的。 ORACLE試圖將其轉(zhuǎn)換成多個(gè)表的銜接,假設(shè)轉(zhuǎn)換不勝利那么先執(zhí)行IN里面的子查詢,再查詢外層的表記錄,假設(shè)轉(zhuǎn)換勝利那么直接采用多個(gè)表的銜接方式查詢。普通的SQL都可以轉(zhuǎn)換勝利,但對(duì)于含有分組統(tǒng)計(jì)等方面的SQL就不能轉(zhuǎn)換了。 闡明:在業(yè)務(wù)密集的SQL當(dāng)中盡量不采用IN操作符,可以用OR或 EXISTS替代。NOT IN操作 此操作是
26、強(qiáng)列引薦不運(yùn)用的,由于它不能運(yùn)用表的索引 。 闡明:可以用NOT EXISTS 或外銜接+判別為空替代。 LIKE操作符 LIKE操作符可以運(yùn)用通配符查詢,里面的通配符組合能夠到達(dá)幾乎是恣意的查詢,但通配符%在搜索詞首出現(xiàn),是不會(huì)運(yùn)用索引,會(huì)降低查詢速度。當(dāng)通配符出如今字符串其他位置時(shí),優(yōu)化器就能利用索引。 select * from serv where name like PHS%; -運(yùn)用范圍索引 select * from serv where name like %PHS%; -全表掃描.查詢優(yōu)化實(shí)例及分析操作符優(yōu)化 及 2; 高效率: SELECT * FROM TABLE1 WH
27、ERE A = 3; 執(zhí)行A2與A=3的效果就有很大的區(qū)別了,由于A2時(shí)ORACLE會(huì)先找出為2的記錄索引再進(jìn)展比較,而A=3時(shí)ORACLE那么直接找到=3的記錄索引。 闡明:在運(yùn)用 大于操作時(shí),應(yīng)盡量的思索用=大于等于來替代.查詢優(yōu)化實(shí)例及分析ORACLE為什么不運(yùn)用索引1、檢查被索引的列或組合索引的首列能否出如今WHERE條件中,這是“執(zhí)行方案能用到相關(guān)索引的必要條件。2、看采用了哪種類型的銜接方式。ORACLE的共有Sort Merge JoinSMJ、Hash JoinHJ和Nested Loop JoinNL。在兩張表銜接,且內(nèi)表的目的列上建有索引時(shí),只需Nested Loop才干有
28、效地利用到該索引。SMJ即使相關(guān)列上建有索引,最多只能因索引的存在,防止數(shù)據(jù)排序過程。HJ由于須做HASH運(yùn)算,索引的存在對(duì)數(shù)據(jù)查詢速度幾乎沒有影響。3、看銜接順序能否允許運(yùn)用相關(guān)索引。假設(shè)表STAFF_INFO的DEPT_NODE列上有索引,表DEPT_TREE的列DEPT_NODE上無索引,WHERE語句有STAFF_INFO.DEPT_NODE = DEPT_TREE.DEPT_NODE條件。在做NL銜接時(shí), STAFF_INFO做為外表,先被訪問,由于銜接機(jī)制緣由,外表的數(shù)據(jù)訪問方式是全表掃描, STAFF_INFO.DEPT_NODE上的索引顯然是用不上,最多在其上做索引全掃描或索引
29、快速全掃描。4、能否用到系統(tǒng)數(shù)據(jù)字典表或視圖。由于系統(tǒng)數(shù)據(jù)字典表都未被分析過,能夠?qū)е聵O差的“執(zhí)行方案。但是不要擅自對(duì)數(shù)據(jù)字典表做分析,否那么能夠?qū)е滤梨i,或系統(tǒng)性能下降。5、索引列能否函數(shù)的參數(shù)。如是,索引在查詢時(shí)用不上。6、能否存在潛在的數(shù)據(jù)類型轉(zhuǎn)換。如將字符型數(shù)據(jù)與數(shù)值型數(shù)據(jù)比較,ORACLE會(huì)自動(dòng)將字符型用to_number()函數(shù)進(jìn)展轉(zhuǎn)換,從而導(dǎo)致上一種景象的發(fā)生。7、能否為表和相關(guān)的索引搜集足夠的統(tǒng)計(jì)數(shù)據(jù)。對(duì)數(shù)據(jù)經(jīng)常有增、刪、改的表最好定期對(duì)表和索引進(jìn)展分析,可用SQL語句“analyze table xxxx compute statistics for all indexes;。ORACLE掌握了充分反映實(shí)踐的統(tǒng)計(jì)數(shù)據(jù),才有能夠做出正確的選擇。8、索引列的選擇性不高。9、索引列
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 年度光伏組件背板產(chǎn)業(yè)分析報(bào)告
- 二零二五版共享辦公空間租賃管理合同2篇
- 2024-2025學(xué)年新教材高中歷史第八單元中華民族的抗日戰(zhàn)爭(zhēng)和人民解放戰(zhàn)爭(zhēng)第23課從局部抗戰(zhàn)到全面抗戰(zhàn)學(xué)案新人教版必修中外歷史綱要上
- 2024-2025學(xué)年高中政治專題三信守合同與違約2訂立合同有學(xué)問訓(xùn)練含解析新人教版選修5
- 2024-2025學(xué)年新教材高中英語UNIT1TEENAGELIFESectionⅡDiscoveringUsefulStructures課時(shí)作業(yè)含解析新人教版必修第一冊(cè)
- 2025年度臨時(shí)勞動(dòng)合同范本(區(qū)塊鏈技術(shù)應(yīng)用)4篇
- 2025年度城市綠化工程合同及后期養(yǎng)護(hù)服務(wù)3篇
- 2024租賃合同(辦公設(shè)備)
- 2025年度智慧城市建設(shè)戰(zhàn)略合作合同范本3篇
- 2025年度監(jiān)獄門衛(wèi)安全責(zé)任書3篇
- 巖土工程勘察課件0巖土工程勘察
- 《腎上腺腫瘤》課件
- 2024-2030年中國典當(dāng)行業(yè)發(fā)展前景預(yù)測(cè)及融資策略分析報(bào)告
- 《乘用車越野性能主觀評(píng)價(jià)方法》
- 幼師個(gè)人成長發(fā)展規(guī)劃
- 2024-2025學(xué)年北師大版高二上學(xué)期期末英語試題及解答參考
- 動(dòng)物醫(yī)學(xué)類專業(yè)生涯發(fā)展展示
- 批發(fā)面包采購合同范本
- 乘風(fēng)化麟 蛇我其誰 2025XX集團(tuán)年終總結(jié)暨頒獎(jiǎng)盛典
- 2024年大數(shù)據(jù)分析公司與中國政府合作協(xié)議
- 一年級(jí)數(shù)學(xué)(上)計(jì)算題專項(xiàng)練習(xí)匯編
評(píng)論
0/150
提交評(píng)論