Ultimamente sto facendo del mio meglio per cercare il modo migliore per eseguire determinate query in SQL che potrebbero potenzialmente essere eseguite in diversi modi. Tra le mie ricerche mi sono imbattuto in un bel po 'di odio per il concetto WHERE IN, a causa di una intrinseca inefficienza nel modo in cui funziona.SQL UPDATE WHERE IN (List) o UPDATE individualmente?
esempio: WHERE Col IN (val1, val2, val3)
Nel mio progetto attuale, sto facendo un aggiornamento su un grande insieme di dati e mi chiedo quale dei seguenti è più efficiente: (o se esiste una scelta migliore)
UPDATE table1 SET somecolumn = 'someVal' WHERE ID IN (id1, id2, id3 ....);
In quanto sopra, l'elenco di ID può contenere fino a 1.5k ID.
VS
Looping attraverso tutte ID di nel codice, e l'esecuzione del seguente dichiarazione per ciascuna:
UPDATE table1 SET somecolumn = 'someVal' WHERE ID = 'theID';
Per me, sembra più logico che il primo avrebbe funzionato meglio/più veloce, perché c'è meno query da eseguire. Detto questo, non conosco al 100% gli input e gli errori di SQL e il funzionamento dell'accodamento delle query.
Sono anche incerto su quale sarebbe più amichevole sul DB per quanto riguarda i blocchi del tavolo e altre prestazioni generali.
Informazioni generali nel caso in cui sia utile, sto utilizzando Microsoft SQL Server 2014 e il linguaggio di sviluppo primario è C#.
Qualsiasi aiuto è molto apprezzato.
EDIT:
Opzione 3:
UPDATE table1 SET somecolumn = 'someVal' WHERE ID IN (SELECT ID FROM @definedTable);
In quanto sopra, @definedTable è uno SQL 'User Defined Table Type', dove i dati all'interno passa attraverso ad una stored procedure come (in C#) tipo SqlDbType.Structured
le persone si chiedono come mai nella del ID: ID sono in un List<string>
nel codice, e sono utilizzati per altre cose nel codice prima di allora di essere inviato a una stored procedure. Attualmente, gli ID stanno entrando nella stored procedure come un "Tipo di tabella definito dall'utente" con una sola colonna (ID).
Li ho pensato avendo in una tabella potrebbe essere migliore di avere il codice di concatenare una stringa massiccia e solo sputare in SP come una variabile che assomiglia id1, id2, id3, id4
ecc
Hai provato a guardare il piano di esecuzione se qual è più veloce delle due query? – Japongskie
Da dove provengono id1, id2, id3? Nella maggior parte dei casi pratici provengono da un altro tavolo, a seguito del filtraggio in alcune condizioni. In questo caso faresti meglio ad unirti a quel tavolo, per ottenere prestazioni decenti. –
Come passate questi ID a SQL? Hai un elenco di valori nel tuo codice C# o li ottieni come risultato di un'altra query SQL? – DavidG