如果我有一个表,其中包含多个位置的数万条帐户记录。

如果查询选择特定位置的所有帐户的视图和使用相同 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。正如其他人所说,永远都是个人资料!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top