当前位置: 首页 > news >正文

查询优化器

查询优化器
查询优化器是关系型数据库管理系统的核心之一,决定对特定的查询使用哪些索引、
哪些关联算法,从而使其高效运行。它是优化器中最重要的组件之一。
查询优化器(简称优化器)是 SQL Server针对用户的请求进行内部优化,生 成 (或重 用)执行计划并传输给存储引擎来操作数据,最终返回结果给用户的组件。SQL Server的 优化器是基于开销(cost-based)的优化器。通过针对特定DML语 句 (绝大部分DDL语句 不需要优化),借助统计信息(详见5.4节)及当前硬件信息,分析出一定数量的“可能的执
行方式”,即候选执行计划,最终选择一个最低开销的预估执行计划。所以,优化器是SQL
Server中对性能影响最大的组件,同一个语句,执行计划不同,就可能导致小时级别的差 异。简单来说.,优化器的任务就是生成预估执行计划,注意这里是预估而不是实际执行计
划。对于执行计划,将在第8章介绍。
理解优化器的工作原理能帮助DBA和开发人员编写更高效的语句。本章所用的示例来
源于 SQL Server 2008 R2 的示例数据库 AdventureWorks2008R2。
5 . 1 查询过程
从第3 章的图3-1中可以知道,SQL Server数据库引擎的核心组件包括:存储引擎和 査询处理器(也叫关系引擎)。存储引擎用于管理磁盘和内存之间的数据关系,维护数据的
一致性和优化并发性。关系引擎接收所有提交到SQL Server的DML语句,生成对应的“最 优”执行计划,然后执行这些计划,并返回所需的数据。

T-SQL语句是高级声明性语言,它仅告诉SQL Server要做什么,而不会告诉它要怎么 做。所以,当查询被接收时,第一步是进行语法分析。如果语法分析不通过,就会返回错
误并结束整个过程;如果通过,会生成SQL Server可以识别的格式,该格式称为查询树。 然后经过优化器的优化,生成最优的预估执行计划。
图5-1展示了一个查询的处理流程。

下面针对该流程做简要介绍。
1) 分析和绑定:如果输人的查询有效,会在这个过程中产生一个逻辑树,每个节点表
示查询需要执行的逻辑步骤,比如读取特定的表,进行inner join等。 2) 查询优化:针对上面产生的逻辑树,优化器会产生数个执行方案,这些方案是一
系列的物理操作,比如索引查找、哈希连接等。但是优化器往往无法产生所有可能的方案,
所以会针对资源及其他信息,评估每个方案的开销,并选择最低开销的方案,最后产生出
预估执行计划。
3) 执行查询,缓存执行计划:在该步骤中,执行计划被传输到存储引擎中执行,并把
计划缓存到内存中,这部分的内存称为plan cache。 待查询提交后,分析和绑定是第一个发生的操作。分析操作用于确保T-SQL语句可用,
即确定语法是否正确,比如检查是否把“ SELECT” 写错为“ SEELECT"。然后査询语句
会被转换成包含逻辑操作符的逻辑树,也称为分析树,这些逻辑操作符通常是查询中的逻
辑操作,比如访问Customer表并获取数据,执行inner join等。绑定操作最主要的是解决 命名问题(比如处理别名是否有误等问题),在产生分析树后,SQL Server需保证查询中的 所有对象都存在,然后产生代数树,并传输给优化器。
当代数树传送到优化器时,将通过开销预估模型分析,产生出一定数量的候选执行计

划并评估各个计划的开销,最后选择开销最低的执行计划。在这个过程中,会把代数树中
的逻辑操作映射成一些物理操作,这些物理操作会被执行引擎运行。执行引擎则根据这些
物理操作,执行一系列的实际数据操作,最终返回结果数据。至此,查询完毕。

 

转载于:https://www.cnblogs.com/zhouwansheng/p/9248125.html

相关文章:

  • malloc(0)的返回值
  • linux安装mysql5.7.19
  • Python(生成执行文件)
  • Dart4Flutter - 不可变性
  • Android Toolbar的使用 顶部标题栏+后退键
  • 物联网技术周报第 141 期: 使用 Alexa Voice 和 Raspberry Pi 构建图片识别应用
  • MySQL中sync_relay_log选项对I/O thread的影响分析
  • IIS发布网站Microsoft JET Database Engine 错误 '80004005'的解决办法,基于Access数据库...
  • 13、jmeter抓包之浏览器请求
  • HDU 5969 最大的位或【贪心/按位或/思维】
  • Linux内核中的锁——知识点
  • 浅谈Service Mesh体系中的Envoy
  • 3 .5 数据库引擎优化顾问
  • 在 Windows 中安装 Laravel 5.1.X
  • Linux下0号进程的前世(init_task进程)今生(idle进程)----Linux进程的管理与调度(五)【转】...
  • 2017前端实习生面试总结
  • Angular 2 DI - IoC DI - 1
  • es6--symbol
  • flutter的key在widget list的作用以及必要性
  • github从入门到放弃(1)
  • Java到底能干嘛?
  • js ES6 求数组的交集,并集,还有差集
  • JS 面试题总结
  • js数组之filter
  • Shadow DOM 内部构造及如何构建独立组件
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • 力扣(LeetCode)357
  • 学习Vue.js的五个小例子
  • 这几个编码小技巧将令你 PHP 代码更加简洁
  • 阿里云重庆大学大数据训练营落地分享
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #Z2294. 打印树的直径
  • #控制台大学课堂点名问题_课堂随机点名
  • (编译到47%失败)to be deleted
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (三)模仿学习-Action数据的模仿
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (十五)Flask覆写wsgi_app函数实现自定义中间件
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • .NET Core 和 .NET Framework 中的 MEF2
  • .NET Windows:删除文件夹后立即判断,有可能依然存在
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET连接MongoDB数据库实例教程
  • .Net中ListT 泛型转成DataTable、DataSet
  • @Data注解的作用
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116
  • []使用 Tortoise SVN 创建 Externals 外部引用目录
  • [④ADRV902x]: Digital Filter Configuration(发射端)
  • [APIO2012] 派遣 dispatching
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息
  • [codeforces]Checkpoints
  • [CQOI 2011]动态逆序对
  • [Flutter] extends、implements、mixin和 abstract、extension的使用介绍说明
  • [Grafana]ES数据源Alert告警发送