【发布时间】:2013-11-10 08:33:45
【问题描述】:
我有一个包含 2 列的多对多链接表 CategoryProduct,其中将包含数百万条记录:
CREATE TABLE [dbo].[CategoryProduct](
[Category_ID] [int] NOT NULL,
[Product_ID] [int] NOT NULL,
CONSTRAINT [PK_dbo.CategoryProduct] PRIMARY KEY CLUSTERED
(
[Category_ID] ASC,
[Product_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
基于聚集索引,我希望看到物理记录存储在以下结构中:
CategoryID ProductID
1 2
1 3
2 1
2 3
但是,使用 Select 的结果是
CategoryID ProductID
2 1
1 2
1 3
2 3
为什么数据存储在 ProductID 组中?这是否反映了数据的实际顺序?如何将数据保存在 CategoryID 组中,以便在命中匹配的 CategoryID 时通过连续读取来优化如下查询。
select ProductID from CategoryProduct where CategoryID = value
【问题讨论】:
-
为什么不按类别 id 排序?
-
@DoobyInc 我更新了我的问题。
-
您只想按类别 ID 或其他方式订购?如果您只想按类别 ID 排序,那么为什么不在 SQL 中的 select 语句末尾使用 order by Keyword 呢?
-
@DoobyInc 我需要将记录按类别顺序分组在一起,这样可以提高问题中查询的性能。
-
请编写包含聚集索引定义的
CREATE TABLE并将其添加到您的问题中。同时显示你得到的select ProductID from CategoryProduct where CategoryID = value的执行计划
标签: sql-server performance indexing clustered-index