Sql 视图的复杂性-综合还是构建块?

Sql 视图的复杂性-综合还是构建块?,sql,database,views,Sql,Database,Views,在针对数据库创建多个视图时,最好是有几个综合视图,或者有更多的“构建块”可以连接在一起以实现所需的结果,还是两者的混合不一定是坏事 作为一名SQL Server开发人员,我一直被大视图(许多表)可能对查询优化器造成的复杂性所困扰——这当然适用于涉及大量表的任何查询 有什么经验法则可以帮助确定某个特定视图是否可行吗?本周我只讨论了这个问题。这是我的经验 每个视图都应特定于手头的任务。我们试图在视图(etc)之上构建一个视图,但很快就遇到了性能问题(当然是在生产过程中)。切换到返回特定数据的单个查询

在针对数据库创建多个视图时,最好是有几个综合视图,或者有更多的“构建块”可以连接在一起以实现所需的结果,还是两者的混合不一定是坏事

作为一名SQL Server开发人员,我一直被大视图(许多表)可能对查询优化器造成的复杂性所困扰——这当然适用于涉及大量表的任何查询


有什么经验法则可以帮助确定某个特定视图是否可行吗?

本周我只讨论了这个问题。这是我的经验

每个视图都应特定于手头的任务。我们试图在视图(etc)之上构建一个视图,但很快就遇到了性能问题(当然是在生产过程中)。切换到返回特定数据的单个查询,而不是从构建块视图构建数据,使性能恢复到预期水平

spceific视图/查询的好处在于它们特定于手头的任务。他们可以跑得更快,因为他们只做必要的工作

特定视图的缺点是在每个视图中都必须维护类似的逻辑


在我们的情况下,别无选择。使用构建块视图时,性能下降。

SQL允许您组合视图或任何数据库对象的程度是有限的。如果您有许多“构建块”视图,那么当从这些构建块组成另一个视图时,查询优化器可能会多次合并同一个表。此外,也可以联接不需要的表。因此,尽管构建块概念可以提供一定程度的可重用性,但应谨慎使用。相反,着眼于为特定需求设计视图,那么您可以考虑将其分解为构建块。一般来说,

SQL开发对软件开发范式来说不是很好:它不可重用,不导致干式定义,难以维护。但最重要的是,大多数能够改善这种现状并带来更高质量代码结果的技术都是运行时问题。SQL运行时问题与代码中的次优代码结构完全不同,它会导致错误的计划,结果比最佳计划慢几十倍甚至几百倍。换句话说,当一个基于合理块的干式查询定义导致一个运行10秒的表扫描计划,而一个丑陋的单次使用视图有一个运行10毫秒的更好的计划时,您将忘记关于干式的一切,而使用丑陋但快速的视图。好计划和坏计划之间的运行时间差异太大了

这就是为什么在SQL开发中,一个好的项目最终会得到一些经过优化的查询,这些查询会不断地进行性能测量和检查。我很难过地说,但根据我的经验,SQL代码越是“健康”地来自于经典的代码pov(干燥、可重用、可维护),它在实际生产中面对大数据量时遇到的问题就越多。我真的希望有一种简单的方法来部署可重用的SQL块,这些SQL块可以组装成复杂的结构。它就是不能那样工作。我对SQL查询优化的工作原理非常了解,可以理解查询优化器将生成的复杂块视为一个整体,不能将内部块作为“工作单元”加以利用,他们的任务是优化最终结果。考虑到数据访问路径、IO成本、数据大小、列值分布概率等因素,优化这些复杂的查询是非常非常复杂的,比要求C#优化器执行的任务要复杂几个数量级


我的建议是:保留一些经过测试和调整的复杂视图。撰写基本构建块的自由很快就会被滥用,你会发现它已经太晚了。

谢谢你的回答-你是说这种经历“让你放弃”构建块视图的想法,还是仅仅让你在使用它们时更加谨慎?它完全让我放弃了它们。我在过去曾体验过“视图至上”的问题,但从未真正了解过为什么会出现这样的问题。当我看到具体的查询结果是多么优雅和流线型时,我变成了一个皈依者。SQL不像java/c#/etc那样构建一堆小的代码来串在一起,所以听起来你会避开视图,至少是作为代码重用的一种手段。这绝对是“值得思考的东西”谢谢,Scott。谢谢,这很有意义-那么,您是否建议,创建视图是最好的选择,直到您编写了一些更复杂的查询与数据之后-当您能够很好地了解什么是有用的构建块时?确切地说,当您看到适当的位置和重用的必要性时,您将创建构建块视图。拥有一个仅由另一个较大视图使用的构建块视图是一种过分的做法。谢谢,完全同意:视图使用-就像一般的代码重用一样,通常不值得将在一个地方使用的东西分解出来-除非您预期将来会发生这种变化。谢谢您的回答。这听起来很像我在过去使用视图时遇到的情况,并且与迄今为止收到的其他答案相联系。我肯定会鼓励在“我的工作场所”进行持续的性能检查——在性能优异的SQL查询和服务器杀手之间有一条很好的界线——也许仅仅是一个看似无害的连接,整个过程就会崩溃。