聚簇索引的正确使用是什么?

What is the proper use of a clustered index?

我可能没有正确地提出这个问题。通过使用,我并不是说我应该在什么时候什么时候在 table 上创建一个 - 那将是一个过于宽泛的问题。

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

这是一个示例:假设我创建了一个 table,其中包含以下列; RowNum、FileId、名称和日期。 RowNum 我创建为标识列并应用聚集索引。但是,实际上 table 通常使用 FileId 进行查询。例如:

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

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

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

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

让我稍微重述一下这个问题:我试图解决的问题是假设我有一个 table,它包含三列:rowNum、Id 和 Name。这个 table 通常会在 Id 或 Name 上查询,让我们更进一步,假设我们将在这些列的每一列上都有非聚集索引。我的问题是,在这种情况下,rowNum 上的聚集索引是否会提高使用其他列的查询的性能。

据我所知,答案是肯定的,但您可能要考虑将聚簇索引放在另一列上。

这是一个非常广泛的问题,我感谢每个人提供的见解。在给出相关事实的情况下,我离一个好的答案很近了,而且我现在对索引有了更多的了解。再次感谢!

简而言之,您需要拥有 1 个!每个聚簇索引table,也是经常PK的。 PK 是正确的候选者,如果它是反的(意味着新行将在 table 的末尾)。关于 SO (like this one) 和网上对此有很多讨论。

如果 table 有一个自然主键,那么它是聚簇索引的一个很好的候选者。

在您的例子中,RowNum 是聚簇索引上的标识 PK。这有利于按 RowNum 查找行,也有利于连接。

有时您会看到在查询中使用的 PK 或其他索引甚至看起来都没有使用该列。

您发布的查询将受益于 FileId 上的 non-clustered 索引。

如果 FileId 是唯一的,则考虑将其用于 PK 并跳过 RowNum。

关于性能和索引的问题很多,正确答案是:视情况而定

聚集索引意味着您的 table 将按该列“物理”排序(这就是为什么您只能在 table 中拥有一个聚集索引)。这也是为什么对该索引使用非顺序值列不是一个好主意的原因。

此外,在 MSSQL Server 中,如果您在 table 中获得了唯一聚集索引,则您创建的任何其他索引都会“隐式”包含聚集索引。

一般来说...

当您对其列进行大量 filter/ordering 操作时,聚簇索引非常适合选择。

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

聚簇索引对 inserts/updates 不利,当您更改聚簇索引列上的 value/insert 非顺序值时非常糟糕,因为引擎会尝试保留索引B-tree 平衡有序。

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

我建议您查找 MSDN and SQL Server Central 之类的网站并了解有关索引的更多信息,因为对于这个答案而言,它的主题太宽泛了。