欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

sql語(yǔ)句的優(yōu)化方式

這篇文章主要講解了“sql語(yǔ)句的優(yōu)化方式”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“sql語(yǔ)句的優(yōu)化方式”吧!

十多年專注成都網(wǎng)站制作,成都企業(yè)網(wǎng)站定制,個(gè)人網(wǎng)站制作服務(wù),為大家分享網(wǎng)站制作知識(shí)、方案,網(wǎng)站設(shè)計(jì)流程、步驟,成功服務(wù)上千家企業(yè)。為您提供網(wǎng)站建設(shè),網(wǎng)站制作,網(wǎng)頁(yè)設(shè)計(jì)及定制高端網(wǎng)站建設(shè)服務(wù),專注于成都企業(yè)網(wǎng)站定制,高端網(wǎng)頁(yè)制作,對(duì)木托盤等多個(gè)方面,擁有多年的網(wǎng)站推廣經(jīng)驗(yàn)。

1.合理使用索引
索引是中重要的數(shù)據(jù)結(jié)構(gòu),它的根本目的就是為了提高查詢效率。現(xiàn)在大多數(shù)的數(shù)據(jù)庫(kù)產(chǎn)品都采用IBM最先提出的ISAM索引結(jié)構(gòu)。索引的使用要恰到好處,其使用原則如下:
●在經(jīng)常進(jìn)行連接,但是沒(méi)有指定為外鍵的列上建立索引,而不經(jīng)常連接的字段則由優(yōu)化器自動(dòng)生成索引。
●在頻繁進(jìn)行排序或分組(即進(jìn)行g(shù)roup by或order by操作)的列上建立索引。
●在條件表達(dá)式中經(jīng)常用到的不同值較多的列上建立檢索,在不同值少的列上不要建立索引。比如在雇員表的“性別”列上只有“男”與“女”兩個(gè)不同值,因此就無(wú)必要建立索引。如果建立索引不但不會(huì)提高查詢效率,反而會(huì)嚴(yán)重降低更新速度。
●如果待排序的列有多個(gè),可以在這些列上建立復(fù)合索引(compound index)。
●使用系統(tǒng)工具。如Informix數(shù)據(jù)庫(kù)有一個(gè)tbcheck工具,可以在可疑的索引上進(jìn)行檢查。在一些數(shù)據(jù)庫(kù)服務(wù)器上,索引可能失效或者因?yàn)轭l繁操作而使得讀取效率降低,如果一個(gè)使用索引的查詢不明不白地慢下來(lái),可以試著用tbcheck工具檢查索引的完整性,必要時(shí)進(jìn)行修復(fù)。另外,當(dāng)數(shù)據(jù)庫(kù)表更新大量數(shù)據(jù)后,刪除并重建索引可以提高查詢速度。
(1)在下面兩條select語(yǔ)句中:
select * from table1 where field1<=10000 and field1>=0;
select * from table1 where field1>=0 and field1<=10000;
如果數(shù)據(jù)表中的數(shù)據(jù)field1都>=0,則第一條select語(yǔ)句要比第二條select語(yǔ)句效率高的多,因?yàn)榈诙lselect語(yǔ)句的第一個(gè)條件耗費(fèi)了大量的系統(tǒng)資源。
第一個(gè)原則:在where子句中應(yīng)把最具限制性的條件放在最前面。
(2)在下面的select語(yǔ)句中:
select * from tab where a=&hellip; and b=&hellip; and c=&hellip;;
若有索引index(a,b,c),則where子句中字段的順序應(yīng)和索引中字段順序一致。
第二個(gè)原則:where子句中字段的順序應(yīng)和索引中字段順序一致。
以下假設(shè)在field1上有唯一索引I1,在field2上有非唯一索引I2。
(3) select field3,field4 from tb where field1='sdf' 快
select * from tb where field1='sdf' 慢,
因?yàn)楹笳咴谒饕龗呙韬笠嘁徊絉OWID表訪問(wèn)。
(4) select field3,field4 from tb where field1>='sdf' 快
select field3,field4 from tb where field1>'sdf' 慢
因?yàn)榍罢呖梢匝杆俣ㄎ凰饕?br/> (5) select field3,field4 from tb where field2 like 'R%' 快
select field3,field4 from tb where field2 like '%R' 慢,
因?yàn)楹笳卟皇褂盟饕?br/> (6) 使用函數(shù)如:
select field3,field4 from tb where upper(field2)='RMN'不使用索引。
如果一個(gè)表有兩萬(wàn)條記錄,建議不使用函數(shù);如果一個(gè)表有五萬(wàn)條以上記錄,嚴(yán)格禁止使用函數(shù)!兩萬(wàn)條記錄以下沒(méi)有限制。
(7) 空值不在索引中存儲(chǔ),所以
select field3,field4 from tb where field2 is[not] null不使用索引。
(8) 不等式如
select field3,field4 from tb where field2!='TOM'不使用索引。
相似地,
select field3,field4 from tb where field2 not in('M','P')不使用索引。
(9) 多列索引,只有當(dāng)查詢中索引首列被用于條件時(shí),索引才能被使用。
(10) MAX,MIN等函數(shù),如
Select max(field2) from tb使用索引。所以,如果需要對(duì)字段取max,min,sum等,應(yīng)該加索引。
一次只使用一個(gè)聚集函數(shù),如:
select “min”=min(field1), “max”=max(field1) from tb
不如:select “min”=(select min(field1) from tb) , “max”=(select max(field1) from tb)
(11) 重復(fù)值過(guò)多的索引不會(huì)被查詢優(yōu)化器使用。而且因?yàn)榻怂饕薷脑撟侄沃禃r(shí)還要修改索引,所以更新該字段的操作比沒(méi)有索引更慢。
(12) 索引值過(guò)大(如在一個(gè)char(40)的字段上建索引),會(huì)造成大量的I/O開(kāi)銷(甚至?xí)^(guò)表掃描的I/O開(kāi)銷)。因此,盡量使用整數(shù)索引。 Sp_estspace可以計(jì)算表和索引的開(kāi)銷。
(13) 對(duì)于多列索引,order by的順序必須和索引的字段順序一致。
(14) 在sybase中,如果order by的字段組成一個(gè)簇索引,那么無(wú)須做order by。記錄的排列順序是與簇索引一致的。
(15) 多表聯(lián)結(jié)(具體查詢方案需要通過(guò)測(cè)試得到)
where子句中限定條件盡量使用相關(guān)聯(lián)的字段,且盡量把相關(guān)聯(lián)的字段放在前面。
select a.field1,b.field2 from a,b where a.field3=b.field3
1. field3上沒(méi)有索引的情況下:
對(duì)a作全表掃描,結(jié)果排序
對(duì)b作全表掃描,結(jié)果排序
結(jié)果合并。
對(duì)于很小的表或巨大的表比較合適。
2. field3上有索引
按照表聯(lián)結(jié)的次序,b為驅(qū)動(dòng)表,a為被驅(qū)動(dòng)表
對(duì)b作全表掃描
對(duì)a作索引范圍掃描
如果匹配,通過(guò)a的rowid訪問(wèn)
(16) 避免一對(duì)多的join。如:
select tb1.field3,tb1.field4,tb2.field2 from tb1,tb2 where tb1.field2=tb2.field2 and tb1.field2=&lsquo;BU1032&rsquo; and tb2.field2= &lsquo;aaa&rsquo;
不如:
declare @a varchar(80)
select @a=field2 from tb2 where field2=&lsquo;aaa&rsquo;
select tb1.field3,tb1.field4,@a from tb1 where field2= &lsquo;aaa&rsquo;
(16) 子查詢
用exists/not exists代替in/not in操作
比較:
select a.field1 from a where a.field2 in(select b.field1 from b where b.field2=100)
select a.field1 from a where exists( select 1 from b where a.field2=b.field1 and b.field2=100)
select field1 from a where field1 not in( select field2 from b)
select field1 from a where not exists( select 1 from b where b.field2=a.field1)
(17) 主、外鍵主要用于數(shù)據(jù)約束,sybase中創(chuàng)建主鍵時(shí)會(huì)自動(dòng)創(chuàng)建索引,外鍵與索引無(wú)關(guān),提高性能必須再建索引。
(18) char類型的字段不建索引比int類型的字段不建索引更糟糕。建索引后性能只稍差一點(diǎn)。
(19) 使用count(*)而不要使用count(column_name),避免使用count(distinct column_name)。
(20) 等號(hào)右邊盡量不要使用字段名,如:
select * from tb where field1 = field3

