Sql Server 2005索引视图

时间:2011-03-15 20:38:25

标签: sql-server sql-server-2005

我在视图上创建了一个唯一的聚簇索引。聚集索引包含5列(在此视图中为30列),但使用此视图的典型选择将需要所有30列。

进行一些测试表明,查询5列所需的时间比所有30列快。这是因为这只是选择6x列的自然开销,或者因为索引视图没有将非索引列存储在临时表中,因此需要执行一些额外的步骤来收集丢失的列(连接上基本表我猜?)

如果是后者,有什么措施可以防止这种情况发生?好吧,即使前者......有什么方法可以解决这个问题!

编辑:为了进行比较,仅使用5列的索引视图上的选择比基表上的相同查询快约10倍。但是对所有列的select在速度上与基表上的查询基本相同。

2 个答案:

答案 0 :(得分:0)

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

您是仅仅提取价值还是为其他25个字段获得MIN(), MAX(), AVG(), SUM()等汇总功能?

答案 1 :(得分:0)

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

  • 您现在有两份数据
  • SQL Server非常聪明,可以看到视图和表是彼此的别名
    • 用于仅涉及索引视图中的列的查询
    • 如果索引视图包含所有列,则它被视为完整别名,并且可以在查询表的任何位置由优化程序使用(替换)
  • 索引视图可以仅用作基表的另一个索引

当您仅选择tbl中的5列时(其中包含索引视图ivw

  • SQL Server完全忽略您的表格,只是从ivw
  • 中提供数据
  • 因为数据页较短(仅5列),每次页面检索都可以抓取更多记录到内存中,因此速度提高5倍

当您选择所有30列时 - 索引视图无法提供帮助。查询完全忽略视图,只从基表中选择数据。

IF ,您可以从所有30列中选择数据

  • 但查询过滤了索引视图的前4列*
  • 并且过滤器非常有选择性(将产生非常小的记录子集)

SQL Server可以使用索引视图(扫描/搜索)快速生成一个小结果集,然后可以使用它来JOIN返回基表以获取其余数据。

  • 但是,与常规索引类似,(a,b,c,d,e)上的索引或者(a,b,c,d,e)上的聚集索引视图的索引 NOT 帮助搜索(b,d,e)的查询,因为它们不是索引中的第一列。