SQL Server并行操作优化避免并行操作被抑制而影响SQL的执行效率
作者:wy123 发布时间:2024-01-23 10:55:50
为什么我也要说SQL Server的并行:
这几天园子里写关于SQL Server并行的文章很多,不管怎么样,都让人对并行操作有了更深刻的认识。
我想说的是:尽管并行操作可能(并不是一定)存在这样或者那样的问题,但是我们不能否认并行,仍然要利用好并行。
但是,实际开发中,某些SQL语句的写法会导致用不到并行,从而影响到SQL的执行效率
所以,本文要表达的是:我们要利用好并行,不要让一些SQL的写法问题“抑制”了并行,让我们享受不了并行带来的快感
关于SQL Server的并行:
所谓的并行,指SQL Server对于那些执行代价相对较大(这个相对跟你的设置有关)的SQL时,如果数据库服务器存在多颗CPU,SQL Server查询引擎会采用并行的方式,也即采用多颗CPU参与整个运算过程,每颗CPU“分担”一部分计算任务,最后汇总合并各个CPU的计算的一种行为有时候,不当的并行查询不但不会加快查询的速度,想反会拖慢查询的效率,如果采用不当的并行操作,甚至会影响到整个服务器的稳定性。
所以SQL Server 究竟在多大代价下启用并行,是由配置的,这个配置可根据具体的情况做修改,有人说这个值的单位是“秒”,貌似没见过权威的资料说过到底单位是什么,这里暂不追究
有清楚这个阈值单位的园友情不惜赐教,谢了
尽管并行操作可能存在这样活着那样的问题,但是我们不能因噎废食,利用好并行,往往总是利大于弊。
但是并不是所有的执行代价较大SQL都能用到并行操作,实际开发中,有一些SQL的写法会抑制到并行操作,结果,导致整个SQL语句(存储过程)的效率上不去。
下面来举例说明。
并行查询是如何变成了串行的:
如下是一个非常简单的查询操作,这些写法下,默认情况下开启了并行,可以看到,一共开启了8个线程来对SQL语句做计算。
当然这SQL的执行效率还算不错,CPU时间是622毫秒,执行总时间是130毫秒,
这里不要弄混淆了,CPU时间的633毫秒,是8个CPU一共消耗的CPU时间,大于总的执行130毫秒很正常的
下面创建一个非常简单的函数,
CREATE function [dbo].[fn_justFunction](@p_date date)
returns date
as
begin
return @p_date
end
这个函数并没有什么实际意义,执行也非常简单,传入一个时间,返回这个时间,
当然这里只是为了下面的操作演示,你完全可以说我蛋疼,我只是为了演示并行被抑制的现象
翻翻你的SQL代码,有没有类似这种写法?
然后我们这么写这个查询,就是在查询条件上这么处理CreateDate>dbo.fn_justFunction('2015-1-1')(注意不是表的列,而是函数作用在查询条件上),注意这个函数并不影响任何查询结果,传入的2015-1-1,返回位依旧是2015-1-1,但是这么一变化,并行就变成串行的了,SQL执行期间只有一个CPU飚了起来,使用了到达80%左右,,与此同时其他CPU跟没事人一样,也不上来帮忙,还是很闲还记得上面并行操作方式执行时间是多少么?130毫秒,现在粗看起来是多少,这里是4S,也就是4000毫秒了。差了多少倍,我数学不好算不出来
可以看到,并行操作和串行操作的效率差别还是很大的,对于CPU的利用也不充分(当然我不是强调一定要用满所有的CPU才算合理)
再次强调一点,这里并不是在表的字段上加函数抑制了索引什么的,纯粹的影响到的是并行操作。
当然,抑制并行的写法不单单是在查询条件在使用函数,实际开发中,影响会更大,
因为实际业务中数据有可能会更大,SQL也可能更加复杂,这种情况可能更加难以甄别。
比如连接条件上,如下,连接条件上使用函数导致无法使用并行的情况,也是实际开发中遇到的
select * from TableA a inner join TableB b on a.id=b.id and a.Column=dbo.function(@Variable) where ***
当然抑制到并行操作的不单单只有这两种写法,还有可能潜在其他类似的写法也会影响到并行查询。
这就要求我们在写SQL的时候,不但要注意不能再字段上使用函数(无法使用该字段上的索引),同样,查询条件上也尽可能不要使用函数,有可能影响到并行操作。
如果处理并行操作被抑制的情况:
如果要解决类似这些个问题,该怎么办?其实也很简单,建议查询条件通过函数运算之后赋值给一个变量,用变量去作为查询条件进行查询。
再次开始了愉快的并行,享受并行带来的快感。
对于连接条件上的函数处理也类似,将结果计算出来之后,保存在一个变量中,把变量写在连接条件中,
当然可能有其他办法,我暂时还没有想到。
总结:
本文通过一个简单的例子演示了并行操作被抑制的现象,说明了并行和串行在执行一个代价较大的SQL上的性能的巨大的差别
其中提到的查询方式是查询条件上因为函数的原因抑制了并行,完全区别于在查询列上使用函数抑制索引的情况。
并行查询可以充分调动CPU资源,以高效的方式完成查询,合理的利用并行会很大程度上提高SQL的执行效率。
为了利用好并行,在写SQL的时候,一定要注意,防止并行操作遭到抑制,给性能带来影响.
SQL优化是一个艰难而又反复的过程,即便如此,也乐在其中。
面对繁复SQL,不但要有过硬的技术,也要有足够的耐心,才能看清事物的本质。
对并行的理解还不够充分,有不对的地方希望各位看官指出,谢谢。
以上所述是小编给大家介绍的SQL Server并行操作优化避免并行操作被抑制而影响SQL的执行效率网站的支持!
来源:http://www.cnblogs.com/wy123/archive/2016/07/12/5661848.html
猜你喜欢
- 一、从外部文档中粘贴时,如果只要文字而不想要其格式,可以使用“Edit→paste as text”命令,不要直接用Ctrl+V。二、当有浏
- 前言观前提醒:因为是代码控制统计,所以操作每一个步骤都很重要,否则就会报错。操作步骤1.将在线编辑文档导入本地。为了方便代码处理,将导出的e
- python软件免费吗?python是免费的,是自由、开放源码的软件之一,在python官网可以免费下载,使用者可以自由地发布这个软件的拷贝
- Django 基本命令本节主要是为了让您了解一些django最基本的命令,请尝试着记住它们,并且多多练习下1. 新建一个 django pr
- 一、pycharm字体放大的设置File —> setting —> Keymap —>在搜寻框中输入:increase
- Numpy是什么很简单,Numpy是Python的一个科学计算的库,提供了矩阵运算的功能,其一般与Scipy、matplotlib一起使用。
- 起由:前一阵子想要刷一刷国二Python的题库,千方百计找到题库之后,打开一个个word文档,发现一题一题阅读很麻烦,而且答案就在题目的下面
- 主要思路(1)数据选取获取数据的链接为:https://www.basketball-reference.com/获取的数据内容为:每支队伍
- 一、相关模块jieba:中文分词wordcloud :Python词云库imageio:读取图形数据安装:pip install&
- 本文实例讲述了python动态参数用法。分享给大家供大家参考。具体分析如下:先来看一段代码:class Person: &nb
- 相比于逻辑回归,在很多情况下,SVM算法能够对数据计算从而产生更好的精度。而传统的SVM只能适用于二分类操作,不过却可以通过核技巧(核函数)
- 废话还是说太多了 直接上代码import randomimport sys# 牌面列表card_code = ['A', &
- 在日常应用中,往往根据实际需求录入一些值,而这些值不能直接使用,所以Sql中经常会对字段值进行一些常规的处理。这里搜集了(提取数字、英文、中
- 保证只能运行一个脚本实例,方法是程序运行时监听一个特定端口,如果失败则说明已经有实例在跑。使用装饰器实现,便于重用import functo
- 如何在Access数据库中立即得到所插入记录的自动编号?首先,我们要保证获得记录集的方式支持bookmark属性,如在1、3插入一条有自动编
- Python最大的优点之一就是语法简洁,好的代码就像伪代码一样,干净、整洁、一目了然。要写出 Pythonic(优雅的、地道的、整洁的)代码
- 看网络小说一般会攒上一波,然后导入Kindle里面去看,但是攒的多了,机械的Ctrl+C和Ctrl+V实在是OUT,所以就出现了此文。其实P
- 下载驱动器http://chromedriver.storage.googleapis.com/index.html下载与谷歌版本相同或最近
- strip_tags定义和用法strip_tags() 函数剥去字符串中的 HTML、XML 以及 PHP 的标签。注释:该函数始终会剥离
- 本文记录了Linux系统(CentOS)安装Python,供大家参考,具体内容如下Python(Linux) 下载地址操作系统:Centos