2009-07-13 11 views
6

In T-SQL cos'è più veloce?Cosa c'è più veloce IN o OR?

DELETE * FROM ... WHERE A IN (x,y,z) 

Oppure

DELETE * FROM ... WHERE A = x OR A = y OR A = z 

Nel mio caso x, yez sono parametri di input per la procedura memorizzata. E sto cercando di ottenere le prestazioni delle mie istruzioni DELETE e INSERT al meglio delle mie capacità.

risposta

11

"IN" sarà tradotto in una serie di "OR" s ... se si guarda il piano di esecuzione per una query con "IN", vedrai che è stato espanso.

Molto più pulito da utilizzare "IN" a mio parere, soprattutto nelle query più grandi lo rende molto più leggibile.

+0

Thnx, nel piano di esecuzione ho visto che sarebbe costato esattamente la stessa quantità di tempo CPU. – Zyphrax

+0

Questo non è vero. In non è tradotto come un serise di ors. Faresti meglio a profilare la tua query e vedere effettivamente il risultato. Più spesso di ESISTE è più veloce di IN. Ma OR * dovrebbe * essere più veloce di entrambi. Dipende comunque dagli indici. –

+0

@Frank, stiamo parlando di IN con liste di valori, non di IN con sottoquery. –

0

Deve essere esattamente uguale. La maggior parte di RDMBS transalita IN a ORs.

Naturalmente, se si considera la traduzione INs-ORs ad essere elevato in termini di tempo, la frase con ORs è ;-)

aggiornamento più veloce: sto considerando che A è una colonna.

1

Se A è un calcolo, verrà eseguito una volta utilizzando IN e N volte utilizzando OR.

14

Non pensare; profilo.

Vi esorto a non fidarvi dell'intuito, del vostro o di chiunque altro, quando si considerano le questioni di velocità. Invece, prova entrambe le opzioni, con una sorta di misurazione del tempo di profilazione/esecuzione, e scopri che è più veloce nelle tue circostanze.

+1

+1 Grazie per il backup di ciò che sto cercando di dire da solo. :-) –

4

Scrivere due stored procedure, una utilizzando IN, l'altra utilizzando OR, su un server di prova. Esegui ogni procedura di 10.000 (o 1.000.000, o qualsiasi altra cosa) volte e confronta i tempi.

In generale, questo è praticamente il "solo" modo per avere una buona risposta alla domanda su quale approccio è più veloce: scrivere semplici casi di test di temporizzazione ed eseguirli molte, molte volte.

3

In SQL Server, l'ottimizzatore genera piani identici per queste query.

2

dovrebbero generare lo stesso piano esatto dalla mia esperienza

un'occhiata al piano

1

Indipendentemente dal fatto che A è un calcolo o una colonna, si presenta come SQL Server 2005 converte IN a clausole OR .

+0

Potrebbe anche convertirlo in join, nel caso in cui i contenuti del tuo IN siano il risultato di un'altra istruzione SELECT. –

1

Il più veloce in assoluto in SQL Server consiste nell'utilizzare un ELIMINARE con un INNER JOIN. Con tre valori non noterai la differenza, ma con più valori (ne stiamo facendo diverse migliaia) la differenza è fenomenale. Potresti mettere i tuoi valori in una tabella temporanea e unirti a quello.

E.g.

DELETE C 
FROM Customer AS C INNER JOIN #ValuesToDelete AS D ON C.CustID = D.CustID 

È inoltre possibile aggiungere una clausola where opzionale.

Problemi correlati