当ORDER BY是ASC而不是DESC时,我正在努力解决一个快速运行的查询。
伪代码:
TABLE Logs (
Id UNIQUEIDENTIFIER,
Time DateTime,
AccountId UNIQUEIDENTIFIER,
Deleted BIT,
/* Other columns */
)
因为这是一个多租户系统,所以插入的日志大部分时间都是时间上升,而大多数时候查询时间都在下降,我也有:
CLUSTER INDEX
FOR TABLE Logs
(Deleted ASC, AccountId ASC, Time ASC)
问题现在出现以下问题:
SELECT TOP 100 *
FROM Logs
WHERE Deleted = 0
AND AccountId = 'id-of-an-account'
ORDER BY Time DESC
该查询很慢(17秒),但如果我更改为ORDER BY Time ASC
,则会以< 1seg运行。
我一直在阅读我想我可以在CLUSTER INDEX
上将DESC
更改为Time
。但是,based on this answer,可能会造成很多碎片。我还可以创建另一个非聚集索引,但这会影响插入性能。
运行SQL Server 2008 R2。任何的想法?感谢。
更新
由于我提到的内容与INNER JOIN的组合,查询实际上很慢,实际查询是这样的:
SELECT TOP 100 *
FROM Logs l
INNER JOIN Other o
ON o.Id = l.Id
WHERE Deleted = 0
AND AccountId = 'id-of-an-account'
ORDER BY Time DESC
我认为INNER JOIN不允许查询使用索引。