一句简单的SQL查询语句的背后...
当我们在SQL Server Management Studio的查询里面输入: SELECT * FROM t1 WHERE c1=2;
背后发生了什么?数据库怎么去执行查询的? - 知其然不知其所以然。
1. Query Parsing, Synatax Error Check, and Authorization: Query Processer check the user is authorized to run the query;(查询处理器首先进行语法解析,语法检查,并检查授权。如果没有获得授权执行相关的操作,或者语法错误,将报错。)
2. Query Re-writing,Semantic Optimization; (查询处理器重新写SQL语句并做相应的优化)。
例如:SELECT Emp.name, Emp.salary
FROM Emp, Dept
WHERE Emp.deptno = Dept.dno
Join是多余的,查询处理器会重写该语句并删除到表Dept的Join。
3. Compile the SQL into internal query Plan; (编译SQL到内部查询计划)
数据库会选择最佳的方法来计算结果集。例如进行全表扫描,或是使用索引(pairs of key and location,类似书的目录)。数据库会比较它们的成本,并形成内部执行计划。数据库内部负责计算选择最佳执行计划的组件叫优化器(Optimizer)。
4. The query plan is handled by plan executor, which consists of many operators, e.g. joining, sorting, grouping... (查询计划被计划执行器执行。计划执行器包含很多操作者,例如执行Join, Sort, Group等,还要有访问方法管理器来决定存取哪些数据页或索引页,或是直接缓存命中,这些有缓冲管理器负责... ...)
5. Transaction manager is started as well to ensure the ACID of operations. (事务管理器同时启动来保证原子操作的并发一致性, 其他例如锁管理器、索引管理器、行管理器、页面文件管理器、缓冲管理器、日志管理器和等也会执行,而不是有查询执行器一人包办所有。)
执行如下语句:SELECT * FROM t1 WHERE c1=2的简单过程:
1. 扫描t1表,如果是开始则取第一条记录,否则取下一条记录;如果读到表的最后一条记录了那么跳到第4步。
2. 检查记录是否满足WHERE条件;是则进入第3步,否则回到第1步。
3. 把记录加到结果集。
4. 返回结果集给客户端。
如果表有索引,优化器可能比较全表扫描和索引,并可能决定执行计划为扫描索引。则步骤类似,不过第1步变成:
扫描索引(Clustered or no-clustered)并定位到记录。
例如:
SELECT * FROM Customers WHERE contactID IN
(SELECT contactID FROM Contacts WHERE contactID=86)
ORDER BY CustomerName DESC;
增加的步骤有:
1. 在表[Contacts]中扫描索引并定位记录。
2. 在表[Customers]中扫描索引并定位记录。
3. Hash match (inner join),哈希匹配,连接。
4. Sort,排序
有关Join
SQL Server employs three types of join operations:
- Nested loops joins
- Merge joins
- Hash joins
- 如果Join的输入很小,例如小于10行,然后其他的Join输入很大并且索引在其列上,则Nested loops joins是最快的。(原因参考Understanding Nested Loops Joins)
- 如果两个Join输入都不小,但在索引列上排序(例如是在扫描排序的索引后获得的 scanning sorted indexes),则Merge joins是最快的。(原因参考Understanding Merge Joins)
- Hash joins可以有效的处理大量的、没有排序的、没有索引的输入。尤其对复杂查询的中间结果处理很有效。(更多参考Understanding Hash Joins)
这些只是一些简单的过程,其实数据库内部执行过程是相当复杂的。虽然我们不是数据库开发人员,但了解上下游的知识是必须的,能够有助于我们的开发和应用。技术不仅要知道怎么用,而且要知道为什么,不能知其然不知其所以然。最后附上一张数据库内部简单结构图供有兴趣的人参考。
转载于:https://www.cnblogs.com/Mainz/archive/2008/07/31/1257000.html
一句简单的SQL查询语句的背后...相关推荐
- MySQL番外篇:一条SQL查询语句是如何执行的?
在面试的过程中,有的面试官会给出一条简单的SQL查询语句,让简单说一下执行的过程. SELECT * FROM emp where age=30; 以下问MySQL的基本架构图,从中可以看出SQL语句 ...
- 【mysql技术内幕1】mysql基础架构-一条SQL查询语句是如何执行的
文章目录 1 一条SQL查询语句是如何执行的 2 mysql体系结构 3 InnoDB存储引擎 4 总结 1 一条SQL查询语句是如何执行的 通常我们使用数据库,都是将数据库看成一个整体,我们的应 ...
- SQL查询语句大全(转)
转自https://www.cnblogs.com/chenglc/p/8421492.html 重点参考https://blog.csdn.net/g1418377085/article/detai ...
- (转)经典SQL查询语句大全
一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...
- 听说你写sql很溜,一条sql查询语句是如何执行的?
我们项目中必不可少要与数据库接触,那么一条sql查询语句是如何执行的呢? 本文以MySQL数据库为例.MySQL是典型的C/S架构(client客户端/server服务端),客户端进程向服务端进程发送 ...
- orcal SQL查询语句大全集锦
orcal SQL查询语句大全集锦 一. 简单查询 简单的Transact-SQL查询只包括选择列表.FROM子句和WHERE子句.它们分别说明所查询列.查询的 表或视图.以及搜索条件等. 例 ...
- (走向DBA[MSSQL篇] - 从SQL语句的角度提高数据库的访问性能)一些SQL查询语句应加上nolock
http://kb.cnblogs.com/page/124787/#s8 最近公司来一个非常虎的DBA,10几年的经验,这里就称之为蔡老师吧,在征得我们蔡老同意的前提下 ,我们来分享一下蔡老给我们带 ...
- SQL查询语句 select 详解
查询select: 1.单表查询 2.多表查询 3.嵌套查询分类 1)单表查询 2)多表查询 A.连接查询 B.子查询 ①一般子查询 ②相关子查询*************************** ...
- 15个初学者必看的基础SQL查询语句
1.创建表和数据插入SQL 我们在开始创建数据表和向表中插入演示数据之前,我想给大家解释一下实时数据表的设计理念,这样也许能帮助大家能更好的理解SQL查询. 在数据库设计中,有一条非常重要的规则就是要 ...
最新文章
- android 全局光标颜色,EditText修改光标和背景色(绝对简单实用)
- es中的DiscoveryModule
- 如何统计博客园的个人博客访问量
- SAP 电商云 Spartacus UI 从 shipping address 到 shipping method 的 HTTP 请求设计
- JDK 11:轻松取出单文件Java源代码程序
- Linux epoll的用法
- Python高能小技巧:了解bytes与str的区别
- 电脑应用程序错误怎么办_电脑Windows出错信息解析及解决方案
- 5个层次的赚钱模式,看看你是哪一种?
- java中 this详解
- 单片机控制10BitDA正弦信号发生器 PROTEUS 和51单片机教程(附仿真文件+源代码)
- win7显示文件的扩展名
- 威斯康星大学计算机科学教授,UW机器学习和数据科学活动吸引了国际知名的计算机科学家...
- 推荐几款地图软件,你家的老房子都能看得一清二楚
- html仿qq截图,截图工具(仿QQ截图,大致功能都已实现)
- 电脑死机是什么原因及解决方法
- NOIWC2018滚粗记
- azw3格式的电子书在kindle中怎么打开
- 计算机义务维修活动方案,最新义务维修活动策划书
- 程序员众生相——从乙方到甲方,我用了六年的时间
热门文章
- Java合并pdf文件
- 使用OpenCV进行多边形绘制和填充
- GoldenGate系统三:trouble shooting and log
- Linux命令学习总结:dos2unix - unix2dos
- Private Data Manipulation in Optimal Sponsored Search Auction
- Ctr点击率预估理论基础及项目实战
- 缓存穿透、缓存雪崩、redis并发
- iOS项目组件化历程
- Unity应用架构设计(6)——设计动态数据集合ObservableList
- Mybatis choose (when, otherwise)标签