强制SQL Server执行计划使用并行提升在复杂查询语句下的性能
作者:hebedich 时间:2024-01-14 16:30:38
通过观察执行计划,发现之前的执行计划在很多大表连接的部分使用了Hash Join,由于涉及的表中数据众多,因此查询优化器选择使用并行执行,速度较快。而我们优化完的执行计划由于索引的存在,且表内数据非常大,过滤条件的值在一个很宽的统计信息步长范围内,导致估计行数出现较大偏差(过滤条件实际为15000行,步长内估计的平均行数为800行左右),因此查询优化器选择了Loop Join,且没有选择并行执行,因此执行时间不降反升。
由于语句是在存储过程中实现,因此我们直接对该语句使用一个undocument查询提示,使得该查询的并行开销阈值强制降为0,使得该语句强制走并行,语句执行时间由20秒降为5秒(注:使用Hash Join提示是7秒)。
下面通过一个简单的例子展示使用该提示的效果,示例T-SQL如代码清单1所示:
SELECT *
FROM [AdventureWorks].[Sales].[SalesOrderDetail] a
INNER JOIN [Sales].SalesOrderHeader b
ON a.SalesOrderID=b.SalesOrderID
代码清单1.
该语句默认不会走并行,执行计划如图1所示:
图1.
下面我们对该语句加上提示,如代码清单2所示。
SELECT *
FROM [AdventureWorks].[Sales].[SalesOrderDetail] a
INNER JOIN [Sales].SalesOrderHeader b
ON a.SalesOrderID=b.SalesOrderID
OPTION(querytraceon 8649)
代码清单2.
此时执行计划会按照提示走并行,如图2所示:
图2.
在面对一些复杂的DSS或OLAP查询时遇到类似的情况,可以考虑使用该Undocument提示要求SQL Server尽可能的使用并行,从而降低执行时间。
标签:SQL,Server,复杂查询,性能
0
投稿
猜你喜欢
python实现opencv+scoket网络实时图传
2023-07-03 16:09:17
Python2.5/2.6实用教程 入门基础篇
2021-12-22 20:25:58
深入理解golang chan的使用
2024-05-10 13:59:06
Golang 限流器的使用和实现示例
2024-04-25 15:06:25
SQL Server正则表达式 替换函数应用详解
2024-01-28 06:01:16
JavaScript中跨域问题的深入理解
2024-04-28 09:41:55
使用Python 统计文件夹内所有pdf页数的小工具
2022-07-06 23:21:46
flash 挡住层的解决方法
2022-09-01 17:24:39
Python3连接Mysql8.0遇到的问题及处理步骤
2024-01-20 13:06:46
Python 变量类型及命名规则介绍
2022-09-17 20:21:22
python数组过滤实现方法
2021-09-11 20:28:44
简述 Python 的类和对象
2023-05-17 12:44:23
Python实现压缩与解压gzip大文件的方法
2021-10-13 19:39:41
Vue实现页面添加水印功能
2024-04-28 09:24:06
Django 项目重命名的实现步骤解析
2021-01-13 14:05:49
MySql 5.6.14 Win32位免安装解压缩版配置教程
2024-01-13 01:27:44
使用python把xmind转换成excel测试用例的实现代码
2022-12-21 06:21:34
mybatis如何实现的数据库排序
2024-01-24 16:35:32
Go 每日一库之termtables的使用
2024-05-22 10:20:25
原生JS中应该禁止出现的写法
2024-04-10 11:00:49