插入触发器中的执行计划不正确,UPDATE到基表在标识列上具有主键,因为插入的行数变化

时间:2016-10-18 06:29:19

标签: sql-server performance triggers

我有一个表t1,在此表的标识列上有一个主键。在t1的插入触发器中,正在发出UPDATE语句以更新新插入的行的某些列,该连接位于t1.primarykeycolumninserted.primarykeycolumn上。

当插入的行数开始增加时,我注意到“次优”'执行计划。我想优化器正在引用t1的统计数据来得出执行计划。但是对于新插入的行,统计页面总是过时的,因为当SQL Server提供值时,所有IDENTITY列总是会单调增加。

为了证明统计数据是问题',我发出UPDATE STATISTICS命令作为触发器中的第一个语句,优化器能够为广泛的方案提出一个非常好的计划各种各样的行。但我当然不能在大多数OLTP系统的生产代码中发出UPDATE STATISTICS

大多数情况下,插入的行数将是几十个,偶尔只有几千个。当十位中的行数时,执行计划仅显示嵌套循环连接,同时随着行数开始爬升,它在某一时刻切换到使用一系列合并连接+流聚合。

我想避免在触发器中编写复杂的代码,一部分用于处理大量行,另一部分用于处理较少的行。毕竟,这是服务器最擅长的。有没有办法告诉优化器即使您没有在统计信息中看到插入的值,分布也将与之前插入的分布完全相同。请根据这个假设提出计划'?任何指针都赞赏。

经过实验,我有以下观察: 在没有统计数据的情况下,优化器会针对非常多的行提出最佳计划。只有在发布插入之前更新统计数据时(即有统计数据可用时),优化程序才会出现“错误”。计划插入和插入之间的连接当行数开始上升时,触发器内的基表。

有没有办法告诉优化器&忽略统计页面上的内容,在没有统计信息的情况下去做你正在做的事情"?

1 个答案:

答案 0 :(得分:0)

在这种特定情况下,INSTEAD OF INSERT触发器是一个可行的选择。见http://www.sqlservercentral.com/Forums/Topic1826794-3387-1.aspx