SQL -- SQL Server 查询优化器(Query Optimizers)

Posted lizzzzzz

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SQL -- SQL Server 查询优化器(Query Optimizers)相关的知识,希望对你有一定的参考价值。

为了理解如何编写SQL Server的SQL代码,查询优化器的工作原理非常重要。
 
SQL Server查询优化器是一个基于成本的优化器。它分析给定查询的许多候选执行计划,估计每个计划的成本,并选择所考虑选择成本最低的计划。事实上,鉴于查询优化器不能为每个查询考虑每个可能的计划, 实际上它必须执行基于成本的平衡操作,同时考虑到查询潜在计划的成本和计划本身的成本。
 
因此,SQL Server组件对数据库的性能影响最大。当然,更好地理解查询优化器的工作方式也可以去帮助数据库管理员和开发人员编写更好的查询,并为查询优化器提供生成高效执行计划所需的信息。
 
  1. SQL Server查询优化器的工作原理
    1. 查询优化器如何工作?
      1. SQL Server 数据库引擎核心是两个主要组件:
        1. 存储引擎
          1. 负责以保持数据完整性的同时优化并发性的方式读取磁盘和内存之间的数据
        2. 关系引擎(查询处理器)
          1. 接受提交给SQL Server的所有查询,为其最佳执行设计一个计划,然后执行该计划并提供所需的结果
      2. 对于Sql server接收到的每个查询,查询处理器的第一个工作是尽可能快地设计一个计划,该计划描述了执行所述查询的最佳方式(或者至少是一种有效的方式)。其第二项工作是根据该计划执行查询。
    2. 查询处理的过程
      1. SQL statement -> Parsing (Parse Tree) -> Binding (Algebrized Tree) -> Query Optimization (Execution Plan) -> Query Execution -> Query Results
      2. 查询被解析和绑定:(此阶段输出是一个逻辑树,树中的每个节点代表查询必须执行的逻辑操作)
      3. 查询优化:
        1. 生成可能的执行计划:使用逻辑树,查询优化器设计了许多可能的方法来执行查询,即执行计划的数量
        2. 每个计划的成本评估:虽然查询优化器不会生成每个可能的执行计划,但它会评估它生成的每个计划的资源和时间成本。查询优化器认为其评估成本最低的计划被选中,并传递给执行引擎
        3. 查询执行,计划缓存:查询由执行引擎根据选定的计划执行,该计划可以存储在计划缓存中的内存中
      4. Parsing 解析:
        1. 解析确保T-SQL查询具有有效的语法,并将SQL查询转换为初始树表示形式(即表示执行相关查询所需的高级步骤的逻辑运算符树)
      5. Binding 绑定:
        1. 绑定确保所有对象名都存在,并将分析树上的每个表名和列名与系统目录中的对应对象相关联,输出代数树,然后将其发送到查询优化器
      6. Query Optimization 优化:
        1. SQL Server使用基于成本的优化器,并使用成本估算模型来估算每个候选计划的成本
          1. 实质上,查询优化是将树表示中表达的逻辑查询操作映射到可由执行引擎执行的物理操作的过程。
          2. 查询优化过程的最终产品是一个执行计划:一个由多个物理操作符组成的树,该树包含执行引擎为了从数据库中获得所需结果而要执行的算法
    3. 生成候选执行计划
      1. 理论上,为了找到查询的最佳执行计划,基于成本的查询优化器应该生成该搜索空间中存在的所有可能的执行计划,并正确估计每个计划的成本。但是,一些复杂的查询可能有数千个甚至数百万个可能的执行计划,而SQL Server查询优化器通常可以考虑大量的候选执行计划,但无法对每个查询的所有可能计划进行详尽搜索。
      2. 查询优化器必须在优化时间和计划质量之间取得平衡。
  2. SQL Server查询优化器的背景和挑战 
    1. 基数和成本估算 - 如何阅读和理解它们?
    2. 连接排序 - 查询优化中最复杂的问题之一
    3. 说明一下:如何以有效的顺序连接表可以提高查询的性能,但同时可以指数地增加执行次数?

以上是关于SQL -- SQL Server 查询优化器(Query Optimizers)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 查询优化器问题

Sql Server 优化 SQL 查询:如何写出高性能SQL语句

为啥 SQL Server 查询优化器有时会忽略明显的聚集主键?

从 SQL Server 查询优化器生成多个脚本

SQL Server的优化器会缓存标量子查询结果集吗

SQL Server 查询优化器执行不必要的连接