查詢表達(dá)式對(duì)SQL Server查詢性能的優(yōu)化
SQL Server查詢性能會(huì)隨著系統(tǒng)中一些變化因素而有所變化,SQL Server查詢性能有時(shí)會(huì)直線下降。表的順序讀取是導(dǎo)致SQL Server查詢性能直線下降的原因。
因此,在寫查詢語句時(shí)合理使用查詢條件.要避免對(duì)數(shù)據(jù)表進(jìn)行的順序讀取。主要采用的方法有:
(1)在搜索條件中避免使用關(guān)鍵字LIKE,盡可能使用精確
比較
如果能夠使用一個(gè)更確定的查詢.就盡量避免使用關(guān)鍵字LIKE 。當(dāng)你使用LIKE 搜索條件時(shí),數(shù)據(jù)查詢速度降低。
SEU£CT FR0M 學(xué)生WHERE學(xué)號(hào)mce”2003%”
即便是按”學(xué)號(hào)”建立了索引.上述查詢語句使用了關(guān)鍵字LIKE 導(dǎo)致了順序讀寫。降低了執(zhí)行效率。如果將上面的查詢語句改為如下的形式,則可以使查詢效率提高很多。
SELECT FROM 學(xué)生WHERE (學(xué)號(hào)>:”2003”AND 學(xué)
號(hào)<”2004’’)
(2)避免使用不合理的關(guān)系運(yùn)算符
在SQL Server 2000中,搜索參數(shù)的合法操作符包括=,>,<,>=,<=中的任何一個(gè),如果使用了如”◇ ·-等的不合理的操作符.優(yōu)化器將忽略那一作為搜索參數(shù)的語句.而導(dǎo)致對(duì)數(shù)據(jù)表的順序讀取,不能進(jìn)行優(yōu)化。
SELECT FR0M 學(xué)生WHERE 年齡<>l8
(3)在查詢條件中不要使用對(duì)列進(jìn)行算術(shù)、比較和函數(shù)運(yùn)算對(duì)列進(jìn)行算術(shù)、列比較、函數(shù)運(yùn)算,導(dǎo)致語句無法進(jìn)行優(yōu)化處理,降低SQL Server查詢性能。
例如,成績(學(xué)號(hào),課程代碼,平時(shí)成績,期中成績,期未成績,總平成績,學(xué)分)和上面的學(xué)生表
SELE CT ‘FR OM 成績WHERE 期未成績}0.8>60
(對(duì)列進(jìn)行算術(shù)運(yùn)算)
SELECT FR OM 學(xué)生WH ERE UPPERCASE f姓名、=-.ZHENLIGU”(列進(jìn)行函數(shù)運(yùn)算)
SELECT學(xué)生.學(xué)號(hào),學(xué)生.姓名.成績.總平成績FR 0M 學(xué)生.成績 WHERE 學(xué)生.學(xué)號(hào)=成績.學(xué)號(hào)(列與列之間進(jìn)行比較)
(4)使用正邏輯而不使用非邏輯
因?yàn)椋沁壿嫴僮?如NOT Between、NOT IN和NOT NULL)會(huì)導(dǎo)致對(duì)表中的記錄從***個(gè)記錄開始順序讀?。畽z查數(shù)據(jù)表中的所有行。從而會(huì)降低查詢速度
例如:查詢年齡不在l8到20歲的記錄
SELE CT FR0M 學(xué)生WHERE 年齡N0T BETWEEN 18 A D 20
而應(yīng)改寫為:
SELECT FROM 學(xué)生WHERE年齡<18 0R年齡>20
(5)將BETWEEN轉(zhuǎn)化為AND連接的謂詞
由于執(zhí)行引擎對(duì)各種謂詞的處理方法不同. 因此把邏輯表達(dá)式”B翻 rEEN 表達(dá)式1 AND 表達(dá)式2”寫成等價(jià)且效率較高的用AND連接的兩個(gè)謂詞表達(dá)式.來提高查詢效率。
例如:查詢年齡在18到20歲的記錄
SELECT FROM 學(xué)生WHERE 年齡BE1WEEN 18 AND 20
改寫成:
SELECT FROM 學(xué)生WHERE年齡>=18 AND年齡<=20
(6)用集合運(yùn)算UNION來代替邏輯運(yùn)算OR
盡管索引能提高查詢效率.若在WHERE子句中使用了邏輯運(yùn)算OR表達(dá)式.強(qiáng)迫優(yōu)化器使用順序存取。例如:
SELECT*FR0M 學(xué)生WHERE學(xué)號(hào)>”21005”AND學(xué)號(hào)<”21020”0R系別:”計(jì)算機(jī)系”
雖然在”學(xué)號(hào)”和”系別”上都建有索引.但是在上面的語句中優(yōu)化器還是使用順序存取的方法掃描整個(gè)表。因?yàn)檫@個(gè)語句要檢索的是分離的行的集合.所以將上面的語句改為如下語句:
SELECT FR0M 學(xué)生WHERE學(xué)號(hào)>”21005”AND 學(xué)號(hào)<”21020”
UN10N
SELECT FROM 學(xué)生WHE RE系別=”計(jì)算機(jī)系”
利用”學(xué)號(hào)”和”系別”所建索引進(jìn)行查詢.將所得到的結(jié)果集,通過集合并運(yùn)算UNION,得到查詢結(jié)果集,提高了查詢效率。
【編輯推薦】