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 (但通常是没有必要的啦, 因为这个不会很慢)