我的项目有一种模式,即为每个用户提交的内容向MS SQL Server中插入一个新行以保留历史数据。然后,我们为给定的几个参数选择最近的行。这是一个示例表:
CREATE TABLE dlr.[FakeSubmission] (
[FakeSubmissionId] BIGINT NOT NULL IDENTITY(1,1),
[BusinessId] BIGINT NOT NULL,
[ModelId] BIGINT NOT NULL,
[SomeData] VARCHAR(200) NOT NULL,
[Price] MONEY NULL,
[CreatedDate] DATETIME NOT NULL DEFAULT GETDATE(),
[CreatedUser] VARCHAR(50) NOT NULL,
CONSTRAINT [PK_FakeSubmission] PRIMARY KEY CLUSTERED ([FakeSubmissionId])
)
以下是一些示例数据:
FakeSubmissionId BusinessId ModelId SomeData Price CreatedDate CreatedUser
1 4001 20001 data 100.00 2015-03-30 16:17:37.920 bob
2 4001 20002 data 100.00 2015-03-30 16:18:01.597 bob
3 4001 20003 data 100.00 2015-03-30 16:18:09.040 bob
4 4001 20004 data 100.00 2015-03-30 16:18:14.533 bob
5 4002 20001 data 200.00 2015-03-30 16:18:35.523 martin
6 4002 20002 data 200.00 2015-03-30 16:18:40.597 martin
7 4002 20003 data 200.00 2015-03-30 16:18:45.257 martin
8 4001 20002 data 200.00 2015-03-30 16:20:36.843 wally
9 4001 20003 data 200.00 2015-03-30 17:01:41.907 wally
以下是一个示例查询:
SELECT TOP 1 *
FROM
dlr.[FakeSubmission]
WHERE
BusinessId = 4001 AND ModelId = 20002
ORDER BY
CreatedDate desc
返回:
FakeSubmissionId BusinessId ModelId SomeData Price CreatedDate CreatedUser
8 4001 20002 data 200.00 2015-03-30 16:20:36.843 wally
我们通过选择TOP 1
排序的CreatedDate
行来查询,并提供2个ID,BusinessId
和ModelId
。
我应该添加哪个索引来优化此查询?
答案 0 :(得分:1)
您需要一个涵盖所有三列的索引 BusinessID,ModelID,CreatedDate
前两个快速找到您所追踪的记录(索引搜索),创建日期将使您的数据已经排序,因此在选择时不需要排序。
答案 1 :(得分:0)
我会根据FakeSubmissionId和BusinessId创建一个复合索引。