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 不等。无法禁用内存表的自动更新统计信息。此外,不能在子查询中应用“保留计划”选项,如下所示:
if exists(
select 1 from dbo.mytable option (KEEPFIXED PLAN)
)
begin
select 1
end
任何想法,我们如何避免过度重新编译?
解决方案
亚伦,非常感谢您的建议 - 找到了解决方案。它并不完美——我们必须重写很多代码,但它确实有效。我们必须将“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
推荐阅读
- django - 无法在 django 的数据库中存储散列密码
- influxdb - 无法计算 InfluxDB 中的拒绝率
- r - 在数据框中输入其他行作为相邻现有行的值之间的中点
- mysql - 如何从具有相同列/字段名称的表上的连接结果轻松创建表
- python - 如何访问 Python 创建的字典
- nativescript - Nativescript - 按下通知时如何将应用程序置于前台
- javascript - 制表符不是函数
- ruby - 如何获取简单 Sequel Dataset 对象的表名?
- here-api - HereMaps API 端点返回带有换行符的 json
- laravel - Laravel 邮政编码查询