T-SQL注意事项
文章平均质量分 78
發糞塗牆
MVP, TOGAF, MCSE, Azure Solution Architect
展开
-
理解性能的奥秘——应用程序中慢,SSMS中快(6)——SQL Server如何编译动态SQL
本文属于《理解性能的奥秘——应用程序中慢,SSMS中快》系列接上文:理解性能的奥秘——应用程序中慢,SSMS中快(5)——案例:如何应对参数嗅探翻译 2016-11-30 16:41:36 · 6506 阅读 · 1 评论 -
T-SQL执行内幕(8)——数据存储
本文属于SQL Server T-SQL执行内幕系列 前面提到了数据访问,那么如何访问?访问什么?为此必须介绍一下数据存储的概念。SQL Server以三种方式存储和组织数据:均可从sys.partitions中查到Heaps:堆,指没有聚集索引(注意主键并非一定是聚集索引)的表。另外诸如select …into … from …语句生成的表也是堆表。SQL Server堆结构 在sy...原创 2018-03-31 11:16:37 · 966 阅读 · 0 评论 -
T-SQL执行内幕(9)——数据访问
本文属于SQL Server T-SQL执行内幕系列 在执行树的叶子端(通常就是图形化执行计划每个分支的最右端),一般是实际访问数据的操作符。当调用这些操作符上的next()方法时,会返回表或者索引上的实际数据。数据访问通常有三类可能的操作符:Scan: 各类扫描,扫描操作会在数据上循环访问所有的行。它永远不会定位一个特定的行,取而代之的是扫描整个数据集。在执行计划中常见的扫描操作符有...原创 2018-03-31 15:14:04 · 915 阅读 · 0 评论 -
T-SQL执行内幕(10)——读取数据
本文属于SQL Server T-SQL执行内幕系列 关系型数据库的数据访问操作总是从内存的缓存中读取数据而不是从磁盘中读取。这个缓存称为Buffer Pool。如果数据访问操作符未能在缓存中找到所需的数据,那么就需要从磁盘中加载,这就会产生一个磁盘I/O读(set statistics io on中的物理读),并且需要等待这个物理读完成(及从磁盘找到数据并加载到缓存为止)之后,才能进行操作...原创 2018-03-31 15:39:06 · 1111 阅读 · 0 评论 -
T-SQL执行内幕(11)——Read Ahead
本文属于SQL Server T-SQL执行内幕系列 每当操作读取页的数据,意味着这些数据需要固定到缓存(buffer pool)中。这个时候可能会导致操作被阻塞,因为当所需要的数据不在内存时,需要把数据从磁盘载入内存,这个时候操作需要等待页从磁盘搜索并载入内存。如果由于系统负担很重或者载入的量很大,磁盘I/O响应不及时,那么此时操作就会被阻塞(stall),性能将会暴跌。 从现实生...原创 2018-03-31 15:52:53 · 1644 阅读 · 1 评论 -
T-SQL执行内幕(6)——返回结果
本文属于SQL Server T-SQL执行内幕系列 在执行引擎按照执行计划的要求把数据成功检索之后,就需要把数据返回给客户端。这里的结果不是单纯的数据库引擎完成查询数据之后的结果,而是客户端(如SSMS)接收到数据的结果。一旦数据已经“填满”执行树的各个操作符,那么最顶端的根操作符就会负责把数据写入网络缓存(network buffer)并把这些数据发送给客户端。 结果集并不是直接...原创 2018-03-28 15:54:10 · 1037 阅读 · 0 评论 -
T-SQL执行内幕(5)——执行
本文属于SQL Server T-SQL执行内幕系列 一旦优化器选择了开销最低的预估执行计划之后,就会把预估执行计划转换成实际执行树(Actual Execution Tree)进行查询执行。树的每个节点都是一个操作符。操作符及一系列的有向箭头(代表数据流的方向及结果集的数据量(箭头粗细)) 组成了整个执行计划,这里指的是图形化执行计划。 所有的操作符都实现一个具有三个方法(open...原创 2018-03-28 15:19:38 · 1140 阅读 · 0 评论 -
理解性能的奥秘——应用程序中慢,SSMS中快(1)——简介
在工作中发现有不少类似的现象,有幸看到国外大牛写的一篇文章,由于已经完善得不能再添油加醋,所以决定直接翻译,原文出处:http://www.sommarskog.se/query-plan-mysteries.html#defaultsettings 本人水平有限,如果读者觉得自己英语过得去,建议阅读原文。在翻译过程中,不排除会对某些部分进行修改,但不会影响最终效果。 由于内容较多,所以把文章拆翻译 2016-11-14 23:24:30 · 4524 阅读 · 0 评论 -
理解性能的奥秘——应用程序中慢,SSMS中快(2)——SQL Server如何编译存储过程
本文属于《理解性能的奥秘——应用程序中慢,SSMS中快》系列 接上文:理解性能的奥秘——应用程序中慢,SSMS中快(1)——简介 本文介绍SQL Server如何编译存储过程并使用计划缓存。如果你的应用程序完全没有用到存储过程,而是直接使用SQL语句提交请求,那么本文大部分内容也是有效的。但是关于动态SQL的编译会在后面章节介绍,这里重点关注让人头痛的存储过程问题。什么是存储过程? 虽然这个问题有...翻译 2016-11-15 10:38:44 · 6901 阅读 · 0 评论 -
理解性能的奥秘——应用程序中慢,SSMS中快(3)——不总是参数嗅探的错
本文属于《理解性能的奥秘——应用程序中慢,SSMS中快》系列 接上文:理解性能的奥秘——应用程序中慢,SSMS中快(2)——SQL Server如何编译存储过程 在我们开始深入研究如何处理参数嗅探相关的性能问题之前,由于这个课题过于广泛,所以首先先介绍一些跟参数嗅探没有直接关系的内容,但是又会导致语句在SSMS和应用程序中存在性能差异的情况。替换变量和参数: 前面已经接触过,但是在这里对其进行扩...翻译 2016-11-17 10:49:30 · 4914 阅读 · 1 评论 -
理解性能的奥秘——应用程序中慢,SSMS中快(5)——案例:如何应对参数嗅探
本文属于《理解性能的奥秘——应用程序中慢,SSMS中快》系列 接上文:理解性能的奥秘——应用程序中慢,SSMS中快(4)——收集解决参数嗅探问题的信息翻译 2016-11-28 15:42:31 · 6899 阅读 · 0 评论 -
理解性能的奥秘——应用程序中慢,SSMS中快(4)——收集解决参数嗅探问题的信息
本文属于《理解性能的奥秘——应用程序中慢,SSMS中快》系列 接上文:理解性能的奥秘——应用程序中慢,SSMS中快(3)——不总是参数嗅探的错翻译 2016-11-22 11:50:01 · 5467 阅读 · 1 评论 -
T-SQL执行内幕(2)——Tasks、Workers、Threads、Scheduler、Sessions、Connections、Requests
本文属于SQL Server T-SQL执行内幕系列 接上文:T-SQL执行内幕(1)——简介 本节以介绍一些基础的但又容易混淆的概念。包括:Tasks、Workers、Threads、Scheduler、Sessions、Connections、RequestsScheduler:计划程序,特指SQL OS的Scheduler,用于管理SQL Server中的线程调度的对象,每个计划...原创 2018-03-23 14:57:08 · 1305 阅读 · 0 评论 -
T-SQL执行内幕(1)——简介
本文属于SQL Server T-SQL执行内幕系列前言: 本文主体内容来自于:http://rusanu.com/2013/08/01/understanding-how-sql-server-executes-a-query/但是经常打不开,本人又在:https://www.codeproject.com/Articles/630346/Understanding-how-SQL-Ser...原创 2018-03-23 14:54:46 · 2651 阅读 · 0 评论 -
T-SQL执行内幕(3)——解析和编译
本文属于SQL Server T-SQL执行内幕系列 接上文,当请求被任务接收同时得到工作线程指派执行后,就开始在SQL Server内部进行运作。当请求被执行时,第一步就是要先解析(Parsing)请求,把TDS数据流转换成SQL Server可识别的格式。 从客户端发送的是T-SQL文本,然后转换成TDS数据流,到达SQL Server之后变回T-SQL文本。但是由于纯T-SQL文...原创 2018-03-23 16:53:32 · 1321 阅读 · 0 评论 -
T-SQL执行内幕(4)——优化
本文属于SQL Server T-SQL执行内幕系列 接上文,当解析和编译完成后,请求的生命周期就进入下一步——优化(Optimisation)。在SQL语言中,优化的本质就是找最好的路线。意思是在多种可能的候选数据访问方式中选择最佳一个。比如两表关联的简单查询语句,每个表有1个索引,那么就有4种可能的数据访问方式(AB两表的索引扫描、AB两表的索引查找,A扫描B查找、A查找B扫描)。随着表...原创 2018-03-28 14:30:48 · 1397 阅读 · 0 评论 -
T-SQL执行内幕(7)——内存授予
本文属于SQL Server T-SQL执行内幕系列 前面提到,在执行过程中,很多操作符都需要内存来支持运作。比如Sort操作符,需要存储所有的输入以便进行排序,而Hash操作,为了创建大型的hash表,也需要申请资源来存储数据。 基于操作符的类型和预估的影响行数及列的大小(这些都可以从统计信息获得),执行计划可以知道这些操作符需要的大概内存。整个执行计划所需的内存总和称为内存授予(M...原创 2018-03-30 15:31:50 · 1026 阅读 · 0 评论