列存储索引创建失败并出现此错误“资源池'默认'中没有足够的内存来运行此查询”

Posted

技术标签:

【中文标题】列存储索引创建失败并出现此错误“资源池\'默认\'中没有足够的内存来运行此查询”【英文标题】:Columnstore index creation fails with this error "There is insufficient memory in resource pool 'default' to run this query"列存储索引创建失败并出现此错误“资源池'默认'中没有足够的内存来运行此查询” 【发布时间】:2019-11-12 10:42:55 【问题描述】:

当尝试执行此命令创建列存储索引时,我收到以下错误“资源池 'default' 内存不足,无法运行此查询”

服务器是 SQL Server 2016 Enterprise。 5tb 硬盘空间,128gb 内存。最大内存设置为 120gb,为操作系统留出 8gb。这台机器上除了运行 SQL 之外没有其他服务。

我尝试在其上创建列存储索引的表是 36gb、20 亿行和 8 列宽,主要是 int 和 date。

我是否正确假设 120gb 不够?虽然我尝试在 55m 行 6gb 表上运行列存储,但也失败了。

CREATE CLUSTERED COLUMNSTORE INDEX [CCI-BIG] ON [DBO].[BIG_DATA]
WITH (DROP_EXISTING = OFF, COMPRESSION_DELAY = 0) ON [PRIMARY]
GO

【问题讨论】:

您可以尝试减少MAXDOP 使用的并行度;这对需要多少内存有很大影响。您还可以通过更改资源池中的最大内存授予设置来调整请求的内存量——有关更多信息,请参阅this post。 【参考方案1】:

该错误表示您没有足够的 RAM 来创建索引。您需要检查分配给 SQL Server 的 RAM 量(至少检查 SQL Server 在进程管理器中的 RAM 利用率。它不必小于表的大小)。

另外,尽量减少 MAXDOP。例如,运行以下代码:

CREATE CLUSTERED COLUMNSTORE INDEX [CCI-BIG] ON [DBO].[BIG_DATA]
WITH (DROP_EXISTING = OFF, COMPRESSION_DELAY = 0, MAXDOP = 1) ON [PRIMARY]
GO

【讨论】:

以上是关于列存储索引创建失败并出现此错误“资源池'默认'中没有足够的内存来运行此查询”的主要内容,如果未能解决你的问题,请参考以下文章

断言失败:闯入调试器

创建索引时,具有 mysql 数据库迁移的实体框架失败

如何创建唯一索引

尝试重新加载部分时出现断言失败错误

构建失败并出现错误错误代码 72 命令:xcrun

列具有无法参与列存储索引的数据类型