前言:
很多很多地方对于语句的优化,一般比较靠谱的回复即使——把执行计划发出来看看。当然那些只看语句就说如何如何改代码,我一直都是拒绝的,因为这种算是纯蒙。根据本人经验,大量的性能问题单纯从语句来看很难发现瓶颈,同一个语句,由于环境的不同,差距非常大,所以比较合适的还是分析执行计划。
那么对于执行计划,一般使用图形化执行计划就差不多了,但是用过的人也有一些疑惑,里面的图标(称为操作符)并不非常直观。所以从本文开始,会整理一些不怎么常见但由比较重要的操作符并进行解释,对于那些表扫描、索引扫描、聚集索引扫描、索引查找、聚集索引查找这些非常常见的操作符,暂时不打算介绍。
只有了解一些重要且常见的操作符,才能对语句进行准确有效的性能分析和优化。
本系列文章预计包含下面操作符:
- 断言:Assert (英文版本图形化界面的名字,中文版本中XML格式的执行计划和TEXT格式的执行计划的名字。下同)
- 串联:Concatenation
- 计算标量:Compute Scalar
- 键查找:Key Lookup
- 假脱机:Spools
- 表假脱机:Lazy Spool
- 索引假脱机:Index Spool
- 行计数假脱机:Row CountSpool
- 流聚合:Stream Aggregate
- 排序:Sort
- 合并联接:Merge Join
- 合并间隔:Merge Interval
- 拆分、折叠:Split,Collapse
接下来从断言开始介绍。原文出处:http://blog.csdn.net/dba_huangzj/article/details/50261747
断言:
其图标为:
Assert 运算符用于验证条件。例如,验证引用完整性或确保标量子查询返回一行。对于每个输入行,Assert 运算符都要计算执行计划的 Argument 列中的表达式。如果此表达式的值为 NULL,则通过 Assert 运算符传递该行,并且查询执行将继续。如果此表达式的值非空,则将产生相应的错误。
断言与Check约束:
先来看看这段代码,在服务器执行时,先创建测试环境,使用TempDB是不错的选择: