SQL Server 并行操作优化,避免并行操作被抑制而影响SQL的执行效率

时间:2023-01-04 12:59:18

为什么我也要说SQL Server的并行:

这几天园子里写关于SQL Server并行的文章很多,不管怎么样,都让人对并行操作有了更深刻的认识。
我想说的是:尽管并行操作可能(并不是一定)存在这样或者那样的问题,但是我们不能否认并行,仍然要利用好并行。
但是,实际开发中,某些SQL语句的写法会导致用不到并行,从而影响到SQL的执行效率
所以,本文要表达的是:我们要利用好并行,不要让一些SQL的写法问题“抑制”了并行,让我们享受不了并行带来的快感

关于SQL Server的并行:

所谓的并行,指SQL Server对于那些执行代价相对较大(这个相对跟你的设置有关)的SQL时,如果数据库服务器存在多颗CPU,
SQL Server查询引擎会采用并行的方式,也即采用多颗CPU参与整个运算过程,每颗CPU“分担”一部分计算任务,最后汇总合并各个CPU的计算的一种行为
有时候,不当的并行查询不但不会加快查询的速度,想反会拖慢查询的效率,如果采用不当的并行操作,甚至会影响到整个服务器的稳定性。
所以SQL Server 究竟在多大代价下启用并行,是由配置的,这个配置可根据具体的情况做修改,有人说这个值的单位是“秒”,貌似没见过权威的资料说过到底单位是什么,这里暂不追究
有清楚这个阈值单位的园友情不惜赐教,谢了

SQL Server 并行操作优化,避免并行操作被抑制而影响SQL的执行效率

尽管并行操作可能存在这样活着那样的问题,但是我们不能因噎废食,利用好并行,往往总是利大于弊。
但是并不是所有的执行代价较大SQL都能用到并行操作,实际开发中,有一些SQL的写法会抑制到并行操作,结果,导致整个SQL语句(存储过程)的效率上不去。
下面来举例说明。

并行查询是如何变成了串行的:

  如下是一个非常简单的查询操作,这些写法下,默认情况下开启了并行,可以看到,一共开启了8个线程来对SQL语句做计算。

  SQL Server 并行操作优化,避免并行操作被抑制而影响SQL的执行效率

  当然这SQL的执行效率还算不错,CPU时间是622毫秒,执行总时间是130毫秒,
  这里不要弄混淆了,CPU时间的633毫秒,是8个CPU一共消耗的CPU时间,大于总的执行130毫秒很正常的

  SQL Server 并行操作优化,避免并行操作被抑制而影响SQL的执行效率

  下面创建一个非常简单的函数,

CREATE function [dbo].[fn_justFunction](@p_date date)
returns date
as
begin
return @p_date
end

  这个函数并没有什么实际意义,执行也非常简单,传入一个时间,返回这个时间,

  SQL Server 并行操作优化,避免并行操作被抑制而影响SQL的执行效率

  

  当然这里只是为了下面的操作演示,你完全可以说我蛋疼,我只是为了演示并行被抑制的现象
  翻翻你的SQL代码,有没有类似这种写法?

  然后我们这么写这个查询,就是在查询条件上这么处理CreateDate>dbo.fn_justFunction('2015-1-1')(注意不是表的列,而是函数作用在查询条件上),
  注意这个函数并不影响任何查询结果,传入的2015-1-1,返回位依旧是2015-1-1,但是这么一变化,并行就变成串行的了,
  SQL执行期间只有一个CPU飚了起来,使用了到达80%左右,,与此同时其他CPU跟没事人一样,也不上来帮忙,还是很闲
  还记得上面并行操作方式执行时间是多少么?130毫秒,现在粗看起来是多少,这里是4S,也就是4000毫秒

  SQL Server 并行操作优化,避免并行操作被抑制而影响SQL的执行效率

  可以看到,并行操作和串行操作的效率差别还是很大的,对于CPU的利用也不充分(当然我不是强调一定要用满所有的CPU才算合理)
  再次强调一点,这里并不是在表的字段上加函数抑制了索引什么的,纯粹的影响到的是并行操作。
  当然,抑制并行的写法不单单是在查询条件在使用函数,实际开发中,影响会更大,
  因为实际业务中数据有可能会更大,SQL也可能更加复杂,这种情况可能更加难以甄别。
  比如连接条件上,如下,连接条件上使用函数导致无法使用并行的情况,也是实际开发中遇到的
  select * from TableA a inner join TableB b on a.id=b.id and a.Column=dbo.function(@Variable) where ***
  当然抑制到并行操作的不单单只有这两种写法,还有可能潜在其他类似的写法也会影响到并行查询。
  这就要求我们在写SQL的时候,不但要注意不能再字段上使用函数(无法使用该字段上的索引),同样,查询条件上也尽可能不要使用函数,有可能影响到并行操作。

  总结起来有一下几种情况会抑制到并行的使用(以后发现再更新):

    1,将函数之类的操作作用在查询条件上

      比如:CreateDate>dbo.fn_justFunction('2015-1-1')

    2,将函数之类的操作作用在连接条件上

      比如:select * from TableA a inner join TableB b on a.id=b.id and a.Column=dbo.function(@Variable)  where ***

    3,强函数之类的操作作用在查询列上

      比如:FunctionName(ColumnName)>55,这种情况,如果查询列上有索引,不仅仅是抑制索引,还会抑制并行

如何处理并行操作被抑制的情况: 

  如果要解决类似这些个问题,该怎么办?
  其实也很简单,建议查询条件通过函数运算之后赋值给一个变量,用变量去作为查询条件进行查询。
  再次开始了愉快的并行,享受并行带来的快感。

  SQL Server 并行操作优化,避免并行操作被抑制而影响SQL的执行效率

  对于连接条件上的函数处理也类似,将结果计算出来之后,保存在一个变量中,把变量写在连接条件中,
  当然可能有其他办法,我暂时还没有想到。

总结:

  本文通过一个简单的例子演示了并行操作被抑制的现象,说明了并行和串行在执行一个代价较大的SQL上的性能的巨大的差别
  其中提到的查询方式是查询条件上因为函数的原因抑制了并行,完全区别于在查询列上使用函数抑制索引的情况。
  并行查询可以充分调动CPU资源,以高效的方式完成查询,合理的利用并行会很大程度上提高SQL的执行效率。
  为了利用好并行,在写SQL的时候,一定要注意,防止并行操作遭到抑制,给性能带来影响。

  SQL优化是一个艰难而又反复的过程,即便如此,也乐在其中。
  面对繁复SQL,不但要有过硬的技术,也要有足够的耐心,才能看清事物的本质。
  对并行的理解还不够充分,有不对的地方希望各位看官指出,谢谢。

出处:http://www.cnblogs.com/wy123/p/5661848.html

SQL Server 并行操作优化,避免并行操作被抑制而影响SQL的执行效率的更多相关文章

  1. SQL SERVER全面优化-------Expert for SQL Server 诊断系列

    现在很多用户被数据库的慢的问题所困扰,又苦于花钱请一个专业的DBA成本太高.软件维护人员对数据库的了解又不是那么深入,所以导致问题迟迟不能解决,或只能暂时解决不能得到根治.开发人员解决数据问题基本又是 ...

  2. SQL SERVER全面优化-------写出好语句是习惯

    前几篇文章已经从整体提供了诊断数据库的各个方面问题的基本思路...也许对你很有用,也许你觉得离自己太远.那么今天我们从语句的一些优化写法及一些简单优化方法做一个介绍.这对于很多开发人员来说还是很有用的 ...

  3. SQL SERVER全面优化-------索引有多重要?

    想了好久索引的重要性应该怎么写?讲原理结构?我估计大部分人不愿意看,也不愿意花那么多时间仔细研究.光写应用?感觉不明白原理一样不会用.举例说明?情况太多也写不全....到底该怎么写呢? 随便写吧,想到 ...

  4. SQL SERVER全面优化

    今天我们从语句的一些优化写法及一些简单优化方法做一个介绍.这对于很多开发人员来说还是很有用的!为了方便阅读给出前文链接: SQL SERVER全面优化-------Expert for SQL Ser ...

  5. SQL Server 性能优化(一)——简介

    原文:SQL Server 性能优化(一)--简介 一.性能优化的理由: 听起来有点多余,但是还是详细说一下: 1.节省成本:这里的成本不一定是钱,但是基本上可以变相认为是节省钱.性能上去了,本来要投 ...

  6. SQL Server 性能优化之——系统化方法提高性能

    SQL Server 性能优化之——系统化方法提高性能 阅读导航 1. 概述 2. 规范逻辑数据库设计 3. 使用高效索引设计 4. 使用高效的查询设计 5. 使用技术分析低性能 6. 总结 1. 概 ...

  7. SQL Server性能优化与管理的艺术 附件下载地址

    首先感谢读者们对鄙人的支持,购买了<SQL Server性能优化与管理的艺术>,由于之前出版社的一些疏忽,附件没有上传成功,再次本人深表歉意. 请需要下载附件的读者从下面链接下载,谢谢: ...

  8. SQL Server的优化器会缓存标量子查询结果集吗

    在这篇博客"ORACLE当中自定义函数性优化浅析"中,我们介绍了通过标量子查询缓存来优化函数性能: 标量子查询缓存(scalar subquery caching)会通过缓存结果减 ...

  9. SQL Server 性能优化实战系列&lpar;二&rpar;

    SQL Server datetime数据类型设计.优化误区 一.场景 在SQL Server 2005中,有一个表TestDatetime,其中Dates这个字段的数据类型是datetime,如果你 ...

随机推荐

  1. Codeforces Round &num;271 &lpar;Div&period; 2&rpar;题解【ABCDEF】

    Codeforces Round #271 (Div. 2) A - Keyboard 题意 给你一个字符串,问你这个字符串在键盘的位置往左边挪一位,或者往右边挪一位字符,这个字符串是什么样子 题解 ...

  2. java阻塞队列

    对消息的处理有些麻烦,要保证各种确认.为了确保消息的100%发送成功,笔者在之前的基础上做了一些改进.其中要用到多线程,用于重复发送信息. 所以查了很多关于线程安全的东西,也看到了阻塞队列,发现这个模 ...

  3. windows 2003 修改远程桌面连接数详细方法

    Windows Server 2003默认情况下允许远程终端连接的数量是2个用户,我们可以根据需要适当增加远程连接同时在线的用户数. 单击“开始→运行”,输入“gpedit.msc”打开组策略编辑器窗 ...

  4. 【转载】从头编写 asp&period;net core 2&period;0 web api 基础框架 &lpar;1&rpar;

    工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...

  5. 072、一文搞懂各种Docker网络 (2019-04-17 周三)

    参考https://www.cnblogs.com/CloudMan6/p/7587532.html   前面各个小节我们学习了 Docker Overlay .Macvlan .Flannel.We ...

  6. Python3漏洞扫描工具 &lpar; Python3 插件式框架 &rpar;

    目录 Python3 漏洞检测工具 -- lance screenshot requirements 关键代码 usage documents README Guide Change Log TODO ...

  7. iOS开发调试篇—Print Description of &quot&semi;string&quot&semi;

    Print Description of "string":把 string 的信息输出到控制台.Copy:复制 string 的信息,包含变量名,类名和值.View Value ...

  8. Oracle 12C -- plug unplugged PDB into CDB

    connetct to CDB as a common user and verify that pdb_test is closed SQL> select con_id,dbid,name, ...

  9. jquery获取元素颜色css&lpar;&&num;39&semi;color&&num;39&semi;&rpar;的值返回RGB

    css代码如下: a, a:link, a:visited { color:#4188FB; } a:active, a:focus, a:hover { color:#FFCC00; } js代码如 ...

  10. SQL学习之SQL注入总结

    Sql注入定义: 就是通过把sql命令插入到web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行的sql命令的目的. sql注入分类: 基于联合查询 基于错误回显 基于盲注,分时间盲 ...