亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

寫有效率的SQL查詢(I)

系統 1911 0

大型系統的生產環境,一般情況下,我們評價一條查詢是否有效率,更多的是關注邏輯 IO( 至于為什么,回頭補一篇 ) 。我們常說,“要建彪悍的索引”、“要寫高效的 SQL ”,其實最終目的就是在相同結果集情況下,盡可能減少邏輯 IO

1.1 ???? where 條件的列上都得有統計信息。

沒統計信息 SQLServer 就無法估算不同查詢計劃開銷優劣,而只能采用最穩妥的 Scan (不管是 table scan 還是 clustered index scan )。一般情況下我們不會犯這種錯誤—— where 條件里不使用非索引列是個常識。索引上的統計信息是無法刪除的。

1.2 ???? 盡量不使用不等于( != )或者 NOT 邏輯運算符。

這條規則被廣為傳頌,原因據聯機文檔和百敬同學的書講,也是 SQLServer 無法評估不同查詢計劃開銷的優劣。但是 SqlServer2k5 聰明了很多,試驗發現盡管用了 != 或者 not ,查詢還是會被優化。如下:

create table tb1

(

??? col1 int identity ( 1 , 1 ) primary key ,

??? col2 int not null,

??? col3 varchar ( 64 ) not null

)

create index ix_tb1_col2 on tb1

(

??? col2

)

create index ix_tb1_col3 on tb1

(

??? col3

)

declare @f int

set @f = 0

while @f < 9999

begin

??? insert into tb1 ( col2 , col3 ) values ( 1 , 'ssdd' )

??? set @f = @f + 1

end

insert into tb1 ( col2 , col3 ) values ( 0 , 'aadddd' )

insert into tb1 ( col2 , col3 ) values ( 2 , 'bbddd' )

insert into tb1 ( col2 , col3 ) values ( 3 , 'bbaaddddddaa' )

通過上述代碼,各位可以看到數據分布。 col2 值為 1 的有 9999 條; col2 值為 0 、 2 、 3 的分別有 1 條。

按照本條規則, != NOT 帶來的應該是個 scan 操作,但實際情況是:
??? 寫有效率的SQL查詢(I)
寫有效率的SQL查詢(I)

SQL2k5 很聰明,它依據統計信息分析得出來,應該采用 index seek 而不是 index scan 。( 稍微解釋解釋 index seek index scan :索引是一顆 B 樹, index seek 是查找從 B 樹的根節點開始,一級一級找到目標行。 index scan 則是從左到右,把整個 B 樹遍歷一遍。假設唯一的目標行位于索引樹(假設是非聚集索引,樹深度 2 ,葉節點占用 k 頁物理存儲)最右的葉節點上(如上例)。 index seek 引起的 IO 4 ,而 index scan 引起的 IO K ,性能差別巨大。關于索引,可以仔細讀讀聯機文檔關于物理數據庫體系結構部分 )。

1.3 ???? 查詢條件中不要包含運算

這些運算包括字符串連接(如: select * from Users where UserName + ‘pig’ = ‘ 張三 pig’ ),通配符在前面的 Like 運算(如: select * from tb1 where col4 like ‘%aa’ ),使用其他用戶自定義函數、系統內置函數、標量函數等等(如: select * from UserLog where datepart(dd, LogTime) = 3 )。

???????? SQLServer 在處理以上語句時,一樣沒辦法估算開銷。最終結果當然是 clustered index scan 或者 table scan 了。

1.4 ???? 查詢條件中不要包含同一張表內不同列之間的運算

所謂的“運算”包括加減乘除或通過一些 function (如: select * from tb where col1 – col2 = 1997 ),也包括比較運算(如: select * from tb where col1 > col2 )。這種情況下, SQLServer 一樣沒辦法估算開銷。不論 col1 col2 上都有索引還是創建了 col1 col2 上的覆蓋索引還是創建了 col1 include col2 的索引。

但是這種查詢有解決辦法,可以在表上多創建一個計算字段,其值設置為你的“運算”結果,再在該字段上創建一個索引,就 Ok 了。

?

?

To Be Continue…

(II)中將介紹統計信息值分布不均勻對查詢的影響和如何避免這些影響,捎帶更多的說說返回多行結果時,為啥SQLServer有時會選擇index seek,而有時會選擇index scan。
(III)中主要介紹傳說中的“Foldable”和“NonFoldable”表達式。并舉例說說所謂的“Nonfoldable"表達式某些情況下也不是那么可怕。
(IV)中則主要說說在程序中執行SQL。如:安全性,拼SQL、參數化SQL和存儲過程之間對DB來說有什么區別,參數化SQL的一些技巧。捎帶著,會大概介紹介紹SQLServer的Buffer Pool

寫有效率的SQL查詢(I)


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦?。?!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产精品久久一区 | 99r8这里精品热视频免费看 | 国产精品2020在线看亚瑟 | 免费尤物视频 | 麻豆国产精品 | 午夜精品久久久久久久99热浪潮 | 欧美高清视频www夜色资源 | 国产精品久久久久久久久久久威 | 国产综合网站 | 香蕉成人啪国产精品视频综合网 | 国产视频欧美 | 狠狠操夜夜爽 | 亚欧在线免费观看 | 国产成人综合亚洲欧美在 | 九九99九九精彩网站 | 深夜在线网站 | 青青青在线观看免费视频精品 | 天天躁日日躁成人字幕aⅴ 天天躁日日躁狠狠躁黑人躁 | 全免费a级毛片免费看视频免 | 国产四虎 | 亚洲国产日韩欧美综合久久 | 亚洲欧美卡通成人制服动漫 | 色费女人18毛片a级视频在线 | 亚洲国产99在线精品一区二区 | 久艹在线播放 | 鲁一鲁射一射 | 极品女神西比尔久久精品 | 国产精品乱码一区二区三区 | 国产一区二区三区乱码网站 | 天天碰天天操 | bbw下身丰满18ⅹxxⅹ | 日产国产欧美视频一区精品 | 一区二区成人国产精品 | 日日噜噜噜夜夜爽爽狠狠 | 久久精品国产精品亚洲20 | 色婷婷狠狠久久综合五月 | 欧美激情一区二区三级高清视频 | 天天曰夜夜曰 | 国产一级毛片视频 | 亚洲九九色 | 国产毛茸茸 |