plsql語句優(yōu)化方法

經(jīng)驗(yàn)分享

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)制作、網(wǎng)站建設(shè)、吉安網(wǎng)絡(luò)推廣、成都微信小程序、吉安網(wǎng)絡(luò)營(yíng)銷、吉安企業(yè)策劃、吉安品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供吉安建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:muchs.cn

ORACLESQL語句的優(yōu)化

  1. 選擇最有效率的表名順序:應(yīng)該選擇記錄條數(shù)最少的表作為基表!

因?yàn)镺racle解析器的處理順序是從右至左的.當(dāng)ORACLE處理多個(gè)表時(shí), 會(huì)運(yùn)用排序及合并的方式連接它們.應(yīng)該選擇記錄條數(shù)最少的表作為基表,排序連接后面的表中之后可以最大限度的過濾掉后面的表的不必要的的記錄,加快執(zhí)行時(shí)間,提高執(zhí)行效率.

 

  1. WHERE子句中的連接順序。Oracle Parser采用至下而上的WHERE子句,因此,表之間的連接應(yīng)該寫在其他WHERE條件之前,那些可以過濾掉最大數(shù)量記錄的條件必須寫在WHERE子句末尾.

 

  1. 使用表別名(Alias): 當(dāng)關(guān)聯(lián)的表比較多時(shí),通過使用表別名并且Column名前面加上別名前綴時(shí),可以很有效的節(jié)省Oracle解析器解析表名的時(shí)間.

 

  1. 要盡量避免使用HAVING子句,因?yàn)?/strong>HAVING需要在檢索出所有的記錄之后才對(duì)結(jié)果集進(jìn)行過濾,而這個(gè)處理還需要進(jìn)行排序和總計(jì)的操作??梢酝ㄟ^使用WHERE子句來代替HAVING關(guān)鍵字。通過WHERE子句過濾現(xiàn)在查詢記錄的條數(shù)可以節(jié)約ORACLE很多的工作量和開銷.

 

  1. > 及 < 操作符

一般不用調(diào)整,但是如果可以優(yōu)先寫成 >= 和 <=.

如:一個(gè)表有100萬記錄,一個(gè)數(shù)值型字段A,30萬記錄的A=0,30萬記錄的A=1,39萬記錄的A=2,1萬記錄的A=3。那么執(zhí)行A>2與A>=3的效果就有很大的區(qū)別了,因?yàn)锳>2時(shí)ORACLE會(huì)先找出為2的記錄索引再進(jìn)行比較,而A>=3時(shí)ORACLE則直接找到=3的記錄索引。

 

6.      行數(shù)總計(jì)時(shí),COUNT(*),COUNT(1)的速率基本一樣,但通過索引檢索對(duì)索引的計(jì)數(shù)是最快的COUNT(EMPNO).

 

  1. 減少訪問數(shù)據(jù)庫(kù)的次數(shù)。當(dāng)執(zhí)行每條SQL語句時(shí),ORACLE內(nèi)部還會(huì)執(zhí)行很多的工作:解析SQL語句,綁定變量,讀取數(shù)據(jù)等,因此盡量較少對(duì)數(shù)據(jù)庫(kù)的訪問次數(shù)就能減少ORACLE的工作量.

 

例:

低效,需要訪問兩次數(shù)據(jù)庫(kù):

SELECT*FROM oe_order_lines_all ool

WHERE ool.header_id=35718;

 

SELECT *FROM oe_order_lines_all ool

WHERE ool.header_id=38516;

 

高效!只訪問了一次數(shù)據(jù)庫(kù):

SELECT *FROM oe_order_lines_all ool1,oe_order_lines_all ool2

WHERE ool1.header_id=38516

ANDool2.header_id=35718;

 

 

  1. 使用DECODE函數(shù)可以避免重發(fā)掃描相同記錄或重復(fù)連接相同的表.

 

例:

低效:

SELECTCOUNT(*),SUM(emp.SAL)

FROMEMP

WHERE emp.deptno =20

AND emp.ENAMELIKE'SMITH%';

 

 

SELECTCOUNT(*),SUM(emp.SAL)

FROMEMP

WHERE emp.deptno =30

AND emp.ENAMELIKE'SMITH%';

 

--你可以用DECODE函數(shù)高效地得到相同結(jié)果

SELECTCOUNT(DECODE(emp.deptno,20,’X’,NULL)) D20_COUNT,

COUNT(DECODE(emp.deptno,30,’X’,NULL)) D30_COUNT,

SUM(DECODE(emp.deptno,20,SAL,NULL)) D20_SAL,

SUM(DECODE(emp.deptno,30,SAL,NULL)) D30_SAL

