Leggendo un altro thread mi è venuto questo dubbio: ho diverse procedure di caricamento di datawarehouse su tabelle molto "popolose", e ogni giorno devo trasferire qualche centinaio di migliaia di record.
Solitamente la procedura controlla se il record esiste (sulla chiave), e se esiste lo aggiorna, altrimenti lo inserisce.
La maggior parte delle procedure esistono da tempo e sono scritte in questo modo (ipotizzando che id sia la chiave della tabella), con un cursore che ripete queste operazioni record per record:
Update Table SET col=..., col2=..., col3=... WHERE id=@id
if @@rowcount = 0
INSERT INTO Table VALUES @col, @col2, @col3
Cercando qua e la per ottimizzare i tempi, ho trovato la stessa cosa fatta in modo diverso:
IF EXISTS (SELECT * FROM Table WHERE id=@id)
BEGIN
UPDATE Table SET col=....,col2....c,ol3=.... WHERE id=@id
END
ELSE
BEGIN
INSERT INTO Table (cols here) VALUES (here)
END
così a occhio non saprei dire quale è più performante, e prima di mettermi a fare test e stravolgere come sono scritte le procedure attuali, vorrei un vostro parere...
Avevo anche pensato di utilizzare SSIS per questo tipo di operazioni, visto che i cursori in T-SQL sono veramente lenti.
Però fare un aggiornamento di questo tipo (update o insert) con SSIS ho visto che è piuttosto elaborato.
(per esempio ho visto questo: http://consultingblogs.emc.com/jamiethomson/archive/2006/09/12/SSIS_3A00_-Checking-if-a-row-exists-and-if-it-does_2C00_-has-it-changed.aspx)
L'alternativa che avevo in mente è utilizzare i componenti lookup:
verifico se un record esiste nella tabella di destinazione; se c'è lo cancello.
faccio la insert di tutti i record (nuovi e "vecchi")
non mi piace molto nemmeno così...
si accettano suggerimenti!
grazie
--
Igor Brusetti
http://jenga.wordpress.com