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ź.