[译]SQL Passion Week 1: SQL Server如何执行一个查询

SQLpassion Performance Tuning Training Plan

个人学习翻译,如有谬误,请不吝指出,感谢.

   Week 1: SQL Server如何执行一个查询

 

  在我们进入SQL Server性能调优的繁杂细节之前, 我想先列举一下SQL Server如何执行一个查询(query)的结构,

这部分内容非常重要, 因为了解这些概念, 对我们以后的性能调优课程会理解的更加深刻.

  下面的图为我们展示了SQL Server执行查询过程中所包含的几个主要组成部分:

  

  SQL Server内部可以分离成两个部分: Relational Engine  Storage Engine. 其中在 relational engine 中最大的组件是 Query Optimizer .

它唯一的任务就是把我们传给SQL Server的查询产生一个物理执行计划(physical execution plan)

  读取数据

  

  首先,我们提交给SQL Server的查询经由Protocol Layer(协议层)传给Command Parser(命令解析器), 后者检查语法是否合法, 引用的表、列等对象是否正确.

Command Parser最后产生的结果就是所谓的Query Tree, 它描述了我们的查询结构, 为后续的Query Optimizer所用,从而产生执行计划.

  

  编译好的执行计划随后交由Query Executor执行, 但在执行之前,执行计划会先被Plan Cache缓存起来, 以作复用(Plan Cache是一个非常有用同时也非常危险的概念,后面在week10我们会谈到这些).

  

  在执行计划被缓存后, Query Executor开始和Storage Engine交互,执行每一个操作.

  

  当我们的查询需要访问数据(大部分都是select)时, Access Methods会先向Buffer Manager询问是否有我们想要读取的指定数据页(下一节我们来讲数据页: Pages, 现在你只要知道pages就是一个8kb的存储区间),

  Buffer Manager管理着Buffer Pool, 后者保存着很多数据页, 它是SQL Server中主要的内存消耗者, 我们可以在配置中设定它的大小Size.

  如果被请求的页已经存储在Buffer Pool中, 则可以立即被返回. 这称之为逻辑读(Logical Read). 如果被请求的页不存在于Buffer Pool中, 则Buffer Manager会异步发起一个IO操作, 将被请求页从存储系统中读进Buffer Pool中,这称之为物理读(Physical Read).

  整个查询必须等待物理读的异步操作完成才可以,我们在week22,再讨论等待的一些细节.

  一旦所有的请求页都读进了Buffer Pool,就会返回给Access Methods,然后执行计划完成后,处理完的数据就会经由protocal layer返回给应用程序.整个查询到此完成.

  修改数据

  当我们运行一些insert,update,delete等会修改数据的命令时, Storage Engine会额外用到Transaction Manager. 它的作用是写一条日志记录到Transaction log中, 以描述我们的操作产生了哪些变化. 这条日志记录会迅速的硬化, 并提交. 这意味着我们的SQL Server实例会尽可能快的处理事务日志. 页首先在内存中被改写,然后再写入到磁盘上, 这中间的过程我们称之为Check Point, 它每时每刻都在运行, 不断的向Buffer Manager请求脏页(dirty pages). 脏页即已在内存中产生了变化,但未及时写入到磁盘中的页. 一旦脏页写入到磁盘,就会被标记为干净页.

  总结

  如你所见, 当我们执行一个简单的查询时, SQL Server内部发生了许多的事情,不同的角色承担了不同的功能, 在调优过程中, 我们不得不应对每个角色都有可能产生的一系列性能问题.

时间: 2024-08-09 22:17:33

[译]SQL Passion Week 1: SQL Server如何执行一个查询的相关文章

第1周 SQL Server 如何执行一个查询

原文:第1周 SQL Server 如何执行一个查询 大家好,欢迎来到第1周的SQL Server性能调优培训.在我们进入SQL Server性能调优里枯燥难懂的细节内容之前,我想通过讲解SQL Server如何执行一个查询来建立基础.这个部分非常重要,因为接下来的培训中我们会以这些概念来加深我们对SQL Server的认识. 当我们执行一个查询时,在SQL Server中最重要的组件有哪些,下面这张图片可以给大家一个概观的认识. 可以看到,SQL Server内部分成了2个部分:关系引擎和存储

