通过消除视图简化 SQL Server 查询
Posted
技术标签:
【中文标题】通过消除视图简化 SQL Server 查询【英文标题】:Simplify SQL Server Query by Eliminating Views 【发布时间】:2015-08-12 11:07:39 【问题描述】:我目前正在研究一个非常复杂的视图,该视图依次从其他几个视图中检索数据。我担心如果有人更改了我的源视图之一,我的查询将停止工作。
SQL Server 是否可以为我提供实现相同结果但使用源表(而不是视图)的查询,从而消除对中间视图的需求并通过省略冗余连接来提高性能?
【问题讨论】:
嵌套视图对于我们和优化器来说更难理解和调试 “有办法”是什么意思?这叫做写代码。我错过了什么吗? 【参考方案1】:在 SQL Server Management Studio 的设计视图中查看视图代码。 复制 SQL 代码并将视图的选择输出分配到 SQL 存储过程中的临时表中。现在你在 SP 里面有了一个副本,你不需要依赖视图。
根据我的经验,我发现视图通常具有冗余/重复的数据列,这些数据列需要复杂的计算,并且通常不需要使用这些视图的所有内容。
此外,通过移除嵌套,您将获得性能提升。
或者,如果您不担心性能,您也可以复制一个视图并对其进行不同的标记。
【讨论】:
【参考方案2】:不.... 你必须有一个解决方法。
我的建议是复制您必须使用的视图并使用新名称创建它们,表示“不要更改 " 在您创建的视图定义中的 cmets 和历史记录部分。
【讨论】:
【参考方案3】:为避免破坏基础视图的更改,您可以指定WITH SCHEMABINDING
选项。这将确保在不以正确的依赖顺序重新创建视图的情况下无法更改依赖视图。
我不知道有一种工具可以将嵌套视图重构为单个嵌套视图或查询。理想情况下,SQL Server 优化器会使用现有的嵌套视图进行所需的优化,但它目前在某些情况下做得很差。
我建议您从最外层的视图查询开始,将每个引用的视图替换为派生表,并根据需要进行嵌套。这将导致一个非常丑陋的查询,然后您可以重构直到性能足够。
【讨论】:
【参考方案4】:“有没有办法让 SQL Server 为我提供查询...”
没有。据我所知,无法为您神奇地生成组合 SQL。
但是没有什么可以阻止您在新视图中使用其他视图的 sql。您也可以找到更多优化这种方式的机会。
【讨论】:
以上是关于通过消除视图简化 SQL Server 查询的主要内容,如果未能解决你的问题,请参考以下文章
SQL Server:本地查询时间与网络查询时间...和锁定