SQL查詢效率注意事項(xiàng)小結(jié)
二、SQL邏輯執(zhí)行順序
FROM-->JOIN-->WHERE-->GROUP-->HAVING-->DISTINCT-->ORDER-->TOP
三、橫向
查詢需要的字段
當(dāng)在SQL語(yǔ)句中連接多個(gè)表時(shí),請(qǐng)使用表的別名并把別名前綴于每個(gè)Column上這樣一來(lái),就可以減少解析的時(shí)間并減少那些由Column歧義引起的語(yǔ)法錯(cuò)誤
四、少做重復(fù)工作
控制同一語(yǔ)句的多次執(zhí)行,特別是一些基礎(chǔ)數(shù)據(jù)的多次執(zhí)行是很多程序員很少注意的
減少多次的數(shù)據(jù)轉(zhuǎn)換
杜絕不必要的子查詢和連接表,子查詢?cè)趫?zhí)行計(jì)劃一般解釋成外連接,多余的連接表帶來(lái)額外的開銷
五、關(guān)于零時(shí)表#與表變量@
如果語(yǔ)句很復(fù)雜,連接太多,可以考慮用臨時(shí)表和表變量分步完成
如果需要多次用到一個(gè)大表的同一部分?jǐn)?shù)據(jù),考慮用臨時(shí)表和表變量暫存這部分?jǐn)?shù)據(jù)
如果需要綜合多個(gè)表的數(shù)據(jù),形成一個(gè)結(jié)果,可以考慮用臨時(shí)表和表變量分步匯總這多個(gè)表的數(shù)據(jù)
關(guān)于臨時(shí)表和表變量的選擇,在數(shù)據(jù)量較多的情況下,臨時(shí)表的速度反而更快
SELECT INTO會(huì)比CREATE TABLE + INSERT INTO的方法快,但是SELECT INTO會(huì)鎖定TEMPDB的系統(tǒng)表SYSOBJECTS、SYSINDEXES、SYSCOLUMNS,在多用戶并發(fā)環(huán)境下,容易阻塞其他進(jìn)程
六、子查詢
子查詢可以用IN、NOT IN、EXISTS、NOT EXISTS引入
NOT IN、NOT EXISTS的相關(guān)子查詢可以改用LEFT JOIN代替寫法
如果保證子查詢沒有重復(fù) ,IN、EXISTS的相關(guān)子查詢可以用INNER JOIN 代替
IN的相關(guān)子查詢用EXISTS代替
七、索引
避免對(duì)索引字段進(jìn)行計(jì)算操作
SELECT ID FROM T WHERE NUM/2=100
應(yīng)改為:
SELECT ID FROM T WHERE NUM=100*2
避免在索引字段上使用NOT,<>,!=
避免在索引列上使用IS NULL和IS NOT NULL
避免在索引列上出現(xiàn)數(shù)據(jù)類型轉(zhuǎn)換
避免在索引字段上使用函數(shù)
避免建立索引的列中使用空值
不要對(duì)索引字段進(jìn)行多字段連接
WHERE FAME+'. '+LNAME='HAIWEI.YANG'
應(yīng)改為:
WHERE FNAME='HAIWEI' AND LNAME='YANG'
八、多表連接
多表連接的時(shí)候,連接條件必須寫全,寧可重復(fù),不要缺漏
連接條件盡量使用聚集索引
九、其他
在可以使用UNION ALL的語(yǔ)句里,使用UNION ALL
避免在WHERE子句中使用IN,NOT IN,OR
避免使用耗費(fèi)資源的操作,帶有DISTINCT,UNION,MINUS,INTERSECT,ORDER BY的SQL語(yǔ)句會(huì)啟動(dòng)SQL引擎執(zhí)行,耗費(fèi)資源的排序(SORT)功能. DISTINCT需要一次排序操作, 而其他的至少需要執(zhí)行兩次排序
LIKE ‘%5400%' 這種查詢不會(huì)引用索引,而LIKE ‘X5400%'則會(huì)引用范圍索引。
相關(guān)文章
阿拉伯?dāng)?shù)字轉(zhuǎn)大寫中文_財(cái)務(wù)常用sql存儲(chǔ)過(guò)程
需求:輸入阿拉伯?dāng)?shù)字,給出對(duì)應(yīng)的中文大寫,編寫為存儲(chǔ)過(guò)程或函數(shù)2008-10-10Cont()與Where().Count()有時(shí)性能差別如此之大!
今天在修改后臺(tái)用戶公司管理列表時(shí),發(fā)現(xiàn)列表加載超慢的bug!好幾十秒??!數(shù)據(jù)是相對(duì)其他的列表是稍微多點(diǎn),不過(guò)也就4000多條,之前是好的,為啥這么慢呢?2010-03-03遠(yuǎn)程連接SQLSERVER 2000服務(wù)器方法
需求如下:需要遠(yuǎn)程連接外地的SQL Server 2000服務(wù)器。2009-07-07關(guān)于SQL數(shù)據(jù)庫(kù) msdb.dbo.sp_send_dbmail 函數(shù)發(fā)送郵件的場(chǎng)景分析
這篇文章主要介紹了關(guān)于SQL數(shù)據(jù)庫(kù) msdb.dbo.sp_send_dbmail 函數(shù)發(fā)送郵件的場(chǎng)景分析,需要的朋友可以參考下2018-10-10SQLSERVER啟動(dòng)不起來(lái)(錯(cuò)誤9003)的解決方法分享
這篇文章主要介紹了SQLSERVER因錯(cuò)誤9003啟動(dòng)不起來(lái)的解決方法,大家參考使用吧2013-11-11SQL Server誤區(qū)30日談 第30天 有關(guān)備份的30個(gè)誤區(qū)
備份不會(huì)導(dǎo)致對(duì)用戶對(duì)象加鎖,雖然備份對(duì)IO系統(tǒng)的負(fù)擔(dān)導(dǎo)致看起來(lái)阻塞了,但實(shí)際上不會(huì)。唯一的特例是當(dāng)備份包含到那些最小日志操作涉及到的數(shù)據(jù)區(qū)需要被加鎖時(shí),這個(gè)操作會(huì)阻塞CheckPoint,但DML操作永遠(yuǎn)不會(huì)受到備份操作的阻塞2013-01-01sqlserver數(shù)據(jù)庫(kù)危險(xiǎn)擴(kuò)展刪除和恢復(fù)代碼
今天為了實(shí)現(xiàn)sqlserver的復(fù)制功能,因?yàn)橐郧皠h除了很多的sqlserver的一些會(huì)導(dǎo)致不安全因素的擴(kuò)展,導(dǎo)致很多功能無(wú)法用,沒有辦法需要重新的恢復(fù)擴(kuò)展。2010-07-07sqlserver 文件數(shù)據(jù)庫(kù)和關(guān)系數(shù)據(jù)庫(kù)的比較
本文概要地從數(shù)據(jù)格式、數(shù)據(jù)庫(kù)結(jié)構(gòu)和WEB發(fā)布數(shù)據(jù)三個(gè)方面比較了文件數(shù)據(jù)庫(kù)和關(guān)系數(shù)據(jù)庫(kù)的異同,同時(shí)差別了文件數(shù)據(jù)庫(kù)和過(guò)去存儲(chǔ)數(shù)據(jù)的文件系統(tǒng)的不同2011-10-10SQL學(xué)習(xí)筆記八 索引,表連接,子查詢,ROW_NUMBER
SQL學(xué)習(xí)筆記八 索引,表連接,子查詢,ROW_NUMBER,學(xué)習(xí)sqlserver的朋友可以看下。2011-08-08