(21) 避免使用or條件,因?yàn)閛r不使用索引。
2.避免使用order by和group by字句。
因?yàn)槭褂眠@兩個(gè)子句會(huì)占用大量的臨時(shí)空間(tempspace),如果一定要使用,可用視圖、人工生成臨時(shí)表的方法來(lái)代替。
如果必須使用,先檢查memory、tempdb的大小。
測(cè)試證明,特別要避免一個(gè)查詢里既使用join又使用group by,速度會(huì)非常慢!
3.盡量少用子查詢,特別是相關(guān)子查詢。因?yàn)檫@樣會(huì)導(dǎo)致效率下降。
一個(gè)列的標(biāo)簽同時(shí)在主查詢和where子句中的查詢中出現(xiàn),那么很可能當(dāng)主查詢中的列值改變之后,子查詢必須重新查詢一次。查詢嵌套層次越多,效率越低,因此應(yīng)當(dāng)盡量避免子查詢。如果子查詢不可避免,那么要在子查詢中過(guò)濾掉盡可能多的行。


4.消除對(duì)大型表行數(shù)據(jù)的順序存取
在嵌套查詢中,對(duì)表的順序存取對(duì)查詢效率可能產(chǎn)生致命的影響。比如采用順序存取策略,一個(gè)嵌套3層的查詢,如果每層都查詢1000行,那么這個(gè)查詢就要查詢10億行數(shù)據(jù)。避免這種情況的主要方法就是對(duì)連接的列進(jìn)行索引。例如,兩個(gè)表:學(xué)生表(學(xué)號(hào)、姓名、年齡&hellip;&hellip;)和選課表(學(xué)號(hào)、課程號(hào)、成績(jī))。如果兩個(gè)表要做連接,就要在“學(xué)號(hào)”這個(gè)連接字段上建立索引。
還可以使用并集來(lái)避免順序存取。盡管在所有的檢查列上都有索引,但某些形式的where子句強(qiáng)迫優(yōu)化器使用順序存取。下面的查詢將強(qiáng)迫對(duì)orders表執(zhí)行順序操作:
SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008
雖然在customer_num和order_num上建有索引,但是在上面的語(yǔ)句中優(yōu)化器還是使用順序存取路徑掃描整個(gè)表。因?yàn)檫@個(gè)語(yǔ)句要檢索的是分離的行的集合,所以應(yīng)該改為如下語(yǔ)句:
SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT * FROM orders WHERE order_num=1008
這樣就能利用索引路徑處理查詢。
5.避免困難的正規(guī)表達(dá)式
MATCHES和LIKE關(guān)鍵字支持通配符匹配,技術(shù)上叫正規(guī)表達(dá)式。但這種匹配特別耗費(fèi)時(shí)間。例如:SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”
即使在zipcode字段上建立了索引,在這種情況下也還是采用順序掃描的方式。如果把語(yǔ)句改為SELECT * FROM customer WHERE zipcode >“98000”,在執(zhí)行查詢時(shí)就會(huì)利用索引來(lái)查詢,顯然會(huì)大大提高速度。
另外,還要避免非開(kāi)始的子串。例如語(yǔ)句:SELECT * FROM customer WHERE zipcode[2,3] >“80”,在where子句中采用了非開(kāi)始子串,因而這個(gè)語(yǔ)句也不會(huì)使用索引。
6.使用臨時(shí)表加速查詢
把表的一個(gè)子集進(jìn)行排序并創(chuàng)建臨時(shí)表,有時(shí)能加速查詢。它有助于避免多重排序操作,而且在其他方面還能簡(jiǎn)化優(yōu)化器的工作。例如:
SELECT cust.name,rcvbles.balance,&hellip;&hellip;other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
AND cust.postcode>“98000”
ORDER BY cust.name
如果這個(gè)查詢要被執(zhí)行多次而不止一次,可以把所有未付款的客戶找出來(lái)放在一個(gè)臨時(shí)文件中,并按客戶的名字進(jìn)行排序:
SELECT cust.name,rcvbles.balance,&hellip;&hellip;other columns
FROM cust,rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
ORDER BY cust.name
INTO TEMP cust_with_balance
然后以下面的方式在臨時(shí)表中查詢:
SELECT * FROM cust_with_balance
WHERE postcode>“98000”
臨時(shí)表中的行要比主表中的行少,而且物理順序就是所要求的順序,減少了磁盤I/O,所以查詢工作量可以得到大幅減少。
注意:臨時(shí)表創(chuàng)建后不會(huì)反映主表的修改。在主表中數(shù)據(jù)頻繁修改的情況下,注意不要丟失數(shù)據(jù)。
7.用排序來(lái)取代非順序存取
非順序磁盤存取是最慢的操作,表現(xiàn)在磁盤存取臂的來(lái)回移動(dòng)。SQL語(yǔ)句隱藏了這一情況,使得我們?cè)趯憫?yīng)用程序時(shí)很容易寫出要求存取大量非順序頁(yè)的查詢。
有些時(shí)候,用數(shù)據(jù)庫(kù)的排序能力來(lái)替代非順序的存取能改進(jìn)查詢。

感謝各位的閱讀,以上就是“sql語(yǔ)句的優(yōu)化方式”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)sql語(yǔ)句的優(yōu)化方式這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

分享文章:sql語(yǔ)句的優(yōu)化方式
轉(zhuǎn)載注明:http://chinadenli.net/article2/giiooc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站內(nèi)鏈關(guān)鍵詞優(yōu)化、云服務(wù)器、企業(yè)建站營(yíng)銷型網(wǎng)站建設(shè)、用戶體驗(yàn)

廣告

聲明:本網(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)

網(wǎng)站優(yōu)化排名