2010-12-11 19 views
5

Który z nich jest lepszy w SQL Server 2008 lub nie ma znaczenia, ponieważ baza danych jest optymalizowana.SQL max wiersza tabeli

SELECT * FROM table 
WHERE datecolumn = (SELECT max(datecolumn) FROM table); 


SELECT TOP 1 * FROM table ORDER BY datecolumn DESC; 
+3

Mogą one powodować różne wyniki. Górny przykład może zwrócić więcej niż jeden wiersz (w zasadzie każdy wiersz odpowiadający największej dacie). Zapytanie dolne zwraca tylko 1 wiersz (i nie robi nic o związaniu dat) – Sparky

Odpowiedz

9

Patrząc na aktualny plan wykonania SQL dla tych zapytań, uzyskuje się dokładnie taki sam plan wykonania i taki sam koszt wykonania. Jednak może się różnić w zależności od konfiguracji indeksu i zebranych statystyk, dlatego najlepiej jest samemu sprawdzić.

Należy pamiętać, że dwa zapytania mogą nie zwracać tego samego wyniku. Drugi SQL zawsze zwraca jeden rekord, w którym pierwszy rekord może zwrócić wiele wierszy, jeśli datecolumn nie jest unikalny.

0

Musisz spojrzeć na plan wykonania do odpowiedzi.

0

SELECT * FROM table WHERE datecolumn = (WYBIERZ max (datokolumna) Z tabeli);

SELECT TOP 1 * FROM table ORDER BY datecolumn DESC;

te zapytanie zwróci wynik różnicowy w koszcie. z planu wykonania serwera sql pierwsze zapytanie. Zapytanie podrzędne zostanie uruchomione jako pierwsze i zeskanuje krotki tabeli i uzyska maksymalną wartość datecolumn po tym, że zapytanie zewnętrzne zeskanuje tabelę i wyszuka w niej datcolumn = ..... w ten sposób nie jest to efektywność.

Druga kwerenda jest bardziej efektywna, ponieważ istnieje tylko jedna krotka skanowania tabeli.

Uwaga: jeśli datacolumn jest kolumną podstawową lub kolumną indeksu, nie jest istotna różnica obu zapytań. ale jeśli ta kolumna nie jest indeksem i kluczem podstawowym, to może znacząco różnić się kosztem: