SQL Server 2005 视图、物化视图、存储过程
-
06-07-2019 - |
题
如果我有一个表,其中包含多个位置的数万条帐户记录。
如果查询选择特定位置的所有帐户的视图和使用相同 SQL 语句的存储过程,速度是否有差异?
编辑:我遇到了这个物化视图。好像永远都会用到这个。
您什么时候想使用存储过程、视图和物化视图?在做出这个决定时,您想牢记哪些利弊?
解决方案
简短回答:“这取决于”
更长的回答:“这取决于查询的形状”
正如关于SQL Server性能的任何问题(更好的是:x vs y),没有正确的答案。在视图与sprocs的情况下,没有办法可靠地预测哪些(如果有的话)会更快,而不是分析查询。
我看到两者都更快,它归结为视图的使用方式以及它是否是更大查询的一部分。我也看到了查看缓慢查询,因为它们可以隐藏使用视图的查询实际上不需要的很多复杂性。
您需要评估您要实现的目标:如果您所做的只是想要访问表行,并且您不想将输出用作另一个查询的一部分,那么我会选择一个存储过程,特别是如果针对该表的查询将采用一些WHERE子句。
要从哪里调用查询? SQL的另一部分?一些应用框架?自定义数据访问层?值得思考调用代码如何将查询放在一起,因为这会影响SQL Server最终缓存和重用执行计划的方式。如果它只是将一堆动态SQL捆绑在一起,那么性能可能会受到轻微影响,因为SQL Server可能每次都需要重建查询计划;所以在这种情况下,sproc具有缓存计划的优势。如果访问层是智能的并且参数化动态SQL,则可能没有那么多。
结论:了解你想要实现的目标。然后分析,调整,调整和重复,直到满意为止。
其他提示
视图和存储过程都被编译到数据库中,因此它们比直接查询更快,当您需要动态参数时,它们之间的速度差异就会显现出来。这些观点就是不接受他们。
每一种都有其特定的用途。视图可以在其他查询或视图中使用,存储过程只能被执行。但在你的问题上,使用相同的 SELECT * FROM 它们具有完全相同的速度。
是和否。
视图是一种查询定义,在使用时基本上就地替换,并且它被编译到引用视图的查询中。这意味着实际执行取决于引用视图的查询。如果查询是直接的 SELECT * FROM view
,那么这将与完全相同的执行计划完全相同。但是,如果查询是 SELECT onefield FROM view
,则查询显着不同。没有等效的过程,由于投影列表减少,此查询可能会表现得更好。
还存在巨大的可用性差异。只能执行存储过程。可以从和中选择一个视图,该视图与多个其他语句(如连接,子查询等)一起使用。
鉴于视图的灵活性要好得多,除非没有其他因素起作用,否则只有在您拥有参数时,程序才有意义,因为视图不能包含参数。
anserws to this 发布将提供SQL Server中索引(物化)视图的有用背景。
我也看到每一个都比另一个更快,具体取决于具体情况。
我遵循的一般经验法则是:如果视图具有复杂的WHERE,取决于其他中等复杂的视图或者是UNION [ALL]的结果,那么几乎可以肯定SQL S.将无法正确传播WHERE条件应用于视图一直到各个表,所以在某一点上你将开始获得表扫描(除非它是物化视图)或你的执行计划将比它们更复杂(和慢)可能是。
在这些情况下,最好选择proc。正如其他人所说,永远都是个人资料!