第1周 SQL Server 如何执行一个查询。

大家好,欢迎来到第1周的SQL Server性能调优培训.在我们进入SQL Server性能调优里枯燥难懂的细节内容之前,我想通过讲解SQL Server如何执行一个查询来建立基础.这个部分非常重要,因为接下来的培训中我们会以这些概念来加深我们对SQL Server的认识. 当我们执行一个查询时,在SQL Server中最重要的组件有哪些,下面这张图片可以给大家一个概观的认识. 可以看到,SQL Server内部分成了2个部分:关系引擎和存储引擎.在关系引擎中最大的一个组件是查询优化器.查询优化

[译]SQL Passion Week 2: SQL Server的基本存储单位--数据页

Week 2: SQL Server的基本存储单位--数据页 上周我们我们讲述了SQL Server如何执行一个查询, 顺带提到了数据页的概念, 这次我们从性能调优的角度上更详细深入的讲解一些数据页. 数据页是SQL Server最基础的存储单位, 所有的东西都和数据页有关. 当我们想提高查询的性能时, 必须想方设法降低查询的页读取数量. 以后讲到索引时, 还会涉及到更多索引的结构. 如果你不知道什么是页, 你就无法寻找SQL Server的故障原因. 数据页的结构 SQL Server中的页有

[译]SQL Passion Week 3: SQL Server的扇区管理

SQL Passion Week 3: SQL Server的扇区管理 混合扇区和统一扇区 SQL Server中每8个数据页作为一个扇区. 在混合扇区中, 其包含的8个页可以分别属于不同的数据库对象; 另一方面, 统一扇区里的8个页都属于同一个数据库对象. 为什么有这样一个区别呢, 这其实主要是因为一个历史遗留问题.  因为在上个世纪, 存储是非常昂贵的, 人们会尽可能有效的充分利用存储空间. 当一个表和索引最初创建时, 总是创建在一个混合扇区上, 先在8kb的空间里进行增长. 这样, 小的表

sql server 根据执行计划查询耗时操作

1 with QS as( 2 select cp.objtype as object_type, /*类型*/ 3 db_name(st.dbid) as [database], /*数据库*/ 4 object_schema_name(st.objectid,st.dbid) as [schema], /*架构*/ 5 object_name(st.objectid,st.dbid) as [object], /*对象名*/ 6 convert(char(16),qs.creation_ti

sql是如何执行一个查询的!

引用自:http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/ Understanding how SQL Server executes a query August 1st, 2013 If you are a developer writing applications that use SQL Server and you are wondering what exactly happens

[译]SQL Passion Week 5: 堆表

SQL Passion Week 5: 堆表 今天我们介绍下所谓的堆表(Heap table), 堆表就是没有聚集索引的表. 在SQL Server中,一个表如果包含聚集索引, 我们就称为索引表, 否则就称为堆表. 在堆表中, 数据是无序的, 它们只是杂乱的放在一起, 没有结构性. 当我们select一个堆表时, 如果没有合适的非聚集索引, SQL Server会使用表扫描(Table Scan)操作来检索数据, 而不是表查找(Table Seek). 表扫描意味着将扫描整个表, 数据越多, 耗

[译]SQL Passion Week 6: 聚集索引

SQL Passion Week 6: 聚集索引 每次我们给表创建主键(Primary key)时, 默认等于一个唯一聚集索引(Unique Clustered Index). 即表示主键所包含的column是唯一的,不重复的, 同时表的物理排序也是按照主键的顺序来排列的. 同样的, 我们也列举下聚集索引的优缺点 优点 聚集表的最大好处就是数据在磁盘中是有序存储的. 我们可以将其和字典比较, 我们可以轻松的找到某个字在哪一页. 聚集索引对于查询的意义巨大, 当我们用包含在聚集索引里的column

java.sql.SQLException: null, message from server: “Host ‘xxx’ is not allowed to connect

java.sql.SQLException: null, message from server: “Host ‘xxx’ is not allowed to connect 2014年06月29日 ⁄ 综合 ⁄ 共 637字 ⁄ 字号 小 中 大 ⁄ 评论关闭 java.sql.SQLException: null,  message from server: "Host 'xxx' is not allowed to connect to this MySQL server": j