INDEX问题

时间:2011-03-25 20:39:18

标签: sql sql-server indexing

您好我是sql的新手,我想知道是否有人可以告诉我在同一列上使用CLUSTERED和NON CLUSTERED INDEX。我在我的工作中查看了一些表脚本,但是没有理解在一列上使用集群索引和非集群索引有什么用。它是一个ID列,它位于数据库的所有表中。

2 个答案:

答案 0 :(得分:4)

聚集索引实际上并不是一个索引 - 在某种意义上它是根据密钥在树中组织的所有数据。

非聚集索引只是树中的键,包含任何其他包含的列以及必要时可以访问数据行的必要书签。数据本身可以存储在聚簇索引或堆中。并且可以有许多非聚集索引,但显然只有一种选择存储数据的真实方法。

对于特定查询的性能,在堆上覆盖非聚集索引(或者无论如何,因为索引覆盖它并不重要)通常可以轻松地胜过聚簇索引,因为索引可能适合更多行每页并且不需要书签查找来从行中获取数据,而聚集索引搜索/扫描将读取并丢弃更多数据并且每页适合更少的行。

通常,您需要聚簇索引,聚类键应该是窄的,静态的,增加的,唯一的。

但是对于查询性能,您确实希望查看非聚簇索引,并选择覆盖哪些内容并在适当的方向上具有排序顺序。

答案 1 :(得分:2)

在非常简单的术语中,CLUSTERED和NON CLUSTERED INDEX之间的区别在于CLUSTERED索引是表中记录的物理排序,基于索引字段中的值,而NON CLUSTERED索引是逻辑排序表中的记录基于索引字段中的值。这种逻辑顺序由SQL数据库引擎根据表中值的统计分布决定。

另一个重要的区别是,对于一个表,您只能有一个CLUSTERED索引(因为它是存储在该表中的数据的物理排序)。虽然您可以在同一个表中的不同字段上拥有许多不同的NON CLUSTERED索引。

说到这一点,当然你可以在表的同一个字段上同时拥有CLUSTERED和NON CLUSTERED索引,这很有用,因为通常CLUSTERED索引特别擅长顺序访问数据,而NON CLUSTERED索引可以针对随机访问进行优化由SQL数据库引擎的数据。这样,当基于索引字段中的值进行搜索时,同一列上的CLUSTERED和NON CLUSTERED索引的组合可以高度优化对该表中记录的访问。