Lekcja w formie wideo

Wstęp

Z poprzednich lekcji wiesz jak wybrać wszystkie wiersze z tabeli. Zapewne jest ich tak wiele, że wynik mignął Ci przed oczami. Co zrobić aby dostać tylko tyle wierszy ile potrzebujesz?

W tej lekcji dowiesz się jak ograniczyć liczbę wierszy wyniku zapytania.

Klauzula FETCH

Klauzula FETCH pochodzi ze standardu ANSI. Jest zaimplementowana w większości wiodących motorów. Oprócz Oracle również w MySQL, PostgreSQL i SQL Server. W Oracle dostępna od wersji 12c.

Jej najprostsza składnia może wyglądać następująco:

FETCH NEXT 5 ROWS ONLY

Mówi motorowi bazy danych, że ma zwrócić pięć pierwszych wierszy wyniku. Powinna wystąpić na końcu zapytania. Spróbuj zastosować do zapytania z poprzedniej lekcji. Po prostu dopisz przed średnikiem.

SELECT
  owner
  ,table_name
FROM
  all_tables
FETCH NEXT 5 ROWS ONLY;

Jeśli nie chcesz wskazywać dokładnej liczby wierszy możesz określić ją procentowo.

SELECT
  owner
  ,table_name
FROM
  all_tables
FETCH NEXT 5 PERCENT ROWS ONLY;

Takie zapytanie zwróci 5% wierszy wyniku.

Klauzula OFFSET

Klauzula FETCH zawsze zaczyna liczyć wiersze od pierwszego w wyniku. Możesz to zmienić i jawnie wskazać numer wiersza od którego wynik Cię interesuje. Robisz to stosując słowo kluczowe OFFSET. Na przykład wskazujesz, że interesuje Cię pięć wierszy począwszy od trzeciego:

SELECT
  owner
  ,table_name
FROM
  all_tables
OFFSET 3 ROWS FETCH NEXT 5 ROWS ONLY;

Stosując tę, zgodną ze standardem ANSI, składnię piszesz kod który będzie działał na wielu motorach baz danych.

Popularnym zastosowaniem jest stronicowanie danych. Na przykład aby Twoja aplikacja wyświetlała po pięć rekordów. Jakkolwiek użycie klauzuli FETCH do stronicowania jest proste i wygodne, dla dużych zbiorów danych nie jest optymalne. Zapytanie będzie działać coraz wolniej dla każdej kolejnej strony.

Jak sądzisz, dlaczego tak będzie?

Wydajność

Jawne specyfikowanie motorowi bazy danych, że interesuje Cię jedynie określona liczba wierszy lub wartości wyniku wpływa pozytywnie na wydajność. Optymalizatory baz danych, a na pewno optymalizator Oracle, przygotowany jest do optymalizowania takich zapytań. Dlatego jeśli Twój wynik zawiera tysiące wierszy, ale interesuje Cię jedynie stosunkowo niewielka liczba początkowych to nie wahaj się powiedzieć o tym instancji bazy danych. Odwdzięczy się mniejszą konsumpcją zasobów komputera. Dzięki czemu dostaniesz wynik szybciej.

I nigdy, absolutnie nigdy nie przedkładaj filtrowania wyniku w aplikacji nad filtrowanie w bazie danych. Komunikacja sieciowa jest najbardziej kosztowną z wszystkich operacji IO. Nie musisz wierzyć mi na słowo. Przetestuj samodzielnie i pochwal się wynikiem na discord.

Możesz też użyć komentarzy pod tym materiałem aby namówić mnie do przeprowadzenia takich testów.

Podsumowanie

Gratuluję Ci ukończenia piątej lekcji darmowej edycji mojego kursu 'Podstawy SQL dla użytkowników Oracle’. Wiesz z niej jak ograniczyć ilość wierszy wyniku zapytania klauzulą FETCH pochodzącą ze standardu ANSI.

Zadanie dla Ciebie: napisz zapytanie zwracające kolumny owner i table_name z all_tables. Wynik ogranicz do dziesięciu wierszy zaczynając od piątego. Zrób zrzut ekranu i pochwal się swoim osiągnięciem na discordzie. Dedykowany serwer: Marcin Badtke – bazy danych i SQL.

Wiesz już jak ograniczać ilość wierszy wyniku zapytania. Zwróć uwagę, że część danych jest identyczna. Zastanawiasz się jak zadbać o ich unikalność? Przejdź do następnej lekcji to pokażę Ci jak zapewnić unikalność danych wyniku zapytania.

Jak klauzulą FETCH ograniczyć liczbę wierszy posortowanego wyniku przeczytasz w lekcji 14.

Gratuluję Ci ukończenia piątej lekcji darmowej edycji mojego kursu 'Podstawy SQL dla użytkowników Oracle’. Skomentuj poniżej jak Ci się podobała.

Jak uzyskać unikalność danych w wyniku zapytania SQL? Pokażę Ci w następnej lekcji. Chodź.

Idź do następnej lekcji

Wróć do poprzedniej lekcji

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Wymagane pola są oznaczone *