È meglio una serie di OR o una singola istruzione IN IN SQL?

3

Uso MS SQL 2008 R2. Ho utilizzato una serie di OR e ho riscontrato un problema in cui la mia app inviava periodicamente il seguente errore:

Exception message: Timeout expired. The timeout period elapsed prior to obtaining
a connection from the pool. This may have occurred because all pooled connections
were in use and max pool size was reached. 

Le mie competenze SQL sono abbastanza semplici ma ho una situazione in cui ho bisogno di effettuare selezioni da un database. Originariamente le selezioni erano semplici (o un singolo filtro o selezionare tutto)

Select column_names... From Table Where column = value

o

Select column_names... From Table

Ora ho bisogno di selezionare dove la colonna potrebbe essere una di una serie di elementi. Quale sarebbe meglio usare

Select column_names... From Table Where column = value1 Or column = value2 Or column = ValueX...

o

Select column_names... From Table Where column In (value1, value2, valueX...) 
    
posta Mych 17.02.2015 - 10:44
fonte

1 risposta

6

SQL Server ottimizzerà in genere IN con le stesse istruzioni multiple OR . Prendi questo ad esempio:

use AdventureWorks;
go

select BusinessEntityID
from HumanResources.Employee
where BusinessEntityID = 153
or BusinessEntityID = 25
or BusinessEntityID = 37;

select BusinessEntityID
from HumanResources.Employee
where BusinessEntityID in (153, 25, 37);

Guardando il piano di esecuzione posso vedere che SQL Server li ha trattati come dichiarazioni simili e utilizzato la stessa esecuzione per entrambi:

Indefinitiva,però,devifarelostessoesercizioneltuoambienteconletuedomandeeituoidati(sehaipianidiversiperquestediversevarianti,sentitiliberodipostareipianidipost-pubblicazionenellatuadomandaeiopossoanalizzare).Ovviamente,cometuttiidatirelazionali,ènecessarioassicurarsididisporrediqueryeindicizzazionecorretteperottimizzareilrecuperodeidati.

L'altrolatodiquestoèlaleggibilità/manutenibilità.Laconsistenzaèilrequiperiteamdisviluppo,esesitrattadiunabasedicodicesolistaallorafaremoriferimentoallepreferenzepersonali.INèmoltomenodettagliatoconcaratterielasceltatipica.

Solounanota,però,sequestiassegnicondizionalisfuggonoalcontrollo(centinaiadicentinaiadielementinellaclausolaIN,l'hovistoprimatroppospesso)potrestidoverfareunpassoindietroaciòcheseidavverofacendoerefactoringlatualogica.

Iltuoerroreattualeèdovutoaunacausadiversasebbene...

Valelapenanotarecheiltuomessaggiodierroreeffettivoèuntimeoutdellaconnessione,nonuntimeoutdelcomando.Sembrachetuabbiaesauritotutteleconnessioniinpoolneltuopooldiconnessioniperl'applicazione.Daiun'occhiataa questo blog post che ho scritto sul pooling di connessioni . Questo dovrebbe spiegare perché ricevi questo errore e come risolverlo. È molto probabile che altre sessioni siano eseguite troppo a lungo, e non chiudendo o eliminando la connessione per restituirla al pool. Avresti sicuramente bisogno di adottare un approccio guidato nella risoluzione dei problemi di timeout della connessione a causa di un eccessivo pool di connessioni.

    
risposta data 17.02.2015 - 15:49
fonte

Leggi altre domande sui tag