执行计划--重编译

--==========================================
--在生产环境中,会遇到表中某列数据分布不均匀,导致在生成执行计划
--不能适应参数的变化
--==========================================
--解决方式:强制存储过程重编译
CREATE PROCEDURE dbo.USP_GetData
(
   @PID INT
)
WITH RECOMPILE
AS
BEGIN
SELECT *
FROM TB1
WHERE PID=@PID
END
GO
--==========================================
--解决方式:强制存储过程中语句重编译
CREATE PROCEDURE dbo.USP_GetData
(
   @PID INT
)
AS
BEGIN
SELECT *
FROM TB1
WHERE PID=@PID
OPTION(RECOMPILE)
END
GO
--==========================================
--解决方式:执行存储过程时重编译
EXEC dbo.USP_GetData @PID=10 WITH RECOMPILE
--==========================================
--解决办法:在存储过程中对参数进行区分
CREATE PROCEDURE dbo.USP_GetData
(
   @PID INT
)
AS
BEGIN
IF(@PID>5000)
BEGIN
SELECT *
FROM TB1
WHERE PID=@PID
END
ELSE
BEGIN
SELECT *
FROM TB1
WHERE PID=@PID
AND 1=1
END
OPTION(RECOMPILE)
END
GO
--==========================================
--解决办法:指定编译时使用的变量值
--扩展:由于存储过程的执行计划是在服务器重启后第一次执行时生成
--因此执行计划与第一次传入参数紧密相关
CREATE PROCEDURE dbo.USP_GetData
(
   @PID INT
)
AS
BEGIN
SELECT *
FROM TB1
WHERE PID=@PID
OPTION(optimize for(@PID=75124))
END
GO
--==========================================
--解决办法:对执行SQL指定编译计划
--如果SQL由程序端传入,而程序端代码不可更改时,可以考虑此方式
EXEC [sys].[sp_create_plan_guide]
@name=N'Guide1',
@stmt=N'SELECT COUNT(b.[SalesOrderID]),SUM(p.[Weight])
FROM [dbo].[SalesOrderHeader_test] a
INNER JOIN [dbo].[SalesOrderDetail_test] b
ON a.[SalesOrderID]=b.[SalesOrderID]
INNER JOIN [Production].[Product] p
ON b.[ProductID]=p.[ProductID]
WHERE a.[SalesOrderID]=@i',
@type=N'OBJECT',
@module_or_batch=N'Sniff',
@params=NULL,
@hints=N'option(optimize for(@i=75124))';
 
--参考资料:http://www.cnblogs.com/lyhabc/articles/3222179.html
 

 

当执行计划引用的对象架构发生变化(如索引删除和添加)以及相关统计更新后,执行计划会再下一次执行时重新生成执行计划。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值