国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

SQL 語句優(yōu)化

2018-03-27 01:11:56 11849

IN 操作符

用IN寫出來的SQL的優(yōu)點(diǎn)是比較容易寫及清晰易懂,這比較適合現(xiàn)代軟件開發(fā)的風(fēng)格。

但是用IN的SQL性能總是比較低的:

數(shù)據(jù)庫試圖將其轉(zhuǎn)換成多個(gè)表的連接,如果轉(zhuǎn)換不成功則先執(zhí)行IN里面的子查詢,再查詢外層的表記錄,如果轉(zhuǎn)換成功則直接采用多個(gè)表的連接方式查詢。由此可見用IN的SQL至少多了一個(gè)轉(zhuǎn)換的過程。一般的SQL都可以轉(zhuǎn)換成功,但對于含有分組統(tǒng)計(jì)等方面的SQL就不能轉(zhuǎn)換了。

推薦方案:在業(yè)務(wù)密集的SQL當(dāng)中盡量不采用IN操作符。

NOT IN操作符

此操作是強(qiáng)列推薦不使用的,因?yàn)樗荒軕?yīng)用表的索引。

推薦方案:用NOT EXISTS 或(外連接+判斷為空)方案代替

操作符(不等于)

不等于操作符是永遠(yuǎn)不會(huì)用到索引的,因此對它的處理只會(huì)產(chǎn)生全表掃描。

推薦方案:用其它相同功能的操作運(yùn)算代替,如

a0 改為 a>0 or a’’ 改為 a>’’

IS NULL 或IS NOT NULL操作(判斷字段是否為空)

判斷字段是否為空一般是不會(huì)應(yīng)用索引的,因?yàn)锽樹索引是不索引空值的。

推薦方案:

用其它相同功能的操作運(yùn)算代替,如

a is not null 改為 a>0 或a>’’等。

不允許字段為空,而用一個(gè)缺省值代替空值,如業(yè)擴(kuò)申請中狀態(tài)字段不允許為空,缺省為申請。

建立位圖索引(有分區(qū)的表不能建,位圖索引比較難控制,如字段值太多索引會(huì)使性能下降,多人更新操作會(huì)增加數(shù)據(jù)塊鎖的現(xiàn)象)

> 及 2與A>=3的效果就有很大的區(qū)別了,因?yàn)锳>2時(shí)數(shù)據(jù)庫會(huì)先找出為2的記錄索引再進(jìn)行比較,而A>=3時(shí)數(shù)據(jù)庫則直接找到=3的記錄索引。

LIKE操作符

LIKE操作符可以應(yīng)用通配符查詢,里面的通配符組合可能達(dá)到幾乎是任意的查詢,但是如果用得不好則會(huì)產(chǎn)生性能上的問題,如LIKE ‘%5400%’ 這種查詢不會(huì)引用索引,而LIKE ‘X5400%’則會(huì)引用范圍索引。一個(gè)實(shí)際例子:用YW_YHJBQK表中營業(yè)編號后面的戶標(biāo)識(shí)號可來查詢營業(yè)編號 YY_BH LIKE ‘%5400%’ 這個(gè)條件會(huì)產(chǎn)生全表掃描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 則會(huì)利用YY_BH的索引進(jìn)行兩個(gè)范圍的查詢,性能肯定大大提高。

UNION操作符

UNION在進(jìn)行表鏈接后會(huì)篩選掉重復(fù)的記錄,所以在表鏈接后會(huì)對所產(chǎn)生的結(jié)果集進(jìn)行排序運(yùn)算,刪除重復(fù)的記錄再返回結(jié)果。實(shí)際大部分應(yīng)用中是不會(huì)產(chǎn)生重復(fù)的記錄,最常見的是過程表與歷史表UNION。如:

select * from gc_dfys
union
select * from ls_jg_dfys

這個(gè)SQL在運(yùn)行時(shí)先取出兩個(gè)表的結(jié)果,再用排序空間進(jìn)行排序刪除重復(fù)的記錄,最后返回結(jié)果集,如果表數(shù)據(jù)量大的話可能會(huì)導(dǎo)致用磁盤進(jìn)行排序。

推薦方案:采用UNION ALL操作符替代UNION,因?yàn)閁NION ALL操作只是簡單的將兩個(gè)結(jié)果合并后就返回。

select * from gc_dfys
union all
select * from ls_jg_dfys

SQL書寫的影響

同一功能同一性能不同寫法SQL的影響

如一個(gè)SQL在A程序員寫的為

Select * from zl_yhjbqk

B程序員寫的為

Select * from dlyx.zl_yhjbqk
(帶表所有者的前綴)

C程序員寫的為

Select * from DLYX.ZLYHJBQK(大寫表名)

D程序員寫的為

Select * from DLYX.ZLYHJBQK
(中間多了空格)

WHERE后面的條件順序影響

WHERE子句后面的條件順序?qū)Υ髷?shù)據(jù)量表的查詢會(huì)產(chǎn)生直接的影響,如

Select * from zl_yhjbqk where dy_dj = '1KV以下' and xh_bz=1
Select * from zl_yhjbqk where xh_bz=1 and dy_dj = '1KV以下'

以上兩個(gè)SQL中dy_dj(電壓等級)及xh_bz(銷戶標(biāo)志)兩個(gè)字段都沒進(jìn)行索引,所以執(zhí)行的時(shí)候都是全表掃描,第一條SQL的dy_dj = '1KV以下'條件在記錄集內(nèi)比率為99%,而xh_bz=1的比率只為0.5%,在進(jìn)行第一條SQL的時(shí)候99%條記錄都進(jìn)行dy_dj及xh_bz的比較,而在進(jìn)行第二條SQL的時(shí)候0.5%條記錄都進(jìn)行dy_dj及xh_bz的比較,以此可以得出第二條SQL的CPU占用率明顯比第一條低。

SQL語句索引的利用

對操作符的優(yōu)化(見上節(jié))

對條件字段的一些優(yōu)化

采用函數(shù)處理的字段不能利用索引,如:

substr(hbs_bh,1,4)=’5400’,優(yōu)化處理:hbs_bh like ‘5400%’
trunc(sk_rq)=trunc(sysdate), 優(yōu)化處理:
sk_rq>=trunc(sysdate) and sk_rq50,優(yōu)化處理:ss_df>30
‘X’||hbs_bh>’X5400021452’,優(yōu)化處理:hbs_bh>’5400021542’
sk_rq+5=sysdate,優(yōu)化處理:sk_rq=sysdate-5
hbs_bh=5401002554,優(yōu)化處理:hbs_bh=’ 5401002554’,注:此條件對hbs_bh 進(jìn)行隱式的to_number轉(zhuǎn)換,因?yàn)閔bs_bh字段是字符型。

條件內(nèi)包括了多個(gè)本表的字段運(yùn)算時(shí)不能進(jìn)行索引,如:

ys_df>cx_df,無法進(jìn)行優(yōu)化
qc_bh||kh_bh=’5400250000’,優(yōu)化處理:qc_bh=’5400’ and kh_bh=’250000’

[摘自網(wǎng)絡(luò)]

提交成功!非常感謝您的反饋,我們會(huì)繼續(xù)努力做到更好!

這條文檔是否有幫助解決問題?

非常抱歉未能幫助到您。為了給您提供更好的服務(wù),我們很需要您進(jìn)一步的反饋信息:

在文檔使用中是否遇到以下問題: