Ho questo codice che funziona perfettamente:
--********************
use tempdb
go
create table UNO (campo1 datetime, campo2 smallint)
go
create table DUE (campo3 datetime, campo4 smallint, campo5 datetime, delta smallint)
go
insert into UNO (campo1,campo2) values ('7-07-19 01:08:03.902',1)
insert into UNO (campo1,campo2) values ('7-07-19 01:08:05.903',0)
insert into UNO (campo1,campo2) values ('7-07-19 01:08:07.905',0)
insert into UNO (campo1,campo2) values ('7-07-19 01:08:09.912',1)
insert into UNO (campo1,campo2) values ('7-07-19 01:08:11.915',0)
insert into UNO (campo1,campo2) values ('7-07-19 01:08:16.915',0)
insert into UNO (campo1,campo2) values ('7-07-19 01:08:22.915',1)
insert into UNO (campo1,campo2) values ('7-07-19 01:08:24.915',1)
insert into UNO (campo1,campo2) values ('7-07-19 01:08:33.915',0)
insert into UNO (campo1,campo2) values ('7-07-19 01:09:18.915',1)
insert into UNO (campo1,campo2) values ('7-07-19 01:12:22.900',0)
insert into UNO (campo1,campo2) values ('7-07-19 01:14:25.903',1)
insert into UNO (campo1,campo2) values ('7-07-19 01:16:01.915',1)
go
insert into DUE (campo3) values ('7-07-19 01:08:11.902')
insert into DUE (campo3) values ('7-07-19 01:08:04.903')
insert into DUE (campo3) values ('7-07-19 01:08:07.903')
insert into DUE (campo3) values ('7-07-19 01:08:32.963')
insert into DUE (campo3) values ('7-07-19 01:08:10.903')
insert into DUE (campo3) values ('7-07-19 01:08:14.903')
insert into DUE (campo3) values ('7-07-19 01:08:28.903')
insert into DUE (campo3) values ('7-07-19 01:08:32.903')
insert into DUE (campo3) values ('7-07-19 01:08:48.903')
insert into DUE (campo3) values ('7-07-19 01:09:14.915')
insert into DUE (campo3) values ('7-07-19 01:12:25.900')
insert into DUE (campo3) values ('7-07-19 01:14:26.903')
insert into DUE (campo3) values ('7-07-19 01:16:00.915')
go
select * from UNO order by Campo1
go
-- dichiaro variabili intervallo di tempo sulla JIMP
DECLARE @down AS datetime
SET @down = '7-07-19 01:08:07.912'
DECLARE @up AS datetime
SET @up = '7-07-19 01:09:25.912'
update DUE
set Campo4=v.Campo2, Campo5=v.Campo1
from DUE t1
cross apply (
select top 1 Campo1,Campo2 from UNO t2
where abs(datediff(second, t2.Campo1, t1.Campo3)) <2 and t2.Campo1>=@down and t2.Campo1<@up
order by abs(datediff(second, t2.Campo1, t1.Campo3))
) v
go
update DUE set delta=abs(datediff(second,campo5,campo3))
go
select * from DUE order by DUE.Campo3
go
drop table UNO
go
drop table DUE
--********************
Le tabelle sono molto grandi, circa 8 milioni di records ciascuna e lanciando la sincronizzazione su tutto non ho ottenuto risultati dopo 4 ore di elaborazione. Inserendo delle condizioni di where (nell'apply) ottengo risultati corretti ma con tempi di circa un record al secondo (30 minuti di dati vengono sincronizzati con questa query in circa 30 minuti!)
A qualcuno viene in mente una soluzione che ottimizzi le prestazioni del DB diminuendo "drasticamente" i tempi di lavoro?
Grazie di qualsiasi aiuto
mir