Nella mia esperienza, query più ampie danno a SQL Server maggiori possibilità di sbagliare. L'utilizzo di query più piccole può aiutare SQL Server a utilizzare un buon piano di query. Ad esempio, nel proprio ambiente di sviluppo, SQL Server potrebbe eseguire una query enorme esattamente nell'ordine in cui è stata scritta. Successivamente, quando il codice passa alla produzione, improvvisamente i dati sono molto diversi. SQL Server potrebbe assumere un'ipotesi errata e scegliere di avviare la query nel mezzo, e all'improvviso si finirà con unioni pazzesche che creano un miliardo di record temporanei da spoolare in tempdb.
Le prestazioni di query complicate contro enormi database variano. A volte, avere una query complicata funziona meglio, perché elabora i dati solo una volta. A volte, separare i passaggi è più veloce e più leggibile, perché è possibile garantire che i risultati della prima query limitino i dati a un piccolo insieme di righe prima di eseguire il resto dei passaggi.
Cerco di utilizzare query separate per passaggi logici separati. Documenterò ogni passaggio con i commenti in modo da poter ricordare più facilmente ciò che stava cercando di realizzare. Ad esempio:
- Fai qualche pre-elaborazione per capire cosa vuole l'utente
- Raccogli i dati, filtrando alla selezione dell'utente
- Inserisci dati basati sulla data da una tabella dei prezzi
- Rilascia alcuni record che non sono rilevanti a causa di alcune rare condizioni
- Compila alcuni campi a fini di reporting
- Restituisce i risultati
Se ti unisci a più livelli di sottoquery, come nell'esempio di Bill, suddividere le subquery in passaggi separati può migliorare le prestazioni.
Nota inoltre che il tuo piano potrebbe sostenere più I / O mentre crei, popoli, indicizzi e selezioni da tabelle temporanee.
E infine, se non è rotto-- non aggiustarlo!