朱慶燁 無(wú)錫市人力資源和社會(huì)保障信息中心
在社??ü芾硐到y(tǒng)的各大數(shù)據(jù)庫(kù)中,都存在著大量的數(shù)據(jù)信息和記錄,每天都需要對(duì)它們進(jìn)行各種大量的數(shù)據(jù)操作。SQL作為數(shù)據(jù)庫(kù)系統(tǒng)的標(biāo)準(zhǔn)語(yǔ)言,SQL語(yǔ)句可以被用來(lái)執(zhí)行各種各樣的操作,比如數(shù)據(jù)的查詢(xún)、更新、刪除等等。在使用SQL語(yǔ)句時(shí),一般大家往往只是關(guān)心得到的結(jié)果的準(zhǔn)確性,不會(huì)去關(guān)注其執(zhí)行效率性;不同的SQL語(yǔ)句能得到同樣的結(jié)果,但它們之間的效率可能會(huì)差幾十甚至上百倍。隨著數(shù)據(jù)庫(kù)技術(shù)的不斷發(fā)展,數(shù)據(jù)量的不斷累積,如何優(yōu)化SQL語(yǔ)句以提高工作的效率也成了重要的問(wèn)題;本人依照實(shí)際工作--社??〝?shù)據(jù)庫(kù)管理中遇到的一些情況,通過(guò)幾個(gè)方面來(lái)談?wù)勅绾瓮ㄟ^(guò)優(yōu)化SQL語(yǔ)句來(lái)提高日常的工作效率。
索引是數(shù)據(jù)庫(kù)中最常用也是十分重要的數(shù)據(jù)對(duì)象。合理在數(shù)據(jù)庫(kù)中創(chuàng)建和使用一個(gè)索引,可以起到優(yōu)化語(yǔ)句的執(zhí)行效率,提高響應(yīng)速度的效果。創(chuàng)建和使用索引需要遵循以下原則:
對(duì)使用很頻繁的列創(chuàng)建索引;
在需要進(jìn)行多列排序時(shí),可以在這些列上創(chuàng)建一個(gè)復(fù)合索引;
對(duì)于頻繁操作的GROUP BY和ORDER BY列創(chuàng)建索引 ;
盡量不要對(duì)值很少的列創(chuàng)建索引,比如個(gè)人信息表中“性別”字段,值就“0”、“1”和“2”;
不要對(duì)經(jīng)常進(jìn)行Update、Insert、Delete操作的表創(chuàng)建太多的索引,一般不要超過(guò)7個(gè)。
因?yàn)樯绫O到y(tǒng)用的是Oracle數(shù)據(jù)庫(kù),所以我在寫(xiě)代碼之前會(huì)注意選擇表名和條件的順序問(wèn)題,因?yàn)镺racle對(duì)表名采用的是從右到左的順序解析,對(duì)條件采用的是自下而上的順序解析,所以我都會(huì)注意它們之間的關(guān)系和排序。
表名排序一般都是把基礎(chǔ)表(也就是數(shù)據(jù)記錄總數(shù)少的表)放在后面。條件排序一般把多表之間的連接放在其它條件之前,除非它是可以是過(guò)濾掉大數(shù)量數(shù)據(jù)的連接,那就可以放到句末。
在日常工作中,如果需要在大量數(shù)據(jù)中查詢(xún)符合某些特定條件的數(shù)據(jù)時(shí),我們一般會(huì)用到含通配符(%)的like語(yǔ)句。要注意的是,通配符(%)一般不要放在語(yǔ)句的詞首。
我們?cè)谌粘9ぷ髦袝?huì)發(fā)現(xiàn),在對(duì)一張表進(jìn)行查詢(xún)時(shí),往往為了滿(mǎn)足一個(gè)條件,會(huì)需要對(duì)另外一張表進(jìn)行聯(lián)接,一般會(huì)經(jīng)常使用到兩個(gè)語(yǔ)句,EXISTS和IN,這兩種語(yǔ)句可以達(dá)到的結(jié)果是一樣的;從格式上講,IN語(yǔ)句比較容易理解;但是在執(zhí)行效率方面,EXISTS語(yǔ)句會(huì)比較高效,EXISTS語(yǔ)句先執(zhí)行主查詢(xún),然后執(zhí)行子查詢(xún),找到匹配的數(shù)據(jù),而IN語(yǔ)句先執(zhí)行子查詢(xún),得到的結(jié)果列表存儲(chǔ)在一個(gè)增加臨時(shí)表的索引,再去到主查詢(xún)。
在數(shù)據(jù)庫(kù)中存在有很多種的數(shù)據(jù)類(lèi)型,很多數(shù)據(jù)表面上看似一樣,其實(shí)數(shù)據(jù)類(lèi)型不一定一樣;如果你不注意寫(xiě)的語(yǔ)句,它有可能會(huì)使優(yōu)化器無(wú)法執(zhí)行的一些操作可以被優(yōu)化,從而降低了執(zhí)行效率。在Oracle中不兼容的數(shù)據(jù)類(lèi)型有:integer和float,varchar和char,binary和long binary等等。
(1)SQL語(yǔ)句中使用了不等于操作符‘!=’和‘<>’,即使該列上有索引,那該索引也不能使用。
(2)使用IS NULL或IS NOT NULL將會(huì)限制使用索引,因?yàn)镹ULL值沒(méi)有定義。
(3)語(yǔ)句中使用了函數(shù)也會(huì)會(huì)停用索引,如字符連接函數(shù)‘||’、數(shù)學(xué)函數(shù)‘+’等。
(4)相同的索引列之間不要進(jìn)行比較,否則將會(huì)啟用全表掃描。
(5)如果數(shù)據(jù)類(lèi)型不匹配,進(jìn)行比較的話(huà),會(huì)自動(dòng)限制索引的使用。
(6)在Where子句中盡量用OR來(lái)代替NOT。
通過(guò)對(duì)SQL語(yǔ)句的執(zhí)行過(guò)程分析,我們可以看到,能提高工作效率的SQL語(yǔ)句基本上是優(yōu)化過(guò)SQL語(yǔ)句,平時(shí)工作中可以從上述幾個(gè)方面進(jìn)行優(yōu)化和改進(jìn),從而提高工作效率。當(dāng)然,具體的優(yōu)化改進(jìn)方案,仍然需要根據(jù)實(shí)際需求和特定的數(shù)據(jù)庫(kù)環(huán)境來(lái)定。只有在日常工作中通過(guò)不斷的總結(jié)、積累和學(xué)習(xí),才能寫(xiě)出高質(zhì)量高效的SQL語(yǔ)句,當(dāng)然這也只是提高效率的一個(gè)方面,其它方面的設(shè)計(jì)也要進(jìn)行同步優(yōu)化??傊?,通過(guò)以上幾個(gè)方面的綜合優(yōu)化,會(huì)使SQL語(yǔ)句的工作效率有一定的提升。
[1]徐鳳梅.關(guān)系數(shù)據(jù)庫(kù)中SQL查詢(xún)語(yǔ)言的優(yōu)化策略廣西輕工業(yè),2009
[2]吳險(xiǎn)峰.SQLSERVER環(huán)境下的SQL優(yōu)化方法探討.電腦知識(shí)與技術(shù),2008