2011-03-15 140 views
1

我在视图上创建了一个唯一的聚集索引。聚集索引包含5列(该视图中的30列),但使用此视图的典型选择将需要全部30列。Sql Server 2005索引视图

做一些测试表明查询5列所花费的时间比所有30列快得多。这是因为这是关于选择6x列的天然开销,或者是因为索引视图没有将非索引列存储在临时表中,因此需要执行一些额外步骤来收集缺失列(连接我想呢?)

如果是后者,有什么办法可以防止这个?那么,即使前者......有什么办法解决这个问题!

编辑:出于比较目的,只有5列的索引视图上的选择比基表上的相同查询快大约10倍。但是,对所有列的选择基本上与基本表上的查询速度相同。

回答

0

按照定义,聚集索引包含表中每一行中的每个字段。它基本上是对表格的重新创建,但物理数据页面按聚簇索引顺序排列,使用B树排序可快速访问聚簇键的指定值。

你只是拉动值,或者你是否在其他25个字段获得像MIN(), MAX(), AVG(), SUM()这样的聚合函数?

+0

只需拔值 – 2011-03-15 20:46:12

+0

@Joda - 什么在你的where子句?向视图添加聚集索引实际上会执行视图查询并将结果存储在索引中,因此这不是您的第二个担心。 – JNK 2011-03-15 20:47:28

+0

where子句包含索引的5列中的3列的值 – 2011-03-15 20:50:05

0

索引视图是数据的副本,可能(并且通常)以不同的方式存储(聚集)到基表中。对于所有的目的

  • 你现在有两份数据
  • SQL Server是足够聪明地看到,视图和表是查询只涉及在列彼此
    • 别名索引视图
    • 如果索引视图包含所有列,它被认为是一个完整的别名,可以使用(取代的)由任何地方查询表
  • 中优化当您只选择从tbl 5列(其中有一个索引视图ivw

    • SQL服务器完全忽略你的表dexed视图可以作为只是一个指数的基表

    ,并只是给你从ivw

  • 数据,因为数据页是短(只有5列),更多的记录可以抓住到每个页面检索记忆,让你在速度增加五倍

当您选择全部30列时 - 索引视图无法帮助您。该查询完全忽略了该视图,只是从基表中选择数据。

IF选择从所有30列中的数据,

  • ,但是,从索引视图的前4列的查询过滤器,*
  • 和过滤器是非常有选择性的(将导致记录的非常小的子集)

SQL Server可以使用索引视图(扫描/搜索)快速生成一个小的结果集,它可以再使用JOIN回基表得到的休息数据。

  • 然而,类似于常规索引,对(A,B,C,d,E)的索引或在这种情况下聚集在(A,B,C,d,E)索引视图确实NOT帮助在(b,d,e)上搜索的查询,因为它们不是索引中的第一列。