SQL Server查询计划缓存和计划重用存储过程

时间:2014-01-22 23:15:12

标签: sql sql-server

我在SQL Server 2012数据库中有一个大约300万行的表。 ETL包向表中插入大约50,000个新行。

在插入之后,ETL包使用存储过程更新新添加的行。该过程具有ExecutionID的输入参数,仅过滤插入的行。我已经根据查询创建了索引,如果表的统计信息是最新的,那么查询性能很好。但是,统计信息不会每天更新,因为添加的记录数量不会强制自动更新统计信息。

我对存储过程计划的理解是优化器缓存计划,然后重复使用它,直到计划失效。因为我期待如果我按计划运行我想要的程序一次,该计划应该重复使用。但是,我在计划缓存中看到了相同程序的多个计划。

为什么会这样?换句话说,为什么SQL Server会为同一个查询缓存不同的计划?

在这种情况下我应该在调用程序之前手动更新统计信息吗?似乎优化器使用参数值来确定计划,并且由于新数据的统计信息没有更新,因此它不会使用正确的计划。

1 个答案:

答案 0 :(得分:1)

如果你的ExecutionID是自动递增的,那么最有可能发生的是新值不会出现在各种直方图和统计数据中(因为它是新的)。结果,优化者对该数字的基数一无所知,并且猜测不好。

我建议你想要

  1. 导入数据
  2. 重建统计资料
  3. 进行更新
  4. 或者您可以冻结计划

    http://blogs.msdn.com/b/sqlblog/archive/2009/02/19/plan-guides-plan-freezing-in-sql-server-2005-2008.aspx

    或者,您可以在更新上添加索引提示,以便无论使用什么都使用正确的计划。