通过消除视图简化 SQL 服务器查询
Simplify SQL Server Query by Eliminating Views
我目前正在处理一个非常复杂的视图,该视图依次从其他几个视图中检索数据。我担心如果有人更改我的源视图之一,我的查询将停止工作。
有没有办法 SQL 服务器可以为我提供一个查询,该查询可以实现相同的结果但使用源表(而不是视图),从而消除对中间视图的需要并通过省略来提高性能冗余连接?
没有....
你必须有一个解决方法。
我的建议是 c复制您必须使用的视图并使用新名称创建它们,表明“不要在您创建的视图定义的评论和历史部分中更改”。
在SQL服务器管理工作室的设计视图中查看视图代码。
复制 SQL 代码并将视图的 select 输出分配到 SQL 存储过程中的临时 table。现在你在 SP 中有一个副本,你不需要依赖视图。
根据我的经验,我发现视图通常有 redundant/repeated 数据列,这些数据列需要复杂的计算,并且通常不需要使用这些视图的所有内容。
此外,通过删除嵌套,您将获得性能提升。
或者,如果您不担心性能,您也可以复制一个视图并为其添加不同的标签。
为避免破坏基础视图的更改,您可以指定 WITH SCHEMABINDING
选项。这将确保在不以正确的依赖顺序重新创建视图的情况下无法更改依赖视图。
我不知道有什么工具可以将嵌套视图重构为单个嵌套视图或查询。理想情况下,SQL 服务器优化器将对现有的嵌套视图进行所需的优化,但目前在某些情况下它做得很差。
我建议您从最外层的视图查询开始,并用派生的 table 替换每个引用的视图,然后根据需要进行嵌套。这将导致一个非常丑陋的查询,然后您可以重构直到性能足够。
"Is there a way on how SQL Server can provide me with a query ..."
没有。据我所知,无法为您神奇地生成组合 SQL。
但是没有什么可以阻止您在新视图中使用其他视图的 sql。您可能还会发现更多机会以这种方式进行优化。
我目前正在处理一个非常复杂的视图,该视图依次从其他几个视图中检索数据。我担心如果有人更改我的源视图之一,我的查询将停止工作。
有没有办法 SQL 服务器可以为我提供一个查询,该查询可以实现相同的结果但使用源表(而不是视图),从而消除对中间视图的需要并通过省略来提高性能冗余连接?
没有.... 你必须有一个解决方法。
我的建议是 c复制您必须使用的视图并使用新名称创建它们,表明“不要在您创建的视图定义的评论和历史部分中更改”。
在SQL服务器管理工作室的设计视图中查看视图代码。 复制 SQL 代码并将视图的 select 输出分配到 SQL 存储过程中的临时 table。现在你在 SP 中有一个副本,你不需要依赖视图。
根据我的经验,我发现视图通常有 redundant/repeated 数据列,这些数据列需要复杂的计算,并且通常不需要使用这些视图的所有内容。
此外,通过删除嵌套,您将获得性能提升。
或者,如果您不担心性能,您也可以复制一个视图并为其添加不同的标签。
为避免破坏基础视图的更改,您可以指定 WITH SCHEMABINDING
选项。这将确保在不以正确的依赖顺序重新创建视图的情况下无法更改依赖视图。
我不知道有什么工具可以将嵌套视图重构为单个嵌套视图或查询。理想情况下,SQL 服务器优化器将对现有的嵌套视图进行所需的优化,但目前在某些情况下它做得很差。
我建议您从最外层的视图查询开始,并用派生的 table 替换每个引用的视图,然后根据需要进行嵌套。这将导致一个非常丑陋的查询,然后您可以重构直到性能足够。
"Is there a way on how SQL Server can provide me with a query ..."
没有。据我所知,无法为您神奇地生成组合 SQL。
但是没有什么可以阻止您在新视图中使用其他视图的 sql。您可能还会发现更多机会以这种方式进行优化。