Dacă scriem un query de genul "SELECT c FROM t GROUP BY c" sau "SELECT DISTINCT c FROM t" nu înseamnă că vom obţine înregistrările respective ordonate după coloana c (deşi uneori se întâmplă asta). De exemplu, să considerăm următoarele query-uri în AdventureWorks:
SELECT Availability, COUNT(*) FROM Production.Location GROUP BY Availability
SELECT ProductID, COUNT(*) FROM Production.TransactionHistory GROUP BY ProductID
SELECT ReferenceOrderLineID, COUNT(*) FROM Production.TransactionHistory GROUP BY ReferenceOrderLineID
SELECT Quantity, COUNT(*) FROM Production.TransactionHistory GROUP BY Quantity
Rezultatele primele două query-uri apar sortate după coloana care e menţionată în GROUP BY, dar la celelalte două query-uri, rezultatele nu mai sunt sortate. Dacă nu specificăm clauza ORDER BY, atunci SQL-ul poate să returneze datele în orice ordine, având libertatea să aleagă query plan-ul care pare cel mai rapid. Acest lucru îl face în funcţie de indecşii disponibili, dar şi de volumul datelor din fiecare tabelă, precum şi de distribuţia valorilor din coloanele implicate.
Pe de altă parte, există o opinie greşită că dacă se face un SELECT fără ORDER BY, atunci rezultatele vor apare totdeauna în ordinea indexului clustered. Acest lucru se poate întâmpla în multe cazuri, dar nu totdeauna. De exemplu, să considerăm următorul query:
SELECT * FROM Production.TransactionHistory WHERE ReferenceOrderID=53457
Deşi indexul clustered din această tabelă este pe coloana TransactionID, rezultatele obţinute nu sunt ordonate după această coloană. În acest caz, rezultatele au fost ordonate după ReferenceOrderID+ReferenceOrderLineID, deoarece s-a folosit acest index non-clustered pentru a efectua filtrarea. Vezi şi următoarea discuţie pentru mai multe amănunte: http://www.developersdex.com/sql/message.asp?p=581&r=5875444
Concluzia: dacă în decursul testării obţineţi rezultatele ordonate aşa cum doriţi, chiar dacă nu aţi specificat clauza ORDER BY, pe măsură ce tabela va conţine mai multe date este posibil ca planul de execuţie să fie altul, iar rezultatele să nu mai apară în aceeaşi ordine. Deci dacă doriţi ca rezultatele să apară într-o anumită ordine, specificaţi clauza ORDER BY în query-urile respective.
Răzvan