在高负载的OLTP处理中,我们使用永久性内存表,例如临时表(类似于https://docs.microsoft.com/en-us/sql/relational-databases/in-memory-oltp/faster-temp-table-and-table-variable-by-using-memory-optimization?view=sql-server-2017,情况C)。但是,在低负载下,我们发现存储过程中的大量重新编译是由“ 2-统计信息已更改”原因引起的。每次执行时,这些表中的行数从0到50-100不等。无法禁用内存表上的自动更新统计信息。另外,选项'KEEPFIXED PLAN'不能应用于这样的子查询:
if exists(
select 1 from dbo.mytable option (KEEPFIXED PLAN)
)
begin
select 1
end
任何想法,我们如何避免过多的重新编译?
答案 0 :(得分:0)
亚伦,非常感谢您的建议-找到解决方案。这不是完美的-我们必须重写很多代码,但是它可以工作。我们必须将“ if”运算符更改为查询,因此我们可以通过以下方式应用提示:
declare @exists int
select @exists = 1 where exists (select 1 from dbo.MyTable) option (KEEPFIXED PLAN)
if @exists = 1
begin
select 'exists!!!'
end
else
begin
select 'not exists...'
end