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

Sql server 总是在数据库表上定义聚集索引是一个好主意吗?,sql-server,performance,indexing,Sql Server,Performance,Indexing,我目前正在研究一个广泛使用的.NET CMS系统的性能问题,其中有一个特定的表,其中包含大约5000000条记录,这是这些问题的根本原因,在我的本地开发环境中,仅查询该表的内容就需要2分钟 查看表的模式,我注意到只有一个唯一的非聚集索引,没有聚集索引 表和索引的定义如下 CREATE TABLE [dbo].[MyTable]( [Id] [uniqueidentifier] NOT NULL, [ItemId] [uniqueidentifier] NOT NULL,

我目前正在研究一个广泛使用的.NET CMS系统的性能问题,其中有一个特定的表,其中包含大约5000000条记录,这是这些问题的根本原因,在我的本地开发环境中,仅查询该表的内容就需要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
)
是否有人对此表上的索引有任何建议,以提高查询性能,特别是始终在表上定义聚集索引是否通常是一种良好的做法


谢谢

我认为你不能说“永远”是好是坏

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


如果该查询的where子句不使用索引列,那么额外的索引可能会大有帮助。

我同意Randy的观点,因为它取决于表的主要用途。是一篇关于“聚集索引辩论”的伟大文章


这里有太多的东西要总结,但一般来说,使用聚集索引时,
INSERT
总是更快,
UPDATE
通常更快,
SELECT
更依赖于其他因素,比如覆盖非聚集索引。

聚集索引根据索引键对表进行排序,并按该顺序进行物理存储。 这就是为什么在任何表上只能定义1个聚集索引。建议将您的聚集索引设置为唯一值,以获得最佳结果

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


查看聚集索引的详细信息

为了建议哪些索引会有所帮助,我们需要知道您是如何访问该表的。您对它执行的查询是什么?对于任何“正常”数据表-是的,我总是建议使用良好的聚集索引(在狭窄、稳定、唯一且最好是不断增加的列上)。这可能不适用于临时表、用于大容量插入等的表,但其他任何东西都可以从良好的聚集索引中获益,是的