Jak działa TOP i jaki ma to wpływ na czas zapytania?

0
SELECT TOP 100 * FROM myTable AS mt WHERE mt.flag = 1

  1. Czy przeszukiwać będzie po tym warunku całą tabelę czy wyszuka z tym warunkiem pierwsze 100 i zwróci (co będzie mniej kosztowne, bo nie będzie nawet zaglądał w dalsze rekordy, bo już znalazł pierwszą setkę pasującą do kryterium)
SELECT TOP 100 * FROM myTable AS mt WHERE mt.flag = 1 ORDER BY mt.date
  1. Czy przeszukiwać będzie wszystkie rekordy w tabeli na spełnienie warunku i po znalezieniu pierwszych 100 je posortuje, czy przeszuka wszystkie rekordy na spełnienie warunku, dopiero posortuje i zwróci tylko pierwsze 100 rekordów od góry ze wszystkich?
1

(Step 5) SELECT -- określanie kształtu wyniku, selekcja pionowa (kolumn)
(Step 1) FROM -- określenie źródła (źródeł) i relacji między nimi
(Step 2) WHERE -- filtracja rekordów
(Step 3) GROUP BY -- grupowanie rekordów
(Step 4) HAVING -- filtrowanie grup
(Step 6) ORDER BY -- sortowanie wyniku

IMHO TOP będzie razem z SELECT w kroku 5.

0
Królikowy napisał(a):
  1. Czy przeszukiwać będzie wszystkie rekordy w tabeli na spełnienie warunku i po znalezieniu pierwszych 100 je posortuje

Jaki to miałoby mieć sens?

4

po co zgadywać i wprowadzać ludzi w błąd, skoro można wziąć kolejność z dokumentacji ;)

FROM
ON
JOIN
WHERE
GROUP BY
WITH CUBE or WITH ROLLUP
HAVING
SELECT
DISTINCT
ORDER BY
TOP
  1. tak zatrzyma się po 100 i dalej nie będzie przetwarzać
  2. pierw przejrzy całość potem posortuje te spełniające warunek, i zwróci 100 z nich
0

Tu nie ma jednej odpowiedzi, ponieważ dużo,a właściwie wszystko zależy od funkcjonujących w bazie indeksów lub ich braku . Przy dobrze zdefiniowanych indeksach silnik bazy tylko na podstawie indeksu wybierze jakieś pierwsze 100 wierszy.
I jeszcze jedno, żebyś się nie zdziwił, ale wynik Twojego zapytania wcale nie musi być jednoznaczny. Innymi słowy to samo query w kolejnych wywołaniach może zwrócić inny wynik. Oczywiście każdy z nich będzie zgodny z warunkiem WHERE. Taka sytuacja może mieć miejsce jeśli nie zapewnisz unikalnych dla każdego wiersza w tabeli wartości wyrażeń użytych w klauzulach order i where.

0

@neves

  1. pierw przejrzy całość potem posortuje te spełniające warunek, i zwróci 100 z nich

nie do końca masz rację, bo jeśli baza znajdzie odpowiedni indeks to poleci po indeksie wybierając pierwszych 100 wierszy

1 użytkowników online, w tym zalogowanych: 0, gości: 1