To znane pytanie, ale najlepszym rozwiązaniem, jakie znalazłem, jest coś takiego:
SELECT TOP N *
FROM MyTable
ORDER BY Id DESC
Mam tabelę z wieloma rzędami. Nie można użyć tego zapytania, ponieważ zajmuje dużo czasu. Jak więc mogę wybrać ostatnie N wierszy bez użycia ORDER BY?
EDYTOWAĆ
Przepraszamy, powtórzone pytanie tego
id
jest indeksowany, po prostu przeskanuje ten indeks w odwrotnej kolejności i zatrzyma się po pierwszych 5 wierszach. Jeśli nie jest indeksowany, będzie musiał wykonaćTOP N
sortowanie. Nie będzie to gorsze niż jakikolwiek inny sposób. Nie sortuje całego stołu (chociaż musiałby przeskanować cały stół)Odpowiedzi:
Możesz to zrobić również za pomocą funkcji NUMER WIERSZA WEDŁUG PARTYCJI. Świetny przykład można znaleźć tutaj :
źródło
Możesz ustawić serwer SQL tak, aby wybierał ostatnie N wierszy za pomocą tego kodu SQL:
źródło
Przetestowałem kod JonVD, ale okazało się, że był bardzo wolny, 6s.
Ten kod zajął 0s.
źródło
OrderDate
zaindeksowane, zasadniczo równie szybkie powinno być wybranie pierwszego lub ostatniego N wierszy zapytania. Zdaję sobie sprawę, że istnieje szansaOrderDate
, że wstawione zamówienie dobrze koreluje, ale jest to w najlepszym przypadku efekt uboczny i nadal wymaga skanowania tabeli, prawda? (I nie sądzę, żeby to odpowiadało na to, co OP wskazuje, jako lepiej sformułowane oszustwo ich pytania : tj. Bez sortowania)Jeśli chcesz wybrać ostatnie numery wierszy z tabeli.
Składnia będzie następująca
Te stwierdzenia działają, ale na różne sposoby. dzięki chłopaki.
w ten sposób możesz uzyskać ostatnie 10 rzędów, ale kolejność pokaże malejący sposób
źródło
W bardzo ogólny sposób i do obsługi serwera SQL jest tutaj
a jeśli chodzi o wydajność, nie jest źle (mniej niż jedna sekunda na ponad 10000 rekordów na serwerze)
źródło
Czy „Id” jest indeksowany? Jeśli nie, to ważna rzecz (podejrzewam, że jest już indeksowana).
Czy musisz także zwrócić WSZYSTKIE kolumny? Możesz uzyskać znaczną poprawę szybkości, jeśli faktycznie potrzebujesz tylko mniejszego podzbioru kolumn, które można W PEŁNI pokryć indeks w kolumnie ID - np. Jeśli masz indeks NONCLUSTERED w kolumnie Id, bez innych pól zawartych w indeksie, wówczas musiałby przeprowadzić wyszukiwanie w indeksie klastrowym, aby faktycznie uzyskać zwrot pozostałych kolumn, co mogłoby znacznie wpłynąć na koszt zapytania. Jeśli jest to indeks CLUSTERED lub indeks NONCLUSTERED, który zawiera wszystkie inne pola, które chcesz zwrócić w zapytaniu, wszystko powinno być w porządku.
źródło
Najpierw otrzymujesz najwięcej rekordów z
I wtedy :
W programie SQL Server 2012
W SQL Server 2008
źródło
Oto coś, czego możesz spróbować bez znaku,
order by
ale myślę, że wymaga to, aby każdy wiersz był inny .N
to liczba żądanych wierszy,L
to liczba wierszy w tabeli.Jak wspomniano wcześniej, zwracane wiersze są nieokreślone.
EDYCJA: to jest właściwie pies powolny. Tak naprawdę bez wartości.
źródło
źródło
To zapytanie zwraca ostatnie N wierszy we właściwej kolejności, ale jego wydajność jest niska
źródło
użyj desc z orderby na końcu zapytania, aby uzyskać ostatnie wartości.
źródło
To może nie pasować do pytania, ale…
Klauzula OFFSET
OFFSET number
Klauzula pozwala przeskoczyć nad liczbą wierszy, a następnie powrót wiersze po tym.Ten link do dokumentu prowadzi do Postgres; Nie wiem, czy dotyczy to Sybase / MS SQL Server.
źródło
źródło
MS nie obsługuje LIMIT w t-sql. W większości przypadków po prostu otrzymuję MAX (ID), a następnie odejmuję.
To zwróci mniej niż 10 rekordów, gdy identyfikator nie jest sekwencyjny.
źródło
Technika, której używam do odpytywania NAJNOWSZYCH wierszy w bardzo dużych tabelach (ponad 100 milionów lub ponad 1 miliard wierszy) ogranicza zapytanie do „czytania” tylko ostatniego procentu „N” z OSTATNICH WIERSZ. To są aplikacje ze świata rzeczywistego, na przykład robię to dla niehistorycznych ostatnich danych pogodowych, ostatnich wyszukiwań kanałów wiadomości lub ostatnich danych o lokalizacji GPS.
To ogromna poprawa wydajności jeśli na przykład wiesz na pewno, że Twoje wiersze znajdują się w ostatnich 5% w tabeli. Taki, że nawet jeśli w tabelach znajdują się indeksy, dodatkowo ogranicza to możliwości do tylko 5% wierszy w tabelach, które mają ponad 100 milionów lub ponad 1 miliard wierszy. Dzieje się tak zwłaszcza w przypadku, gdy starsze dane będą wymagały odczytu dysku fizycznego, a nie tylko logicznego w pamięci odczytów .
Jest to znacznie wydajniejsze niż SELECT TOP | PERCENT | LIMIT, ponieważ nie zaznacza wierszy, a jedynie ogranicza część danych do przeszukania.
źródło
Aby wyświetlić ostatnie 3 wiersze bez użycia
order by
:źródło
Spróbuj użyć
EXCEPT
składni.Coś takiego:
źródło
Może trochę późno, ale oto prosty wybór, który rozwiąże Twoje pytanie.
źródło