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

 

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