SQL Server – 執行計劃和各種 join 方式 (Execution plan & Join Pattern)

What, When, Why?

什麼是 Execution Plan?

Execution plan 裏頭包含了 query 執行時的各做 information, 比如 IO 速度, 查找了多少 rows 等等

爲什麼要看 Execution Plan?

當 query 慢的時候, 可以通過分析 execution plan, 知道它爲什麼慢, 然後做優化.

怎樣優化?

優化的方法有很多, 但絕大部分的情況加 index (索引) 就可以了.

總結

當我們發現 query 慢的時候就查看 execution plan, 然後添加 index, 通常它就快了.

 

Step by Step

開啓 execution plan

跑 query

select * from Test where FirstName = '781F9AB8';

看結果

execution plan 的讀法是 右到左 上到下

 

 

Table Scan

table scan 是最慢的, 它就是把所有 data 都調出來一個一個匹配, 完全沒有利用到 B+ tree 優勢.

遇到這種情況通常就是加 index.

query "where FirstName" 想查找的是 FirstName, 那就加 index 到 FirstName.

Clustered Index Scan

上面 Table Scan 是我刻意調的, 通常 table 都會有 primary + clustered index, 所以哪怕是全表掃描都不會出現 table scan.

反而是出現 Clustered Index Scan

但你不要以爲有個 index 字就會快, 它和 table scan 都是超級慢的. 也是 scan 了所有的 data.

總之 table scan 和 clustered index scan 都是慢的. 需要優化.

Index Seek 和 Key Lookup

在 FirstName 加上 index 後. 結果變成這樣

Index Seek 表示用到了 index 查找. 不用 read all data 了. 這個通常就能接受了.

之所以會有 Key Lookup 是因爲, 我 select *.

B+ Tree 的 data 是放在最低層樹葉的. 通過上層的 index 雖然定位到了 data. 但是依然需要去最底層 read data. 

這個 Key Lookup 指的就是這個操作過程. 

如果我把 query 換成

select FirstName from Test where FirstName = '781F9AB8';

那這個 Key Lookup 就沒了. 因爲 index 已經有 FirstName data, 就不用再到葉子節點 read data 了.

我們也可以把更多 data 寫入 index 來優化掉 Key Lookup (但通常是沒有必要的啦, 因爲這個不會很慢)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章