视图中的列数是否会影响性能?

时间:2009-10-05 12:45:28

标签: sql sql-server-2005 performance views

我有一个视图,从表中拉出大约200列,没有连接。使用该视图的过程仅使用大约10列。使用视图,是否有额外的190列对性能有显着影响?

编辑:只是根据原始提问者的评论澄清,他的proc中的查询只使用了200列中的10列。问题是,这是否仍会导致性能下降,因为底层视图包含200列,或者优化器是否知道仅使用10列并忽略视图对其他190个的知识?

谢谢,

克里斯

4 个答案:

答案 0 :(得分:3)

190个多余的列肯定会影响您的表现。 Adam在他的博客中解释了这个问题做得非常好:http://jahaines.blogspot.com/2009/06/superfluous-columns-more-than-bad-habit.html

答案 1 :(得分:1)

首先,如果你的视图限制使用WHERE子句,你可能会受到性能损失,至少,因为如果它与视图自己使用的索引发生冲突,就不能在10列上使用好的索引。

如果视图仅限制列但没有WHERE子句,则不确定 - 请参阅以下详细信息:

基于this article,我推断您将遭受惩罚,因为视图不一定会使用您的10列进行编译,您可能会继承错误的查询计划。

测试非常简单:

  1. 运行查询

    select * from myView where someNonIndexedColumn = someValue

    (确保where子句中的列不在原始表的任何索引中。)

  2. 运行上面的查询并启用查询计划,并确保它进行表扫描。

  3. 现在,选择原始表格索引中的几个列,例如:确保对它们的查询应该使用覆盖索引。比如,索引I1中的C1和C2。

  4. 运行

    select C1, C2 from myTable where C1=x and C2=Y

    启用查询计划并确保它使用“I1”索引作为覆盖索引。

  5. 运行

    select C1, C2 from myView where C1=x and C2=Y

    启用查询计划并检查它是否会进行表扫描或I1作为覆盖索引。

  6. 我怀疑它会进行表格扫描,在这种情况下你回答的是“extr 190列是表现不好” - 基本上,Ryan Fonnett所链接文章中的所有否定都适用于你的观点。

    如果(不太可能)它在#5中使用覆盖索引,那么thew有190 columsn的事实是无关紧要的。

答案 2 :(得分:0)

这一切都取决于当然。它总会产生影响。但是,如果我们讨论的是在与数据库相同的服务器上运行的应用程序,以及每个包含一些字节的列,则影响不应该是重要的。

另一方面,如果我们谈论的是通过网络运行的客户端来访问数据库,并提取190个额外的列,如(字符串* 255),那么如果您的网络管理员可以让您活着就会遇到大麻烦。

在任何一种情况下,查询这么多不必要的列并不是很优雅。为什么不调整您的查询,以便只询问所需的列。我认为你使用“select * from ...”会产生另一个问题:当有人更改视图(添加列或删除列)时,程序将阻止。

答案 3 :(得分:0)

而不是问我们,这是你应该自己测试的东西,因为答案可能高度依赖于数据库和视图的结构以及查询结构和设备组合。测试从视图中选择四列,直接从相关表中选择它们,您将知道您是否具有可测量的性能差异。如果你有意见堆积在视图上,我怀疑你会发现一个可衡量的差异,如果只有一个视图可能没什么大不了的。