SQL Server эффективно фильтрует строки, где время не совпадает со временем другой таблицы

У меня есть две таблицы, и я ищу строки в одной таблице, в которой столбец времени , а не рядом с любым из значений в столбце времени другой таблицы. («Ближайший» определяется как «в пределах минуты».)

Вот пример кода:

create table temp1
(
    id int identity primary key,
    value datetime not null 
)
GO

create index ix_temp1 on temp1(value, id);
GO

set nocount on
insert temp1 (value) values (DATEADD(second, rand() * 1000000, '20100101'))
GO 15000

таблица temp2 настроена идентично:

create table temp2
(
    id int identity primary key,
    value datetime not null 
)
GO

create index ix_temp2 on temp2(value, id);
GO

set nocount on
insert temp2 (value) values (DATEADD(second, rand() * 1000000, '20100101'))
GO 15000

И вот мой первый взлом (который очень неэффективен)

SELECT t1.id, t1.value
FROM temp1 t1
LEFT JOIN temp2 t2
    ON t1.value between DATEADD(MINUTE, -1, t2.value) and DATEADD(MINUTE, 1, t2.value)
WHERE t2.value is null

Я ищу способы сделать это более эффективно. Будут рассмотрены все решения (новые индексы, решение SSIS, решения CLR, временные таблицы, курсоры и т. Д.)

5
задан OMG Ponies 15 September 2010 в 20:05
поделиться