查询处理和执行----查询计划

来源:互联网 发布:电视大师直播软件 编辑:程序博客网 时间:2024/05/09 20:40

查看查询计划的方式有如下几种:

1、上下文相关的菜单选项

 

2、set showplan_text on/off

 

3、set showplan_all on/off

4、set showplan_xml on/off

5、set statistics profile on/off

6、 使用DMF

Select * From sys.dm_exec_query_plan(plan_handle)Select * From sys.dm_exec_text_query_plan(plan_handle)

查询计划操作符

查询优化器可以使用多种不同的操作符来创建计划。这里将展示几个最常用的操作符。

Join操作符

Join操作符使SQL Server能够在两个表之间找到匹配的行。SQL Server有3种Join类型,它们处理来自两张表的行,对于自联接,输入可能是同一张表的不同行集。Nested loop有利于内部表有索引的小表;Merge join有利于有排序索引或输出需要排序的中等表;Hash join有利于中大型的表,对于并行计划表现不错,缩放好。

Nested Loop join会扫描一张表(外部表)的所有行,然后扫描另一张表(内部表)的每一行,如果行在内外表匹配,则该行就被包含在结果中。这种join的性能与每张表的行数成正比。通常行数少的表被选作内部表,行数多的用作外部表,如果两种表都有大量的行,那么join就会花费很长时间。

Merge join需要对输入分类,因此理想状况下,表应该对join列索引,然后操作符会同时迭代两种表的行,减少行,寻找匹配行。由于输入被排序,这使join能够迅速进行,一旦任何一个范围满足了就会停止。

Hash join操作分两个阶段。在第一阶段,被称为构建阶段(build phase),两种表中更小的那张表被扫描,并把行存到内存里的哈希表,但对于非常大的表,它可以写入磁盘。当每一行都被哈希了,第二阶段就开始了。第二阶段,被称为探索阶段(probe phase),两张表中更大的那张表的行被拿来和哈希表的内容比较,使用和构建阶段一样的哈希算法。任何匹配的行被传到输出。Has join能够处理非常大的表,在允许并行计划的多处理器系统上是个不错的选择。SQL Profiler事件在发生散列递归(hash recursion)或哈希释放(hash bailout)时会发出哈希警告。散列递归发生在哈希操作的输出不能完全装进内存。哈希释放发生在散列递归到达递归的最大水平,并且必须选择一个新计划。哈希警告是性能问题的潜在指标,其可能的解决方案是增加内存、确保join列上存在统计并且是最新的、强制使用不同类型的join。

Spool 操作符

Spool操作符用于创建来自输入流的行的临时副本,并把它们传送到输出流。Spool通常位于两个其他操作符之间,右边的是child,提供输入流;左边的操作符是parent,消耗输出流。下面列表为每个物理spool操作符提供简要的描述,这些是实际执行的操作符。你也可以参见逻辑操作符,其代表优化操作的更早阶段,在执行计划之前,这些操作符随后被转换为物理操作符。逻辑spool操作符是Eager Spool和Lazy Spool。

  • Index spool:读取child表中的行,放入tempdb,在继续之前在它们上面创建一个非聚集索引,这使得parent能够在基础表没有合适的索引时,利用这个非聚集索引搜索。
  • Row count spool:读取child表中的行,对行计数。这些行也会返回到parent,但没有任何数据,这使得parent能够确定是否存在行,来满足EXISTS或NOT EXISTS需求。
  • Table spool:读取child表中的行,写入tempdb。在parent开始处理行之前,child的所有行都被读到tempdb。
  • Window spool:这个运算符将每个行扩展为表示与行关联的窗口的行集。 它既是一个物理运算符,也是一个逻辑运算符。

Scan和Seek操作符

这两个操作符使SQL Server能够在需要较大量的行的时候,从表及索引中检索行。Scan操作符扫描表中所有行来寻找匹配的行。当匹配的行数超过表的20%,scan就开始胜过seek,因为seek有穿越索引到达每一行的额外成本。scan操作符变体有聚集索引扫描、非聚集索引扫描和表扫描。Seek操作符使用索引找到匹配的行。当查询仅需要相对小的行集时,seek比scan更快找到匹配的行;然而,当返回的行数超过表的20%时,seek的成本就会接近scan;当几乎需要整张表时,scan会比seek执行得快。seek操作符变体有聚集索引seek和非聚集索引seek。

Lookup操作符

Lookup操作符执行寻找单行数据的任务。常见的有:

  • Bookmark lookup:仅见于SQL Server2000及更早的版本。它是SQL Server使用聚集索引查找一行的方式。在SQL Server 2012,这一任务是Clustered Index Seek、RID lookup或Key Lookup完成的。
  • Key lookup:表有聚集索引返回单行。与堆(heap)相比,lookup是使用聚集键(key)实现的。SQL Server 2005 SP2添加了key lookup操作符。当前以text或XML格式查看计划时,这个操作符显示为带有关键字lookup的clustered index seek。
  • RID lookup:从一个堆里查找单行。RID引用内部唯一的行标识符,用于查找行。

阅读查询计划

各种形式的查询计划要从右下方开始阅读,到左上方。如下图所示,我们首先应该看的Index Scan,然后是Hash Match、Compute Scalar、Sort,最后是SELECT。

 

0 0
原创粉丝点击