Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Perché questa sottoquery (non correlata) causa tali problemi?

In base alla mia esperienza, più complesse diventano le tue query, meno è in grado l'ottimizzatore SQL di creare piani abili. Qui hai 16 join, alcuni o la maggior parte sono outer join, hai almeno una sottoquery... inserisci abbastanza indici, cardinalità, viste, applicazioni esterne e chissà cos'altro e nessuno, nemmeno Microsoft gli ingegneri*, possono capire le routine che genereranno in modo uniforme e regolare i piani più ottimali.

Quello che hai descritto, l'ho sperimentato numerose volte:cambia una cosa semplice in una query disordinata e tutto è un ordine di grandezza più veloce (o, digrigna i denti, più lento). Non ho un metodo per determinare quando il complesso è troppo complesso, è più una sensazione che altro. La mia regola generale è che, se sembra troppo lungo o troppo complesso, semplifica dove puoi, come il valore nidificato singolo preselezionato o suddividere parte della query rispetto a sempre corri velocemente con un piccolo set di risultati, eseguilo prima e memorizzando i risultati in una tabella temporanea.

( * Si prega di notare che questo è sarcasmo lieve)