我的项目有一种模式,每次用户提交时都会在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
在给定两个ID BusinessId
和ModelId
的情况下,我们通过选择按CreatedDate
排序的TOP 1
行进行查询。
我应该添加什么索引来优化此查询?
您需要一个覆盖所有三列的索引BusinessID、ModelID、CreatedDate
前两个是快速定位您要查找的记录(索引查找),创建的日期将对您的数据进行排序,因此在选择时不需要进行排序。
我会基于FakeSubmissionId和BusinessId创建一个复合索引。