優(yōu)化Select 語(yǔ)句的原則
-摘抄《SQL Server 2005 性能監(jiān)測(cè)與優(yōu)化》
Select 語(yǔ)句是數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)中最常用的語(yǔ)句之一,Select 語(yǔ)句設(shè)計(jì)的好壞直接影響到應(yīng)用程序的工作性能。
在設(shè)計(jì)Select語(yǔ)句時(shí),應(yīng)該注意以下幾種影響查詢效率的情況:
1、 沒(méi)有創(chuàng)建索引,或者沒(méi)有正確地使用索引。這是最有可能影響數(shù)據(jù)庫(kù)查詢的原因之一。創(chuàng)建索引是優(yōu)化數(shù)據(jù)庫(kù)查詢效率的重要手段。
2、 存在死鎖的情況,從而導(dǎo)致Select語(yǔ)句掛起,無(wú)法返回結(jié)果集。
3、 返回不必要的列,很多程序員喜歡使用Select * from TableName 來(lái)查詢表可視圖中的數(shù)據(jù),* 代表表或視圖中所有字段,建議用戶在使用Select語(yǔ)句時(shí),只返回必要的列。浪費(fèi)更多的系統(tǒng)資源,從而影響查詢效率。
4、 在Select語(yǔ)句中使用Where字句,設(shè)置查詢條件,只返回必要的記錄。
5、 在Select語(yǔ)句中使用Top 關(guān)鍵字,限制返回的記錄數(shù)量。
6、 如果在Where字句中使用Like謂詞進(jìn)行模糊查詢,則要注意通配符的使用方法。
7、 慎用Union關(guān)鍵字,因?yàn)樗鼤?huì)影響查詢的效率。
8、 慎用Distinct關(guān)鍵字,因?yàn)樵诮Y(jié)果集中返回重復(fù)的記錄并不會(huì)影響查詢的效率。相反,過(guò)濾掉重復(fù)的記錄會(huì)浪費(fèi)查詢的時(shí)間和系統(tǒng)資源。因此,除非必須如此,不要使用Distinct關(guān)鍵字。
9、 如果需要經(jīng)常對(duì)表中的數(shù)據(jù)進(jìn)行統(tǒng)計(jì),可以在表中增加一個(gè)統(tǒng)計(jì)字段,每次表中數(shù)據(jù)發(fā)生變化時(shí),動(dòng)態(tài)更新統(tǒng)計(jì)字段。這樣,在查詢統(tǒng)計(jì)結(jié)果時(shí),就不需要臨時(shí)對(duì)表中的數(shù)據(jù)統(tǒng)計(jì)計(jì)算了。
10、 如果需要多次對(duì)一個(gè)數(shù)據(jù)量非常大的表中的一部分?jǐn)?shù)據(jù)進(jìn)行查詢操作,可以將這部分?jǐn)?shù)據(jù)保存到臨時(shí)表中,然后對(duì)臨時(shí)表進(jìn)行查詢操作。如果需要,可以在臨時(shí)表上創(chuàng)建索引。
11、 在Where字句中,有時(shí)使用Between關(guān)鍵字比使用In關(guān)鍵字要快,因?yàn)镮n關(guān)鍵字對(duì)其后面的集合中的每個(gè)元素進(jìn)行比較操作。如果必須使用In關(guān)鍵字,則可將頻繁使用的值放在集合的前面,從而減少比較的次數(shù)。
12、 盡量少使用視圖,特別是嵌套視圖,可以直接從表中獲取數(shù)據(jù)。在開(kāi)發(fā)應(yīng)用程序時(shí),有時(shí)程序員為了方便,設(shè)計(jì)一個(gè)包含很多字段的大視圖,無(wú)論需要什么數(shù)據(jù),都可以通過(guò)查詢此視圖獲取到。實(shí)際上,最好從表直接獲取數(shù)據(jù),以避免查詢大視圖而造成的系統(tǒng)開(kāi)銷(xiāo)。建議使用存儲(chǔ)過(guò)程代替視圖,從而提高執(zhí)行的效率。
13、 如果不需對(duì)結(jié)果集進(jìn)行排序,則不要使用Order By字句,因?yàn)榕判虿僮鲿?huì)占用系統(tǒng)資源。
14、 不要在Where字句中“=”的左側(cè)使用函數(shù)和表達(dá)式,因?yàn)橄到y(tǒng)將無(wú)法應(yīng)用函數(shù)或表達(dá)式中的索引。
15、 當(dāng)判斷表中包含記錄時(shí),使用Exists關(guān)鍵字,而不要使用Count統(tǒng)計(jì)表中所有的記錄數(shù)量。
你的數(shù)據(jù)庫(kù)應(yīng)用系統(tǒng)違反幾條建議?歡迎提出更多優(yōu)化建議!
新聞熱點(diǎn)
疑難解答
圖片精選