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

时间:2011-07-25 13:03:36

标签: sql-server performance indexing

我目前正在研究广泛使用的.NET CMS系统的性能问题,并且有一个特定的表,其中有大约5,000,000条记录,这是这些问题的根本原因,只是查询此表的内容需要在我当地的开发环境中停留2分钟。

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

表& index定义如下

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
)

是否有人对此表上的索引有任何建议以提高查询性能,具体而言,总是在表上定义聚簇索引是一种好习惯吗?

由于

3 个答案:

答案 0 :(得分:3)

我认为你不能说'总是'好或坏。

您是否有针对不执行的查询的解释计划?

如果该查询的where子句不使用索引列,则附加索引可能会有很大帮助。

答案 1 :(得分:1)

我同意Randy,因为它取决于桌子主要用于什么。 This是一篇关于“聚集索引辩论”的精彩文章。

总结这里有太多的总结,但总的来说INSERT总是使用聚集索引更快,UPDATE 通常更快,SELECT更多地取决于其他因素,如覆盖非聚集索引。

答案 2 :(得分:0)

聚簇索引对索引键上的表进行排序,并按顺序将其物理存储。 这就是为什么在任何表上只能定义1个聚簇索引的原因。建议在唯一值上使用ur聚集索引以获得最佳结果。

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

检查this msdn link以了解有关聚集索引的详细信息