亚洲AV无码乱码在线观看不卡|最新大伊香蕉精品视频在线|亚洲不卡av一区二区|国产美女无遮挡免费

登錄論壇 | 注冊(cè)會(huì)員 設(shè)為首頁(yè) | 收藏本站
當(dāng)前位置 : 首頁(yè)>軟件學(xué)院>數(shù)據(jù)庫(kù)>SQL>正文
 
編程實(shí)例 SQL語(yǔ)句優(yōu)化技術(shù)分析

http://www.yibo1263.com 2008/5/1 6:48:02  來(lái)源:不詳  編輯:張佳奇
 
  最近幾周一直在進(jìn)行數(shù)據(jù)庫(kù)培訓(xùn),老師精湛的技術(shù)和生動(dòng)的講解使我受益匪淺。為了讓更多的新手受益,我抽空把SQL語(yǔ)句優(yōu)化部分進(jìn)行了整理,希望大家一起進(jìn)步! 

  一、操作符優(yōu)化  

 1、IN 操作符   

  用IN寫(xiě)出來(lái)的SQL的優(yōu)點(diǎn)是比較容易寫(xiě)及清晰易懂,這比較適合現(xiàn)代軟件開(kāi)發(fā)的風(fēng)格。但是用IN的SQL性能總是比較低的,從Oracle執(zhí)行的步驟來(lái)分析用IN的SQL與不用IN的SQL有以下區(qū)別:  

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

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

  2、NOT IN操作符   

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

  推薦方案:用NOT EXISTS 方案代替   

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

  判斷字段是否為空一般是不會(huì)應(yīng)用索引的,因?yàn)樗饕遣凰饕罩档! ?

  推薦方案:用其它相同功能的操作運(yùn)算代替,如:a is not null 改為 a>0 或a>’’等。不允許字段為空,而用一個(gè)缺省值代替空值,如申請(qǐng)中狀態(tài)字段不允許為空,缺省為申請(qǐng)。   

  4、> 及 < 操作符(大于或小于操作符)   

  大于或小于操作符一般情況下是不用調(diào)整的,因?yàn)樗兴饕蜁?huì)采用索引查找,但有的情況下可以對(duì)它進(jìn)行優(yōu)化,如一個(gè)表有100萬(wàn)記錄,一個(gè)數(shù)值型字段A,30萬(wàn)記錄的A=0,30萬(wàn)記錄的A=1,39萬(wàn)記錄的A=2,1萬(wàn)記錄的A=3。那么執(zhí)行A>2與A>=3的效果就有很大的區(qū)別了,因?yàn)锳>2時(shí)ORACLE會(huì)先找出為2的記錄索引再進(jìn)行比較,而A>=3時(shí)ORACLE則直接找到=3的記錄索引。   

  5、LIKE操作符   

  LIKE操作符可以應(yīng)用通配符查詢(xún),里面的通配符組合可能達(dá)到幾乎是任意的查詢(xún),但是如果用得不好則會(huì)產(chǎn)生性能上的問(wèn)題,如LIKE ‘%5400%’ 這種查詢(xún)不會(huì)引用索引,而LIKE ‘X5400%’則會(huì)引用范圍索引。   

  一個(gè)實(shí)際例子:用YW_YHJBQK表中營(yíng)業(yè)編號(hào)后面的戶(hù)標(biāo)識(shí)號(hào)可來(lái)查詢(xún)營(yíng)業(yè)編號(hào) YY_BH LIKE ‘%5400%’ 這個(gè)條件會(huì)產(chǎn)生全表掃描,如果改成YY_BH LIKE ’X5400%’ OR YY_BH LIKE ’B5400%’ 則會(huì)利用YY_BH的索引進(jìn)行兩個(gè)范圍的查詢(xún),性能肯定大大提高。   

  6、UNION操作符   

  UNION在進(jìn)行表鏈接后會(huì)篩選掉重復(fù)的記錄,所以在表鏈接后會(huì)對(duì)所產(chǎn)生的結(jié)果集進(jìn)行排序運(yùn)算,刪除重復(fù)的記錄再返回結(jié)果。實(shí)際大部分應(yīng)用中是不會(huì)產(chǎn)生重復(fù)的記錄,最常見(jiàn)的是過(guò)程表與歷史表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)致用磁盤(pán)進(jìn)行排序。   

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

  select * from gc_dfys

  union all

  select * from ls_jg_dfys  

  二、SQL書(shū)寫(xiě)的影響  

  1、同一功能同一性能不同寫(xiě)法SQL的影響! 

  如一個(gè)SQL在A程序員寫(xiě)的為 Select * from zl_yhjbqk  

  B程序員寫(xiě)的為 Select * from dlyx.zl_yhjbqk(帶表所有者的前綴)   

  C程序員寫(xiě)的為 Select * from DLYX.ZLYHJBQK(大寫(xiě)表名)   

  D程序員寫(xiě)的為 Select * from DLYX.ZLYHJBQK(中間多了空格)   

  以上四個(gè)SQL在ORACLE分析整理之后產(chǎn)生的結(jié)果及執(zhí)行的時(shí)間是一樣的,但是從ORACLE共享內(nèi)存SGA的原理,可以得出ORACLE對(duì)每個(gè)SQL 都會(huì)對(duì)其進(jìn)行一次分析,并且占用共享內(nèi)存,如果將SQL的字符串及格式寫(xiě)得完全相同,則ORACLE只會(huì)分析一次,共享內(nèi)存也只會(huì)留下一次的分析結(jié)果,這不僅可以減少分析SQL的時(shí)間,而且可以減少共享內(nèi)存重復(fù)的信息,ORACLE也可以準(zhǔn)確統(tǒng)計(jì)SQL的執(zhí)行頻率。   

