Domanda

Come posso ottenere una query che utilizza un OR nella clausola WHERE per dividersi in due query con un UNION durante la compilazione? Se riscrivo manualmente, la query utilizzando l'UNION è 100 volte più veloce rispetto alla singola query, perché può utilizzare in modo efficace gli indici differenti in ogni query del sindacato. C'è un modo posso fare l'ottimizzatore utilizzare questo approccio?

Ho una domanda che sembra qualcosa di simile:

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3
where conditions1 
    and ((@param1 is null and cond3a) or (cond3b))

Dove columnlist, joincond2, joincond3, e conditions1 sono tutte espressioni più lunghe. Il calciatore è che solo una delle condizioni in sala operatoria è sempre vero.

ho pensato che avrei potuto solo riscriverlo per fare l'unione, ma poi mi sto ripetendo columnlist, joincond2, joincond3, e conditions1, che è di 20 o giù di lì le linee di SQL che potrebbero aver bisogno di un sacco di manutenzione in futuro. C'è un suggerimento che posso fornire o qualche modo migliore per scrivere la clausola WHERE? Grazie in anticipo.

È stato utile?

Soluzione

È possibile raggruppare

select columnlist
from table1
join table2 on joincond2
join table3 on joincond3

in una visione, e quindi utilizzare l'unione.

, ma se è possibile migrare a sql2005 / 8, è possibile utilizzare un'espressione di tabella comune.

with cte ( columnlist )
as (
    select columnlist
    from table1
    join table2 on joincond2
    join table3 on joincond3 )
select columnlist from cte where ...
union
select columnlist from cte where ...

Altri suggerimenti

Prova ad aggiungere OPTION (RECOMPILE) per la query. Se è in una stored procedure quindi aggiungere WITH RECOMPILE a quella pure. Può essere che la prima volta che si esegue la query SQL Server viene fornito con un piano e memorizza nella cache, ma poi la seconda volta attraverso è ancora usando il vecchio (e ora scarso) piano di query.

Si prende un piccolo successo perché sarà necessario ricompilare ogni volta che si utilizza la query, ma sarà minuscola rispetto all'uso di un povero programma.

EDIT: Ho letto che utilizzando WITH RECOMPILE in una stored procedure in SQL 2000 non sempre funziona correttamente. Il bug è stato presumibilmente risolto in SQL 2005. Non ho mai incontrato di persona il bug, però, quindi non so che cosa esattamente affare è con esso. Fare un tentativo però.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top