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.