内存表的重新编译问题

时间:2018-07-23 15:15:07

标签: sql-server

在高负载的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

任何想法,我们如何避免过多的重新编译?

1 个答案:

答案 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