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



我的项目有一种模式,每次用户提交时都会在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 BusinessIdModelId的情况下,我们通过选择按CreatedDate排序的TOP 1行进行查询。

我应该添加什么索引来优化此查询?

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

前两个是快速定位您要查找的记录(索引查找),创建的日期将对您的数据进行排序,因此在选择时不需要进行排序。

我会基于FakeSubmissionId和BusinessId创建一个复合索引。

最新更新