SQL Server Parameter Sniffing及其改进方法

作者:mrr 时间:2024-01-28 02:56:30 

SQL Server 在处理存储过程的时候,为了节省编译时间,是一次编译,多次重用。当第一次运行时代入值产生的执行计划,不适用后续代入的参数时,就产生了parameter sniffing问题。 create procedure Sniff1(@i int) as SELECT count(b.SalesOrderID),sum(p.weight) from [Sale
SQL Server 在处理存储过程的时候,为了节省编译时间,是一次编译,多次重用。当第一次运行时代入值产生的执行计划,不适用后续代入的参数时,就产生了parameter sniffing问题。


create procedure Sniff1(@i int) as
SELECT count(b.SalesOrderID),sum(p.weight) from
[Sales].[SalesOrderHeader] a
inner join [Sales].[SalesOrderDetail] b
on a.SalesOrderID = b.SalesOrderID
inner join Production.Product p
on b.ProductID = p.ProductID
where a.SalesOrderID =@i;
go
DBCC FREEPROCCACHE
exec Sniff1 50000;
exec Sniff1 75124;
go

SQL Server Parameter Sniffing及其改进方法

Parameter Sniffing问题发生不频繁,只会发生在数据分布不均匀或者代入参数值不均匀的情况下。现在,我们就来探讨下如何解决这类问题。

1. 使用Exec() 方式运行动态SQL


create procedure Nosniff1(@i int) as
declare @cmd varchar(1000);
set @cmd = 'SELECT count(b.SalesOrderID),sum(p.weight) from
[Sales].[SalesOrderHeader] a
inner join [Sales].[SalesOrderDetail] b
on a.SalesOrderID = b.SalesOrderID
inner join Production.Product p
on b.ProductID = p.ProductID
where a.SalesOrderID =';
exec(@cmd+@i);
go



SQL Server Parameter Sniffing及其改进方法


exec Nosniff1 50000;


SQL Server Parameter Sniffing及其改进方法


exec Nosniff1 75124;


从上述trace中可以看到,在执行查询语句之前,都有SP: CacheInsert事件,SQL Server做了动态编译,根据变量的值,都正确的预估了结果集,给出了不同的执行计划。


2. 使用本地变量




create procedure Nosniff2(@i int) as
declare @iin int;
set @iin=@i
SELECT count(b.SalesOrderID),sum(p.weight) from
[Sales].[SalesOrderHeader] a
inner join [Sales].[SalesOrderDetail] b
on a.SalesOrderID = b.SalesOrderID
inner join Production.Product p
on b.ProductID = p.ProductID
where a.SalesOrderID =@iin;
go

exec Nosniff2 50000;

SQL Server Parameter Sniffing及其改进方法

SQL Server Parameter Sniffing及其改进方法

exec Nosniff2 75124;

SQL Server Parameter Sniffing及其改进方法

SQL Server Parameter Sniffing及其改进方法

如上一篇文章所述,使用本地变量,参数值在存储过程语句执行过程中得到,SQL Server在运行时不知道变量的值,会根据一个预估值进行编译,给出一个折中的执行计划。

3. 使用Query Hint,指定执行计划

在 SELECT、DELETE、UPDATE 和 MERGE 语句最后加上OPTION ( [ ,...n ] ),对执行计划进行指导。当数据库管理员知道问题所在时,可以通过hint引导SQL Server生成一个对所有变量都不太差的执行计划。

以上所述是小编给大家介绍的SQL Server Parameter Sniffing及其改进方法网站的支持!

标签:SQL,Server,Parameter,Sniffing
0
投稿

猜你喜欢

  • MySQL的一些常用的SQL语句整理

    2024-01-19 06:38:40
  • SQL中distinct的用法(四种示例分析)

    2024-01-15 17:18:40
  • 详解Python的collections模块中的deque双端队列结构

    2021-08-15 19:35:57
  • python通过邮件服务器端口发送邮件的方法

    2021-10-18 02:34:09
  • vue中简单弹框dialog的实现方法

    2024-05-21 10:14:57
  • Git如何修改已提交的commit注释

    2023-10-04 02:17:54
  • Python代理抓取并验证使用多线程实现

    2022-07-10 07:04:19
  • python从PDF中提取数据的示例

    2021-10-15 21:46:05
  • python 生成正态分布数据,并绘图和解析

    2022-02-11 07:14:00
  • python项目报错:bs4.FeatureNotFound: Couldn‘t find a tree builder with the features you requests

    2022-07-17 05:39:02
  • Centos7 安装mysql 8.0.13(rpm)的教程详解

    2024-01-19 04:52:14
  • Mysql误操作后利用binlog2sql快速回滚的方法详解

    2024-01-23 19:00:31
  • 对Python的Django框架中的项目进行单元测试的方法

    2021-02-23 03:17:04
  • python tkinter组件摆放方式详解

    2021-09-23 01:50:23
  • 内联格式化模式(line-height原理)

    2008-06-29 14:37:00
  • 《色彩解答》系列之一 色彩层次

    2008-02-17 14:26:00
  • Python实现简易版的Web服务器(推荐)

    2021-04-21 04:41:15
  • 如何在Python项目中引入日志

    2023-01-25 15:10:53
  • PyQt5中向单元格添加控件的方法示例

    2023-10-20 05:08:48
  • 分享Pytest fixture参数传递的几种方式

    2023-06-15 01:25:28
  • asp之家 网络编程 m.aspxhome.com