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