聚集索引的正确用法是什么?

时间:2016-01-12 16:14:59

标签: sql-server tsql clustered-index

我可能没有正确地构思这个问题。通过使用,我不是说我应该在何时何地在桌面上创建一个 - 这将是一个过于宽泛的问题。

我的意思是,一旦我创建聚簇索引,它是否会提高性能,或者我是否需要在查询中使用关联列来提高性能?

这是一个例子:假设我创建了一个包含以下列的表; RowNum,FileId,Name和Date。 RowNum我创建了一个标识列,我应用了一个聚簇索引。但是,实际上通常使用FileId查询表。例如:

SELECT
    FileId, 
    Name
FROM MyTable
WHERE FileId IN ('11101101', '11101201', '11101301')

由于查询中未使用RowNum,我仍然可以从索引中获得任何性能优势吗?

如果这是一个基本问题,请提前抱歉。我一直在阅读约束和索引,我想确定我理解它们。这似乎是我读到的所有内容中的一个点。

编辑:我想我得到了答案。或者至少接近我将要得到的明确答案。

让我稍微重申一下这个问题:我想要解决的是假设我有一个包含三列的表,rowNum,Id和Name。通常会在Id或Name上查询此表,让我们更进一步说我们将在每个列上都有非聚簇索引。我的问题是,在这种情况下,rowNum上的聚簇索引可以提高使用其他列的查询的性能。

我最好收集,答案是肯定的,但你可能想考虑将聚集索引放在另一列上。

这是一个非常广泛的问题,我很欣赏每个人提供的洞察力。我接近一个好的答案,因为我将得到相关的事实,而且我现在对索引更了解。再次感谢!

3 个答案:

答案 0 :(得分:1)

如果表具有自然主键,那么这是聚簇索引的良好候选者。

在您的情况下,RowNum是聚簇索引上的标识PK。这对于通过RowNum查找行很有用,并且对连接很有用。

有时您会在查询中看到一个PK或其他索引,它甚至看起来都不会使用该列。

您发布的查询将受益于FileId上的非聚集索引。

如果FileId是唯一的,那么将其视为PK并跳过RowNum。

答案 1 :(得分:0)

简短的回答是你需要有1个!每个表的聚集索引,通常是PK。如果它是计数器,则PK是正确的候选者(意味着新行将在表的末尾)。关于SO(like this one)和网上有很多关于此问题的讨论。

答案 2 :(得分:0)

关于表现和指数的许多问题,正确的答案是:取决于

聚簇索引意味着您的表不是由该列排序的“物理”(这就是为什么您只能在表中使用单个聚簇索引)。这也是为什么在该索引中使用非顺序值列是一个坏主意的原因。

同样在MSSQL Server中,如果您在表中获得了唯一的聚簇索引,则您创建的其他索引“隐式”包括聚簇索引。

一般来说......

当您对其列进行大量过滤/排序时,聚簇索引适用于选择。

在@Frisbee评论的自然或代理键上使用它也很常见。

聚簇索引不适合插入/更新,并且当您更改聚合索引列上的值/插入不是连续值时非常糟糕,因为引擎会尝试保持索引B树平衡和有序

确保正确使用索引的唯一方法是对其进行酸性测试(使用膨胀的数据库)并研究其实际查询计划。

我建议您查找MSDNSQL Server Central等网站,并详细了解索引,因为这个主题对于这个答案来说过于宽泛。