我支持每晚运行的流程,并查看具有未付订单项的发票的各种客户。该过程首先从登台表中删除所有记录,然后将多个发票行项目插入登台表。该流程基于每个客户端运行,因此一些客户可能有200个订单项,一些客户可能有50,000个订单项。我们经常遇到过程中运行过多时间的问题。问题似乎源于SQL服务器无法估计当时登台表中的正确行数,因此产生了错误的执行计划。我的问题是,有没有办法手动设置估计的行数,以改善所涉及的存储过程的基数估计?也许这可以通过运行开始时的select count(primaryKey)来完成,就在当前运行的staging表被填充之后?
答案 0 :(得分:1)
您正在此表上执行大批量处理。这是在批处理之前删除所有索引并在批处理后再次创建它们的好方法。
如果您这样做,您的统计信息将会更新,并且不会成为问题的原因。
另请注意有关统计信息的更多通用信息:SQL Server 2014和SQL Server 2016之间的更新统计信息发生了很大变化。如果您运行的是SQL Server 2016,则需要检查数据库是否使用了创建的新基数估算器对于SQL Server 2016.只需检查您的数据库是否正在运行SQL Server 2016兼容级别。
如果您运行的是SQL Server 2014,一个不错的选择是启用跟踪标志2371.此跟踪标志改进了SQL Server用于自动更新统计信息的条件。您应该使用SQL Server配置管理器来启用此跟踪标记。
但是,如果您遵循第一个建议,删除并创建索引,则另外两个建议的影响很小或没有影响。