• 执行计划--重编译


    --==========================================
    --在生产环境中,会遇到表中某列数据分布不均匀,导致在生成执行计划
    --不能适应参数的变化
    --==========================================
    --解决方式:强制存储过程重编译
    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
     

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

  • 相关阅读:
    scrapy安装教程
    【bzoj4200】[Noi2015]小园丁与老司机 STL-map+dp+有上下界最小流
    【bzoj4889】[Tjoi2017]不勤劳的图书管理员 树状数组+分块+二分
    【bzoj4198】[Noi2015]荷马史诗 贪心+堆
    【bzoj2989】数列 KD-tree+旋转坐标系
    【bzoj4212】神牛的养成计划 Trie树+可持久化Trie树
    【bzoj4242】水壶 BFS+最小生成树+倍增LCA
    【bzoj4238】电压 DFS树
    【bzoj4240】有趣的家庭菜园 贪心+树状数组
    【bzoj4237】稻草人 分治+单调栈+二分
  • 原文地址:https://www.cnblogs.com/TeyGao/p/3526858.html
Copyright © 2020-2023  润新知