在数据库表上始终定义聚集索引是一个好主意吗?

4

我目前正在研究一个广泛使用的.NET CMS系统的性能问题,其中有一张表格大约有500万条记录,这是问题的根源。在我的本地开发环境中,仅查询此表格的内容就需要2分钟。

查看表格的模式,我注意到只有一个唯一的非聚集索引和没有聚集索引。

表格和索引定义如下:

CREATE TABLE [dbo].[MyTable](
    [Id] [uniqueidentifier] NOT NULL,
    [ItemId] [uniqueidentifier] NOT NULL,
    [Language] [nvarchar](50) NOT NULL,
    [FieldId] [uniqueidentifier] NOT NULL,
    [Value] [nvarchar](max) NOT NULL,
    [Created] [datetime] NOT NULL,
    [Updated] [datetime] NOT NULL
)


CREATE UNIQUE NONCLUSTERED INDEX [IX_Unique] ON [dbo].[MyTable] 
(
    [ItemId] ASC,
    [Language] ASC,
    [FieldId] ASC
)

这个表上的索引有什么建议可以提高查询性能?特别是,通常在一个表上定义聚集索引是否是一个好的实践?

谢谢。


为了建议哪些索引会有帮助,我们需要知道您如何访问表格。您执行的查询是什么? - hatchet - done with SOverflow
对于任何“普通”的数据表 - 是的,我总是建议使用好的聚集索引(在一个窄、稳定、唯一且最好是递增的列上)。这可能不适用于临时表、用于批量插入等的表 - 但其他任何东西都会受益于一个好的聚集索引。 - marc_s
3个回答

3

我不认为您可以总是说“好”或“坏”。

您是否有一个解释计划用于执行不佳的查询?

如果该查询的where子句未使用索引列,则额外的索引可能会极大地帮助。


1

我同意Randy的观点,这取决于表格主要用途是什么。这篇关于“聚集索引争论”的文章很棒。

这里有太多需要总结的内容了,但一般来说,使用聚集索引时INSERT速度更快,UPDATE通常更快,而SELECT则更依赖于其他因素,如具有覆盖非聚集索引。


0

聚集索引针对索引键对表进行排序并按照其顺序物理存储。

因此,任何表格上只能定义一个聚集索引。最好将您的聚集索引放在唯一值上以获得最佳结果。

如果有多种查询访问您的表(使用不在聚集索引中的列),则最好在这些查询中使用这些列过滤的更多非聚集索引。

有关聚集索引的详细信息,请查看this msdn link


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接