强制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所示:

强制SQL Server执行计划使用并行提升在复杂查询语句下的性能
图1.

下面我们对该语句加上提示,如代码清单2所示。


SELECT *
FROM [AdventureWorks].[Sales].[SalesOrderDetail] a
INNER JOIN [Sales].SalesOrderHeader b
ON a.SalesOrderID=b.SalesOrderID
OPTION(querytraceon 8649)

代码清单2.

此时执行计划会按照提示走并行,如图2所示:

强制SQL Server执行计划使用并行提升在复杂查询语句下的性能
图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
  • asp之家 网络编程 m.aspxhome.com