Welcome to Sign in | Help

Re: select distinct...order by?

  •  08-10-2007, 12:19 PM

    Re: select distinct...order by?

    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

View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems