Provare a rimuovere tutti i ALL
s, ad esempio. O anche solo uno di loro. Considerate ora che il tipo di ottimizzazione che deve verificarsi lì (e molti altri tipi) sarà anche possibile quando le query SELECT
sono query effettive rispetto alle tabelle e sono ottimizzate separatamente. Senza uno ORDER BY
, l'ordine all'interno di ogni query sarà arbitrario e non è possibile garantire che le query stesse verranno elaborate in qualsiasi ordine.
Dire UNION ALL
con il numero ORDER BY
è come dire "Basta lanciare tutte le biglie sul pavimento". Forse ogni volta che lanci tutte le biglie sul pavimento, finiscono per essere organizzate per colore. Ciò non significa che la prossima volta che li getti sul pavimento si comporteranno allo stesso modo. Lo stesso vale per gli ordini in SQL Server - se non si dice ORDER BY
allora SQL Server presume che non si preoccupi per l'ordine. È possibile visualizzare per coincidenza un determinato ordine che viene sempre restituito, ma molte cose possono influenzare l'ordine arbitrario selezionato successivo allo. Cambiamenti di dati, modifiche delle statistiche, ricompilazione, plan flush, upgrade, service pack, hotfix, flag di traccia ... fino alla nausea.
farò mettere questo a grandi lettere per mettere in chiaro:
Non si può garantire un ordine senza ORDER BY
Qualche ulteriore lettura:
http://sqlblog.com/blogs/aaron_bertrand/archive/2010/02/08/bad-habits-to-kick-relying-on-undocumented-behavior.aspx
Inoltre, please read this post by Conor Cunningham, a pretty smart guy on the SQL team.
fonte
2013-04-02 14:28:18
Perché qualcuno dovrebbe offrire una garanzia di ordinazione tranne quando è inclusa una clausola 'ORDER BY'? - Esiste un'opportunità ovvia per il parallelismo (se sono disponibili risorse sufficienti) per calcolare ogni set di risultati in parallelo e servire ogni riga del risultato (dalle query parallele) al client in qualsiasi ordine che ogni singola riga di risultati diventa disponibile. –
@Damien_The_Unbeliever e ognuno può essere ottimizzato per ordinare in modo diverso a causa di altri fattori non ovvi nella query stessa. –
@Damien_The_Unbeliever. . . Infatti, MySQL garantisce l'ordine dopo un 'group by' (" Se usi GROUP BY, le righe di output sono ordinate in base alle colonne GROUP BY come se avessi un ORDER BY per le stesse colonne. "A http: // dev.mysql.com/doc/refman/5.5/en/select.html). Considero questo un grosso limite alla capacità di MySQL di ottimizzare le espressioni di aggregazione. Non supporta nemmeno le aggregazioni di hash. –