Tsql 如何根据时间窗口查找彼此相邻的记录?

Tsql 如何根据时间窗口查找彼此相邻的记录?,tsql,Tsql,我们将事件插入到表中—开始事件和结束事件。相关事件具有相同的内部id号,并插入到90秒的窗口中。我们经常在表上进行自联接: create table mytable (id bigint identity, internal_id bigint, internal_date datetime, event_number int, field_a varchar(50)) select * from mytable a inner join mytable b on a.internal_id

我们将事件插入到表中—开始事件和结束事件。相关事件具有相同的内部id号,并插入到90秒的窗口中。我们经常在表上进行自联接:

create table mytable (id bigint identity, internal_id bigint, 
internal_date datetime, event_number int, field_a varchar(50))

select * from mytable a inner join mytable b on a.internal_id = b.internal_id
and a.event_number = 1 and b.event_number = 2
然而,我们每天可以有数百万个相关事件。我们的集群密钥是内部_日期,因此我们可以向下过滤到分区级别,但性能仍然可以是一般的:

and a.internal_date >='20120807' and a.internal_date < '20120808'
and b.internal_date >='20120807' and b.internal_date < '20120808'
和a.internal\u date>='20120807'和a.internal\u date<'20120808'
和b.内部审计日期>='20120807'和b.内部审计日期<'20120808'
有没有办法进一步缩小范围? 添加此项无效-不可搜索:

and a.internal_date <= b.internal_date +.001 --about 90 seconds
and a.internal_date > b.internal_date - .001 --make sure they're within the window
和a.internal_date b.internal_date-.001——确保它们在窗口内
这不是一个点查询,所以做一次性没有帮助-我们正在搜索数千条记录,需要从开始事件和结束事件的事件详细信息


谢谢

使用此索引,您的查询将更加便宜:

CREATE UNIQUE INDEX idx_iid on mytable(event_number, internal_id)
INCLUDE (id, internal_date, field_a);
该索引允许您在
事件编号
上搜索,而不是执行聚集索引扫描,还允许您在
内部id
上执行合并联接,而不是哈希联接。唯一性约束通过消除多对多连接的可能性使合并连接更加便宜


有关合并联接的更详细说明,请参阅。

您可以尝试在内部联接日期上添加+-90秒。这太聪明了,我没有想到。看起来很奇怪,我不能让优化器萨加布里实现它。那将是我的后备计划。谢谢我来看看这个。不过,顺便说一句,事件编号不够具体(在我的示例中,是1或2,所以有50%的选择性)。我可以(而且我认为是这样)在
(内部id,内部日期(-),事件编号)
上有一个索引,它没有被拾取(如果我拾取,它会变慢)。这是因为书签查找使用随机io而不是顺序io。所以,如果无论如何都要检索50%的行,最好是按顺序扫描索引。