随笔分类 -  SQL性能调优

摘要:简介 数据库性能调优通常需要较高数据库水平,并伴随较多的前期准备工作,比如收集各种性能基线、不同种类的性能指标、慢SQL日志等,这通常费时费力且效果一般,当面对多个数据库时总体拥有成本会大幅增加。今天数据库早已迈入云时代,借助阿里云RDS for SQL Server Clouddba这一免费工具, 阅读全文
posted @ 2022-06-24 14:36 CareySon 阅读(1387) 评论(3) 推荐(3) 编辑
摘要:简介 在SQL Server中,针对复杂查询使用TOP子句可能会出现对性能的影响,这种影响可能是好的影响,也可能是坏的影响,针对不同的情况有不同的可能性。 关系数据库中SQL语句只是一个抽象的概念,不包含任何实现。很多元数据都会影响执行计划的生成,SQL语句本身并不作为生成执行计划所参考的元数据(提 阅读全文
posted @ 2016-01-21 17:10 CareySon 阅读(9590) 评论(12) 推荐(11) 编辑
摘要:在SQL Server中,子查询可以分为相关子查询和无关子查询,对于无关子查询来说,Not In子句比较常见,但Not In潜在会带来下面两种问题: 结果不准确 查询性能低下 下面我们来看一下为什么尽量不使用Not In子句。 结果不准确问题 在SQL Server中,Null值并不是一个值,而是表示特定含义,其所表示的含义是“Unkn... 阅读全文
posted @ 2015-11-11 06:36 CareySon 阅读(32235) 评论(20) 推荐(30) 编辑
摘要:本篇主题是我在2015年中国数据库大会(DTCC)上的分享,扩展事件从2008版本出来到现在已经有6-7年,国内却很少有相关资料和使用,现在分享一下PPT,希望对大家有所帮助。 可以点击这里下载。 阅读全文
posted @ 2015-04-20 14:43 CareySon 阅读(1701) 评论(7) 推荐(3) 编辑
摘要:在SQL Server中,SQL语句的执行是依赖查询优化器生成的执行计划,而执行计划的好坏直接关乎执行性能。 在查询优化器生成执行计划过程中,需要参考元数据来尽可能生成高效的执行计划,因此元数据越多,则执行计划更可能会高效。所谓需要参考的元数据主要包括:索引、表结构、统计信息等,但... 阅读全文
posted @ 2015-02-16 16:17 CareySon 阅读(12929) 评论(5) 推荐(1) 编辑
摘要:在SQL Server中Count(*)或者Count(1)或者Count([列])或许是最常用的聚合函数。很多人其实对这三者之间是区分不清的。本文会阐述这三者的作用,关系以及背后的原理。 往常我经常会看到一些所谓的优化建议不使用Count(* )而是使用Count(1),从而可以... 阅读全文
posted @ 2015-02-10 14:51 CareySon 阅读(251239) 评论(59) 推荐(64) 编辑
摘要:最近调优过程中遇到一个问题,就是表值函数作为连接中的一部分时,可能会引起麻烦,本文会简单阐述表值函数是什么,以及为什么使用表值函数进行连接时会引发性能问题。 表值函数 SQL Server中提供了类似其他编程语言的函数,而函数的本质通常是一段代码的封装,并返回值。在SQL Server中,函数除了可以返回简单的数据类型之外(Int、Varchar等),还可以返回一个集合,也... 阅读全文
posted @ 2015-02-03 14:25 CareySon 阅读(5512) 评论(7) 推荐(2) 编辑
摘要:http://www.cnblogs.com/shanksgao/p/4254942.html 高兄这篇文章很好的谈论了由于数据隐式转换造成执行计划不准确,从而造成了死锁。那如果在事情出现之前发现了这类潜在的风险岂不是更好? 那么我们来看一个简单的例子,如代码清单1所示。 1: SELECT * 2: FROM Hu... 阅读全文
posted @ 2015-01-28 12:01 CareySon 阅读(5230) 评论(12) 推荐(14) 编辑
摘要:最近一个朋友和我探讨关于Where 1=1 and这种形式的语句会不会影响性能。最后结论是不影响。 虽然结论正确,但对问题的认识却远远没有解决问题的根本。实际上在T-SQL语句的书写过程中经常犯得错误就是得出一个很窄的结论,然后教条式的奉若圣经,对于T-SQL领域来说,在网上经常可以看到所谓的优化守则,随便在网上搜了一些摘录如下: 不要有超过5个以上的表连接(JOIN) ... 阅读全文
posted @ 2014-12-02 21:38 CareySon 阅读(15051) 评论(13) 推荐(10) 编辑
摘要:在某些情况下,表中数据较多,且分布不均匀的时候,执行计划的估计行数往往会有很大偏差,因此SQL Server 2008引入了过滤统计信息,意味着只对表中的特定数据计算统计信息。那么在调优查询的过程中如何知道语句是否使用了过滤统计信息呢?SQL Server提供了一个隐藏的跟踪标记来支持这一过程。下面Demo可以展示如何使用该跟踪标记。 我们首先对AdventureWorks... 阅读全文
posted @ 2014-10-30 11:47 CareySon 阅读(2346) 评论(9) 推荐(9) 编辑
摘要:最近帮助客户调优的过程中,发现客户的TempDB存在非常大的压力,经过排查是发现某些语句对TempDB的巨量使用所导致。 在SQL Server中,TempDB主要负责供下述三类情况使用: 内部使用(排序、hash join、work table等) 外部使用(临时表,表变量等) 行版本控制(乐观并发控制) 而对于内部使用,一些比较复杂的查询... 阅读全文
posted @ 2014-08-13 15:46 CareySon 阅读(4836) 评论(16) 推荐(5) 编辑
摘要:最近在给一个客户做调优的时候发现一个很有意思的现象,对于一个复杂查询(涉及12个表)建立必要的索引后,语句使用的IO急剧下降,但执行时间不降反升,由原来的8秒升到20秒。 通过观察执行计划,发现之前的执行计划在很多大表连接的部分使用了Hash Join,由于涉及的表中数据众多,因此查询优化器选择使用并行执行,速度较快。而我们优化完的执行计划由于索引的存在,且表内数据非常大,过滤条... 阅读全文
posted @ 2014-07-17 15:07 CareySon 阅读(7872) 评论(15) 推荐(6) 编辑
摘要:简介 最近在一个客户那里注意到一个计数器很高(Forwarded Records/Sec),伴随着间歇性的磁盘等待队列的波动。本篇文章分享什么是forwarded record,并从原理上谈一谈为什么Forwarded record会造成额外的IO。 存放原理 在SQL ... 阅读全文
posted @ 2014-07-07 09:03 CareySon 阅读(4202) 评论(13) 推荐(9) 编辑
摘要:简介 Microsoft SQL Server在大多数情况下都能够创建非常高效的执行计划。但是在某些特定的查询类型会给查询优化器带来麻烦。本篇文章阐述了其中4种情况,这些情况通常包含了需要SQL Server传递多个数据集、产生没有统计信息的中间结果集,抑或是中间结果集的统计信息无法被正确计算。 将单独的查询语句分解为多个语句或是多个步骤,来使得SQl Server生成完全不同的执行计划,或是为中间结果集创建统计信息。分解语句,而不是使用提示的好处是使得SQL Server可以根据数据的变化,动态的生成高效的执行计划。 虽然本篇文章所探讨的查询类型大多是基于ET... 阅读全文
posted @ 2013-12-18 12:48 CareySon 阅读(6504) 评论(14) 推荐(18) 编辑
摘要:简介 在上篇文章中我们谈到了查询优化器和执行计划缓存的关系,以及其二者之间的冲突。本篇文章中,我们会主要阐述执行计划缓存常见的问题以及一些解决办法。 将执行缓存考虑在内时的流程 上篇文章中提到了查询优化器解析语句的过程,当将计划缓存考虑在内时,首先需要查看计划缓存中是否已经有语句的缓存,如果没有,才会执行编译过程,如果存在则直接利用编译好的执行计划。因此,完整的过程如图1所示。 图1.将计划缓存考虑在内的过程 图1中我们可以看到,其中有一步需要在缓存中找到计划的过程。因此不难猜出,只要是这一类查找,一定跑不了散列(Hash)的数据结构。通过sy... 阅读全文
posted @ 2013-05-04 14:53 CareySon 阅读(9255) 评论(18) 推荐(25) 编辑
摘要:简介 我们平时所写的SQL语句本质只是获取数据的逻辑,而不是获取数据的物理路径。当我们写的SQL语句传到SQL Server的时候,查询分析器会将语句依次进行解析(Parse)、绑定(Bind)、查询优化(Optimization,有时候也被称为简化)、执行(Execution)。除去执行步骤外,前三个步骤之后就生成了执行计划,也就是SQL Server按照该计划获取物理数据方式,最后执行步骤按照执行计划执行查询从而获得结果。但查询优化器不是本篇的重点,本篇文章主要讲述查询优化器在生成执行计划之后,缓存执行计划的相关机制以及常见问题。 为什么需要执行计划缓存 从简介... 阅读全文
posted @ 2013-05-04 00:04 CareySon 阅读(11751) 评论(10) 推荐(30) 编辑
摘要:跟踪标记是什么? 对于DBA来说,掌握Trace Flag是一个成为SQL Server高手的必要条件之一,在大多数情况下,Trace Flag只是一个剑走偏锋的奇招,不必要,但在很多情况下,会使用这些标记可以让你更好的控制SQL Server的行为。 下面是官方对于Trace Flag的标记: 跟踪标记是一个标记,用于启用或禁用SQL Server的某些行为。 ... 阅读全文
posted @ 2013-04-23 23:38 CareySon 阅读(8037) 评论(6) 推荐(11) 编辑
摘要:简介 SQL Server OS是在Windows之上,用于服务SQL Server的一个用户级别的操作系统层次。它将操作系统部分的功能从整个SQL Server引擎中抽象出来,单独形成一层,以便为存储引擎提供服务。SQL Server OS主要提供了任务调度、内存分配、死锁检测、资源检测、锁管理、Buffer Pool管理等多种功能。本篇文章主要是谈一谈SQL OS中所提供的任务调度机制。 抢占式(Preemptive)调度与非抢占式(non-Preemptive)调度 数据库层面的任务调度的起源是ACM上的一篇名为“Operating System Su... 阅读全文
posted @ 2013-02-01 10:15 CareySon 阅读(5357) 评论(9) 推荐(12) 编辑
摘要:简介 在SQL Server中,我们所常见的表与表之间的Inner Join,Outer Join都会被执行引擎根据所选的列,数据上是否有索引,所选数据的选择性转化为Loop Join,Merge Join,Hash Join这三种物理连接中的一种。理解这三种物理连接是理解在表连接时解决性能问题的基础,下面我来对这三种连接的原理,适用场景进行描述。 嵌套循环连接(Nested Loop Join) 循环嵌套连接是最基本的连接,正如其名所示那样,需要进行循环嵌套,这种连接方式的过程可以简单的用下图展示: 图1.循环嵌套连接的第一步 ... 阅读全文
posted @ 2013-01-09 15:57 CareySon 阅读(13837) 评论(30) 推荐(55) 编辑
摘要:本篇文章是我在:http://www.simple-talk.com/sql/database-administration/partitioned-tables,-indexes-and-execution-plans-a-cautionary-tale/?utm_source=simpletalk&utm_medium=email-main&utm_content=partitione... 阅读全文
posted @ 2012-10-30 10:53 CareySon 阅读(2174) 评论(6) 推荐(1) 编辑