首页 > 解决方案 > 内存表的重新编译问题

问题描述

在我们的高负载 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 不等。无法禁用内存表的自动更新统计信息。此外,不能在子查询中应用“保留计划”选项,如下所示:

if exists(
    select 1 from dbo.mytable option (KEEPFIXED PLAN)
)
begin
    select 1
end

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

标签: sql-server

解决方案


亚伦,非常感谢您的建议 - 找到了解决方案。它并不完美——我们必须重写很多代码,但它确实有效。我们必须将“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

推荐阅读