【问题标题】:Error executing view with massive UNIONs使用大量 UNION 执行视图时出错
【发布时间】:2017-06-01 14:35:54
【问题描述】:

我必须执行一个视图 A,它从其他视图 B 中获取数据,该视图由三百个相同类型的视图的 UNION 组成(两个表之间的连接) .当我执行视图 A 时,它会崩溃并显示以下错误:

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

由于出现错误,查询执行计划没有生成,但我已经能够为另一个执行生成它。我无法上传查看 A 的执行计划,因为它的权重很大,但您可以在此处查看 B 的执行计划:

https://www.brentozar.com/pastetheplan/?id=S1i7FiTWb

有没有办法避免这个错误?

【问题讨论】:

  • 你手上有性能定时炸弹,因为你使用的是嵌套视图。从它的声音来看,它们的嵌套深度越来越深。这是完全破坏优化器生成体面执行计划的能力的可靠方法。说真的....300 次观看???? simple-talk.com/sql/performance/…
  • 是的,查询有几个嵌套级别,在一些奇怪但可能的情况下,它可以有 300 个视图。
  • 正如我所说的嵌套视图正在杀死你。但是,如果您的查询有多达 300 个视图,似乎还有其他一些严重的架构问题。
  • 是的,问题是视图位于多个数据库中,我无法从其他数据库中引用动态对象。
  • 我无法从其他数据库中引用动态对象为什么?

标签: sql sql-server query-performance sqlperformance


【解决方案1】:

是的,你可以。你必须重新设计你的架构。 Sql Server 的资源有限,从 300 个视图中选择是一个非常荒谬的数量。

没有ifs、buts或maybes,这样的配置将继续困扰你,直到你有,这里没有人能帮助你。

【讨论】:

  • 问题是我没有创建那个配置,我的目标不是重新定义它。
  • 嗯,这是一个问题,然后他们没有其他人,但你可以解决。鉴于问题在于您的架构,这里没有人可以帮助您。因此,这不是一个符合 Stack Overflow 哲学的问题。
猜你喜欢
  • 1970-01-01
  • 2018-03-16
  • 2021-10-12
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 2018-11-11
  • 2018-07-18
  • 1970-01-01
相关资源
最近更新 更多