我们将事件插入到表中 - 开始事件和结束事件.相关事件具有相同的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
Run Code Online (Sandbox Code Playgroud)
但是,我们每天可以有数百万个相关事件.我们的聚簇键是internal_date,因此我们可以过滤到分区级别,但性能仍然可能是平庸的:
and a.internal_date >='20120807' and a.internal_date < '20120808'
and b.internal_date >='20120807' and b.internal_date < '20120808'
Run Code Online (Sandbox Code Playgroud)
有没有一种SARG方法可以进一步缩小范围?添加它不起作用 - 非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
Run Code Online (Sandbox Code Playgroud)
这不适用于点查询,因此执行一次性操作无济于事 - 我们正在搜索数千条记录,并需要来自开始事件和结束事件的事件详细信息.
谢谢!
有了这个索引,你的查询就会便宜得多:
CREATE UNIQUE INDEX idx_iid on mytable(event_number, internal_id)
INCLUDE (id, internal_date, field_a);
Run Code Online (Sandbox Code Playgroud)
该索引可让您查找event_number
而不是进行聚集索引扫描,并且允许您进行合并联接internal_id
而不是散列联接。唯一性约束消除了多对多连接的可能性,从而使合并连接变得更加便宜。
有关合并连接的更详细说明,请参阅此内容。
归档时间: |
|
查看次数: |
131 次 |
最近记录: |