FROM EMPWHERE emp.ENAMELIKE'SMITH%';

 

 

 

 

  1. 注意:要盡量減少訪問表的次數(shù),在子查詢語句中比較常見.

 

例:

              低效:

          UPDATE EMP_C1 X

SET X.SAL= (SELECTMAX(Y.SAL)FROM EMP Y),

X.HIREDATE = (SELECTMAX(Y.HIREDATE)FROM EMP Y)

WHERE X.DEPTNO =20;

 

高效:

UPDATE EMP_C1 X

SET(X.SAL, X.HIREDATE) = (SELECTMAX(Y.SAL) ,MAX(Y.HIREDATE)FROM EMP Y)WHERE X.DEPTNO =20;

 

 

 

  1.  ‘EXISTS’ 和’NOTEXISTS’用法:在處理大量的數(shù)據(jù)時(shí),SQL語句中使用‘EXISTS’來代替’IN’和’NOT EXISTS’來代替’NOT IN’ 處理的效率要大很多;

 

例:

低效:

SELECT*FROM Oe_Order_Lines_All ool

WHERE ool.ship_from_org_id=86

AND ool.header_idIN (SELECT ooh.header_idFROMoe_order_headers_all ooh);

 

高效:

SELECT*FROM Oe_Order_Lines_All ool

WHERE ool.ship_from_org_id=86

ANDEXISTS (SELECT1FROMoe_order_headers_all oohWHERE ool.org_id = ooh.org_idAND ool.header_id = ooh.header_id);

注:當(dāng)所用的表之間相互可以連接時(shí)盡量使用表連接而不是’EXISTS’;因?yàn)楸磉B接速度更快更高效;

 

 

  1. 用索引來提高效率

 索引是表的一個(gè)概念部分,用來提高檢索數(shù)據(jù)的效率. 實(shí)際上,ORACLE使用了一個(gè)復(fù)雜的自平衡B-tree結(jié)構(gòu). 通常,通過索引查詢數(shù)據(jù)比全表掃描要快. 當(dāng)ORACLE找出執(zhí)行查詢和Update語句的最佳路徑時(shí), ORACLE優(yōu)化器將使用索引. 同樣在聯(lián)結(jié)多個(gè)表時(shí)使用索引也可以提高效率. 另一個(gè)使用索引的好處是,它提供了主鍵(primary key)的唯一性驗(yàn)證.

除了那些LONG或LONG RAW數(shù)據(jù)類型, 你可以索引幾乎所有的列. 通常, 在大型表中使用索引特別有效. 當(dāng)然,你也會(huì)發(fā)現(xiàn), 在掃描小表時(shí),使用索引同樣能提高效率.

雖然使用索引能得到查詢效率的提高,但是我們也必須注意到它的代價(jià). 索引需要空間來存儲(chǔ),也需要定期維護(hù), 每當(dāng)有記錄在表中增減或索引列被修改時(shí), 索引本身也會(huì)被修改. 這意味著每條記錄的INSERT , DELETE , UPDATE將為此多付出4, 5 次的磁盤I/O . 因?yàn)樗饕枰~外的存儲(chǔ)空間和處理,那些不必要的索引反而會(huì)使查詢反應(yīng)時(shí)間變慢

注:定期的重構(gòu)索引是有必要的.

  1. 在’WHERE’子句中避免在索引列上使用計(jì)算。

 

同樣道理,避免在索引列上使用’IS NULL’或’IS NOT NULL’,NOT或者’<>’ OR ’!=’號(hào):因?yàn)樗饕荒芨嬖V你什么存在于表中,而不能告訴你什么不存在于表中,即索引不能索引空值.當(dāng)ORACLE遇到’NOT’就會(huì)停止執(zhí)行索引搜索掃描而進(jìn)行全表掃描.

 

  1. 帶通配符(%)的like語句.

因?yàn)橥ㄅ浞?%)在搜索次首出現(xiàn),Orcale解析器無法跳過’%’使用索引,只能進(jìn)行全表搜索,這樣搜索的效率就會(huì)低很多?!?’在搜索詞后,ORACLE就能使用搜索詞的索引,使用索引掃描數(shù)據(jù),效率將會(huì)得到很大的提高。

 ‘%’在搜索詞后面進(jìn)行的是索引搜索掃描:

 ‘%’在搜索詞前面進(jìn)行的是索引搜索全表掃描:

標(biāo)題名稱:plsql語句優(yōu)化方法
新聞來源:http://muchs.cn/article28/iiocjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供品牌網(wǎng)站建設(shè)虛擬主機(jī)、企業(yè)網(wǎng)站制作、App設(shè)計(jì)、定制開發(fā)、標(biāo)簽優(yōu)化

廣告

聲明:本網(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í)需注明來源: 創(chuàng)新互聯(lián)