本新聞共2頁(yè),當(dāng)前在第1頁(yè)  1  2  

收藏】【打印】【進(jìn)入論壇
  相關(guān)文章:

 
 
 
最新文章

搶先蘋(píng)果,消息稱(chēng)英特爾芯片采用臺(tái)積電
三星揭曉業(yè)內(nèi)首款單條 512GB DDR5 內(nèi)存
vivo 高端新機(jī)爆料:120Hz 曲面屏 + 天
vivo Y21 在印度正式上市:Helio P35 芯
微星推出 GeForce RTX 3080 Sea Hawk X
消息稱(chēng)三星 Galaxy Tab S8 系列平板將放
機(jī)械革命推出 F6 輕薄本:16 英寸全面屏
英特爾 12 代 Alder Lake CPU 600 系列
雷軍:向小米手機(jī) 1 首批用戶(hù)每人贈(zèng)送價(jià)
小米李明談?dòng)脩?hù)被踢出 MIUI 測(cè)試版:大

推薦文章
1
2
3
4
5
6
7
8
9
10
叛逆嫩模性感寫(xiě)真
宮如敏不雅照瘋傳 看張馨予韓一菲獸獸誰(shuí)
不懼孔子搶位 阿凡達(dá)游戲影音配置推薦
2015第十七屆“東北安博會(huì)”火爆招商
第十六屆東北國(guó)際公共安全防范產(chǎn)品博覽
2016年第五屆中國(guó)國(guó)際商業(yè)信息化博覽會(huì)
2016年第五屆中國(guó)國(guó)際POS機(jī)及相關(guān)設(shè)備展
互聯(lián)網(wǎng)電視熟了嗎 2013最火電視深解析
桑達(dá)獲邀出席2015中國(guó)(廣州)國(guó)際POS機(jī)
寶獲利報(bào)名參加“2015年度中國(guó)POS機(jī)行業(yè)
八卦圖解 More>>
叛逆嫩模性感寫(xiě)真 宮如敏不雅照瘋傳 看張馨予韓一菲
周偉童魔鬼身材日本性感寫(xiě)真圖  聯(lián)想V360筆記本模特寫(xiě)真