我有一个包含账户交易的交易表。我想获取一个(少量)账户的最新交易。如果我只过滤 1 个帐户,数据库将使用高效的索引查找,但只要我要求超过 1 个帐户的最新交易,它就会尝试一次完成所有操作,效率会低得多。我可以重写查询或做一些更智能的索引吗?
桌子
CREATE TABLE [dbo].[Transaction](
[TransactionId] [UNIQUEIDENTIFIER] NOT NULL PRIMARY KEY,
[Created] [DATETIME] NOT NULL DEFAULT GETUTCDATE(),
[Timestamp] [DATETIME] NOT NULL,
[AccountId] int NOT NULL)
GO
CREATE NONCLUSTERED INDEX [IX_Transaction_AccountId_Timestamp] ON [dbo].[Transaction]([AccountId], [Timestamp] DESC) WITH (ONLINE = ON)
GO
和查询(简化)
SELECT TOP 1 *
FROM [dbo].[Transaction] T
WHERE T.AccountId in (5, 6)
ORDER BY
T.[Timestamp] DESC
给出这个计划 https://www.brentozar.com/pastetheplan/?id=BycxPIVvn
但是如果我只过滤一个 AccountId 就好多了
SELECT TOP 1 *
FROM [dbo].[Transaction] T
WHERE T.AccountId in (5)
ORDER BY
T.[Timestamp] DESC
给出这个计划:https://www.brentozar.com/pastetheplan/?id=rkOFvINv2
这个例子有点简化,在我的真实表中我有数千万行,这个查询是数据库中最重的查询之一。由于我知道要过滤的帐户数量总是很少(少于 10 个,通常是 1 个),有什么比 for 循环更聪明的方法可以使它更快吗?