我目前正在研究广泛使用的.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
)
是否有人对此表上的索引有任何建议以提高查询性能,具体而言,总是在表上定义聚簇索引是一种好习惯吗?
由于
答案 0 :(得分:3)
我认为你不能说'总是'好或坏。
您是否有针对不执行的查询的解释计划?
如果该查询的where子句不使用索引列,则附加索引可能会有很大帮助。
答案 1 :(得分:1)
我同意Randy,因为它取决于桌子主要用于什么。 This是一篇关于“聚集索引辩论”的精彩文章。
总结这里有太多的总结,但总的来说INSERT
总是使用聚集索引更快,UPDATE
通常更快,SELECT
更多地取决于其他因素,如覆盖非聚集索引。
答案 2 :(得分:0)
聚簇索引对索引键上的表进行排序,并按顺序将其物理存储。 这就是为什么在任何表上只能定义1个聚簇索引的原因。建议在唯一值上使用ur聚集索引以获得最佳结果。
如果有多种查询访问您的表(使用不在聚簇索引中的列),那么在这些查询过滤的那些列上有更多非聚集索引会更好。
检查this msdn link以了解有关聚集索引的详细信息