2009-09-11 62 views
4

如果我有一个包含数万个多个位置帐户记录的表。SQL Server 2005视图vs物化视图vs存储过程

如果我查询选择所有帐户的特定位置和使用相同SQL语句的存储过程的视图,是否有速度差异?

编辑:我跑过这个物化视图。这似乎总是会被使用。

什么时候你想要使用存储过程,视图和物化视图?做出这个决定时你想记住哪些利弊?

回答

3

简短的回答:“这取决于”

较长的回答:“这取决于查询的形状”

与有关SQL Server性能的任何问题(什么是更好的:X对y)没有正确的答案。在查看与sprocs的情况下,没有办法可靠地预测哪个(如果有的话)会更快,而且不能分析查询。

我已经看到两者都会更快,并且这取决于如何使用视图以及它是否是更大查询的一部分。我还看到视图缓慢查询,因为它们可以隐藏很多使用视图的查询实际上不需要的复杂性。你需要评估你试图达到的目标:如果你所要做的只是想访问表格行,而你不打算把输出作为另一个查询的一部分, d选择一个存储过程,特别是如果针对该表的查询将采用某个WHERE子句。

查询将从哪里被调用? SQL的另一部分?一些应用框架?自定义数据访问层?值得思考调用代码如何将查询放在一起,因为这会影响SQL Server如何缓存和重用执行计划。如果它只是将一堆动态SQL捆绑在一起,那么性能可能会受到一些影响,因为SQL Server可能需要每次重新生成查询计划;因此在这种情况下,存储缓存计划的优势在于存储优势。如果访问层是智能的并且执行了参数化动态SQL,则可能没有太多内容。

结论:明白你想达到的目标。然后轮廓,调整,调整,并重复,直到满意。

1

是的,没有。

视图是一种查询定义,在使用时基本上被原地替换,并被编译到引用视图的查询中。这意味着实际执行取决于引用视图的查询。如果查询是一个简单的SELECT * FROM view,那么这将与等效过程几乎完全相同的执行计划。但是,如果查询是SELECT onefield FROM view的查询是显着不同。没有等效的过程,并且由于投影列表缩减,此查询可能会显着改善。

也有巨大的可用性差异。存储过程只能执行。可以从中选择一个视图,与多个其他语句(如连接,子查询等)一起使用。

鉴于视图具有更好的灵活性,除非没有其他因素发挥作用,否则只有具有参数时过程才有意义,因为视图不能有参数。

+1

如果您需要参数,但希望获得视图的其他优势,例如“从多个其他语句(如连接...)中选择并使用它们”,那么应该考虑使用表值的用户定义函数。 – 2009-09-14 04:09:44

1

视图和存储过程都被编译到数据库中,因此它们比直接查询更快,它们之间的速度差异在您需要具有动态参数时出现。意见只是不接受他们。

每个人都有他自己的具体用途。视图可用于其他查询或视图,存储过程只能执行。但在你的问题与相同的SELECT * FROM他们有完全相同的速度。

+2

SQL Server中没有“编译到数据库”。从视图,过程和即席查询的查询在编译计划的速度,编译和缓存方面都将完全相同,只要它们具有相同的相同定义即可。 – 2009-09-11 21:03:03

0

这个Post的anserws将提供SQL Server中索引(物化)视图的有用背景。

0

我也看到每个人都比另一个快,取决于上下文。

我遵循的一般经验法则是:如果视图具有复杂的WHERE,取决于其他适度复杂的视图或是UNION [ALL]的结果,那么几乎可以肯定SQL S将无法将适用于视图的WHERE条件适当地传播到各个表,因此在某一时刻,您将开始获取表扫描(除非它是物化视图),否则您的执行计划将比执行计划复杂得多他们可能是。

在这些情况下,最好选择proc。正如其他人所说,永远是个人资料!