根据时间窗口查找彼此附近的记录的 SARG 方法



我们将事件插入到表中 - 开始事件和结束事件。 相关事件具有相同的internal_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

但是,我们每天可以有数百万个链接事件。我们的集群键是internal_date,因此我们可以向下筛选到分区级别,但性能仍然可以平庸:

and a.internal_date >='20120807' and a.internal_date < '20120808'
and b.internal_date >='20120807' and b.internal_date < '20120808'

有没有一种可SARG的方法可以进一步缩小范围?添加这个不起作用 - 不可 SARG:

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

这不是针对点查询的,因此执行一次性查询无济于事 - 我们正在搜索数千条记录,并且需要从开始事件和结束事件开始的事件详细信息。

谢谢!

有了这个索引,你的查询会便宜得多:

CREATE UNIQUE INDEX idx_iid on mytable(event_number, internal_id)
INCLUDE (id, internal_date, field_a);

索引允许您在event_number上查找,而不是执行聚集索引扫描,并允许您对internal_id执行合并联接而不是哈希联接。唯一性约束通过消除多对多连接的可能性,使合并联接更加便宜。

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

最新更新