![](/img/trans.png)
[英]Composite clustered PK behavior vs Nonclustered PK + nonunique clustered index
[英]Clustered vs Nonclustered for a Reference table
我有一个简单的产品表,可以跟踪产品数据。 大多数时候,我不需要知道产品的类型,但是每隔一段时间我就需要产品类型。 现在,由于并非所有产品甚至都具有类型(导致很多NULL行),因此当我需要该信息时,我会使用引用表来连接产品类型。 引用表使用了复合键,而我想弄清楚的是主键应该是群集索引还是非群集索引。 产品表的主键有一个聚集索引,所以我想知道如果连接也是一个聚集索引,连接是否会更有效(以便ID的顺序正确)。 还是在联接过程中将其忽略,由于不进行键查找,因此非集群将更加有效?
CREATE TABLE [dbo].[sales_product_type]
(
[FK_product_id] [int] NOT NULL,
[product_type] [int] NOT NULL,
[type_description] [nvarchar](max) NULL,
CONSTRAINT [PK_sales_product_type]
PRIMARY KEY CLUSTERED ([FK_product_id] ASC, [product_type]
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[sales_product]
(
[product_id] [int] IDENTITY(1,1) NOT NULL,
[FK_store_id] [int] NOT NULL,
[price] [int] NOT NULL,
[product_name] [nvarchar](max) NOT NULL,
[units] [int] NULL,
CONSTRAINT [PK_sales_product]
PRIMARY KEY CLUSTERED ([product_id] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO
如果在查询产品类型时需要[type_description]
列,则应使用聚集索引。 原因是聚集索引将具有表的所有列(包括关键列“产品ID”和“产品类型”)。
另一方面,如果您在“产品ID”和“产品类型”上只有一个非聚集索引,则当您的查询需要获取type_description
,它将必须对结果数据集中的每种类型进行堆查找。
因此,如果结果中需要type_description
, 则应保留一个聚集索引。
但是,在您的特定情况下, type_description
是否大于8000个字符并不重要。 如此处 (和此处 )所讨论,如果列的值超过8000个字符,则将在行外存储。 因此,无论如何,引擎都必须执行查找以获取该值。
如果您不经常查询type_description
,则使用非聚集索引可能会导致读取次数低得多-因为引擎不必type_description
字段。 但是我会在决定一种方法之前先测试这两种方法。
通常,我总是在表上有聚集索引。 如果需要,我可以添加非聚集索引来调优特定查询。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.