我应该为此SELECT TOP 1 ... ORDER BY CreatedDate DESC查询添加什么SQL索引

时间:2015-03-31 00:18:07

标签: sql sql-server

我的项目有一种模式,即为每个用户提交的内容向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,BusinessIdModelId

我应该添加哪个索引来优化此查询?

2 个答案:

答案 0 :(得分:1)

您需要一个涵盖所有三列的索引 BusinessID,ModelID,CreatedDate

前两个快速找到您所追踪的记录(索引搜索),创建日期将使您的数据已经排序,因此在选择时不需要排序。

答案 1 :(得分:0)

我会根据FakeSubmissionId和BusinessId创建一个复合索引。