【发布时间】:2020-04-06 09:38:09
【问题描述】:
我正在尝试在每天接收数百万条记录的表上编写查询。我可以将查询缩小到一个时间片 (logdate),但我需要其中的其他列数据 (num)。这是我用来测试它的示例查询:
DECLARE @StartTimeStamp DATETIME = '12/6/2019 7:56:50.799'
DECLARE @EndTimeStamp DATETIME = '12/6/2019 7:56:50.8'
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SELECT tx.num, tx.logdate
FROM hsi.transactionxlog tx
WHERE tx.logdate BETWEEN @StartTimeStamp AND @EndTimeStamp
此特定测试的时间跨度为 0.001 秒,运行时间超过四分钟。如果我将其更改为在指定时间范围内未找到任何记录的时间范围,则运行它几乎可能需要一秒钟,甚至指定 24 小时的跨度。
这个表只有非聚集索引。一个这样的索引包含以下列:(num、logdate 和 action,按此顺序)。
如何快速找到@StartTimeStamp 和@EndTimeStamp 之间每条记录对应的num?我强烈不想在这个表上创建额外的索引,因为许多其他应用程序经常使用它。
【问题讨论】:
-
这是一个非常直接的查询,如果您在索引中添加 lodate 可以加快速度。您是按毫秒还是按日期查询?我问的原因是您是否可以考虑使用 = Date_field 而不是 between 。你也检查过解释计划和调优顾问是怎么说的吗?
-
该表上有两个具有 logdate 的索引,一个是
logdate、action和usernum,另一个是上面发布的。我确实打算通常一次查询大约五分钟,很抱歉,但我不能使用 =。我将它隔离到可能的最小时间范围,以尝试找出我可以使用的最大时间范围。我对解释计划或调优顾问一无所知,但如果我对数据库有权限,我会调查这些。
标签: sql query-optimization non-clustered-index