参考:
http://blog.csdn.net/luoyanqing119/article/details/17022649
1. 开启方式
菜单栏:query---Display Estimated Execution Plan
图标栏:Display Estimated Execution Plan
2. 执行计划的图表是从右向左看的
开销--看百分比,
数据量--看箭头粗细
做了什么--鼠标悬停
<-----------
<-----------
<-----------
3. 查找数据的几种方式 (尽量实现后面的两种)
[Table Scan] 表扫描(最慢),对表记录逐行进行检查
[Clustered Index Scan] 聚集索引扫描(较慢),按聚集索引对记录逐行进行检查
[Index Scan] 索引扫描(普通),根据索引滤出部分数据在进行逐行检查
[Index Seek] 索引查找(较快),根据索引定位记录所在位置再取出记录
[Clustered Index Seek] 聚集索引查找(最快),直接根据聚集索引获取记录
4. 应对和分析慢查询的思路:
先检查哪些操作的成本比较高,再看看那些操作在查找记录时用scan,则要考虑增加索引来解决。注意添加索引后,也会影响数据表的修改动作
然后可以试试调整语句结构,引导SQL Server采用其它的查询方案去执行(比如使用临时表、CTE、更高效的查询等)
离散度不太大的数据,比如0/1这样的数据,可以考虑使用分区
5. 常见的优化:
为【scan】这类操作增加相应字段的索引
有时重建索引或许也是有效的,具体情形请参考后文
调整语句结构,引导SQL Server采用其它的查询方案去执行
调整表结构(分表或者分区)
提高硬件性能或者调整OS,内存,CPU,SQL Server的设置
6. 视图的优化:
视图也是由一个查询语句定义,多数时候不是直接使用原表,会加上where语句
优化视图时, 最好能根据实际需求,应用不同的过滤条件,再来决定如何去优化
SQL Server实现Join的方式:
1. Nested Loops Join 一张大表,一张小表
2. Merge join 两张表有排序,或者经扫描排序的索引而获得的数据
3. Hash Join 未排序的大型非索引输入