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 (但通常是沒有必要的啦, 因爲這個不會很慢)