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