查询处理和执行----查询优化(1)

查询优化器的工作就是接收查询树并找到一个获取数据(结果)的好方式。查询优化处理基于成本原则,这个成本是抽象的测量值,用于评估不同的查询计划选项。SQL Server团队提供的当前模式工作如下:

  • 是否已缓存了有效的计划? 如果是则使用缓存的计划;否则继续
  • 是不是一个微不足道的(trivial)计划?如果是则使用这个trivial plan;否则继续
  • 应用简化。简化就是对查询树进行正规化(normalizing)的过程,并应用一些基本的转换来简化查询树。
  • 计划是否足够低成本?如果是则使用;否则就开始优化
  • 开始基于成本的优化
  • 阶段0----探索基本的规则、哈希和嵌套的连接选项
  • 计划的成本是否低于0.2?如果是则使用;否则继续
  • 阶段1----探索更多的规则以及可替换的连接排序。如果最好的(成本最低的)计划成本低于1.0,那么就使用该计划。否则,如果MAXDOP>0、是SMP系统、最低成本>并行的成本阈值,那么就使用并行(parallel)计划。比较并行计划和最佳串行计划的成本,并将成本更低者传到阶段2。
  • 阶段2----探索所有的选项,在有限数量的探索中选择成本最低的计划(the cheapest plan)。

上面所诉步骤的输出结果是能够放入缓存的可执行的计划。这个计划之后被安排执行。你可以通过sys.dm_exec_query_optimizer_info查看优化过程的内部工作状况,该DMV包含一组优化属性。如下图所示的其中部分counter,其中optimizations的occurrence(61)=search 0(21)+search 1(20)+search 2(0)+trivial plan(20)。

查询处理和执行----查询优化(1)_第1张图片

并行计划

并行计划是优化器选择的一个计划,它用来将合适的操作符(operator)分离到多个并行运行的线程。不是所有的的操作符都适合用于并行计划。优化器仅在下面的情形下选择并行计划:

  • 服务器有多个处理器
  • 最大并行度的设置允许并行计划,并且SQL Server配置选项cost threshold for parallelism的值(以时间秒为单位)要设置得比当前计划的最低成本估算更低
  • 并行计划的成本要低于串行计划

如果以上条件都满足,那么优化器就会选择并行操作。

Algebrizer树

解析器的输出结果是解析树,解析树不会永久保存,因而不能看到它的模样;而Algebrizer的输出结果是Algebrizer树,它会存储视图、默认值和约束,因为这些对象会经常被其他查询复用。这些对象存放在缓存,条件是type=CACHESTORE_PHDR:

select *
from sys.dm_os_memory_cache_entries
where type = 'CACHESTORE_PHDR'

sql_handle或plan_handle
sql_handle和plan_handle都是哈希值:sql_handle是原始T-SQL源的哈希,而plan_handle是缓存计划的哈希。SQL是自动参数化的,因此两者的关系意味着多个sql_handle可以映射到一个 plan_handle。可以通过sys.dm_exec_sql_text (sql_handle | Plan_handle)查看原始T-SQL,通过sys.dm_exec_query_plan (plan_handle)查看计划的XML showplan。

理解统计

统计为SQL Server执行查询优化提供关键信息。统计包含数据的细节以及数据在表中的模样。查询优化处理利用统计来决定一个查询需要为一个给定的查询计划访问多少行。它使用这个信息为计划的每一步估算成本。统计是SQL Server根据查询自动创建的,其前提是AUTO_CREATE_STATISTICS选项被设置为ON。统计可以在SSMS里面看到,如下图。

查询处理和执行----查询优化(1)_第2张图片

要看实际的统计值,可以在属性页-->细节或通过DBCC查看,如下图:

查询处理和执行----查询优化(1)_第3张图片

下面的配置选项控制着如何创建统计:

Auto_create_statistics

Auto_update_statistics

Auto_update_statistics_asynchronously

你可能感兴趣的:(查询处理和执行----查询优化(1))