【问题标题】:SQL server query processor ran out of internal resourcesSQL Server 查询处理器内部资源不足
【发布时间】:2011-10-18 08:08:26
【问题描述】:

查询:

update mytable 
    set mycol = null
    where id in (
        583048,
        583049,
        ... (50000 more)
)

消息:

查询处理器用尽了内部资源,无法 生成查询计划。这是一个罕见的事件,只预计 极其复杂的查询或引用非常大的查询 表或分区的数量。请简化查询。如果你 相信您错误地收到了此消息,请联系客户 支持服务了解更多信息。

我的查询很简单, 我应该如何写它才能正常工作?

【问题讨论】:

  • 我有一个非常相似的问题。对我来说这是一个简单的解决方法:尝试将 AsParallel() 添加到查询中,就在 ToList() 或 Count() 之前。此选项拆分查询并分别执行它们,加入结果。谁知道你也可能获得性能提升。

标签: sql-server tsql


【解决方案1】:

将值列表插入#temp 表,然后在其上使用in

正如in this answer 解释的那样,大量的IN 值可能会导致它在扩展到OR 时耗尽堆栈

See also related connect item

【讨论】:

  • 好吧,你不能将值插入到#temp 表中,它会失败并出现同样的错误。
  • SQL Server Management Studio 在语法分析扫描文本时崩溃(行数过多?)。所以我使用了 Visual Studio,将列表分成 10 组,每组 10k 行,并运行查询 10 次 ...
  • @Softion - 什么失败了?插入#temp 表或使用in 内的#temp 表?
  • 插入失败并出现同样的错误。还是我错过了什么?
  • 将 50000 个值放入 CSV 文件中,并使用 BULK INSERT 将数据插入到表中。然后你就可以使用它了。
【解决方案2】:

如果您在 SQL Server 2016 或更高版本中发现此错误,请尝试将数据库兼容级别更改为较低版本 120 或 110 等 (link)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多