tsql - 基于时间窗口查找彼此附近记录的SARGable方法?

标签 tsql

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

有没有一种 SARGable 方法可以进一步缩小范围?
添加这个不起作用 - 非 SARGable:
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 上进行合并连接而不是哈希连接。唯一性约束通过消除多对多连接的可能性使合并连接更便宜。

this有关合并连接的更详细说明。

关于tsql - 基于时间窗口查找彼此附近记录的SARGable方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11851707/

相关文章:

将两个或多个表作为输出的 SQL JOIN - 最有效的方法?

sql-server - row_number() 分组依据?

sql - 将全名拆分为名字和姓氏

sql - 选择 XML 节点作为行

sql - Oracle列值修改

sql - sql中如何连接两个不相关的表

sql-server - SQL Server : Number of 8K Pages Used by a Table and/or Database

sql - 查找丢失和无序的记录

sql - 如何处理 DATEDIFF 比较中的 NULL?

sql - 是否可以向外键添加逻辑约束?