| Termin | Definicja |
|---|---|
| Widok z ORDER BY (ograniczenia) | Klauzula ORDER BY w widoku jest ignorowana, jeśli nie towarzyszy jej TOP lub OFFSET-FETCH. Widok z ORDER BY (ograniczenia) – czym jest ograniczenie sortowaniaWidok z klauzulą ORDER BY bywa traktowany jak gotowa, uporządkowana tabela, jednak takie rozumienie prowadzi do błędnych założeń. Widok jest zapisanym zapytaniem, które opisuje sposób pobierania danych, a nie trwałym magazynem rekordów ułożonych w określonej kolejności. O kolejności wierszy wyniku decyduje zapytanie wykonywane w danym momencie. Jeżeli zapytanie odwołujące się do widoku nie zawiera własnego ORDER BY, nie należy zakładać, że wiersze pojawią się w kolejności zapisanej wewnątrz definicji widoku. W środowisku Microsoft SQL Server próba umieszczenia samego ORDER BY w definicji widoku jest odrzucana przez silnik. Wyjątek stanowią konstrukcje, w których sortowanie jest bezpośrednio powiązane z ograniczeniem zbioru, na przykład TOP albo OFFSET-FETCH. Nie oznacza to jednak, że widok zaczyna działać jak posortowana tabela. Sortowanie może być potrzebne do wyznaczenia określonego podzbioru wierszy, lecz po zakończeniu tego etapu wynik nadal nie musi zachować kolejności podczas późniejszego odczytu. Najważniejsze rozróżnienie dotyczy dwóch różnych celów. Pierwszym jest wybranie konkretnych rekordów, na przykład kilku najnowszych wpisów według daty. Drugim jest przedstawienie już wybranych rekordów użytkownikowi w określonym porządku. ORDER BY używany razem z TOP lub OFFSET-FETCH może wspierać pierwszy cel. Drugi powinien być realizowany w zapytaniu końcowym, które pobiera dane z widoku. Widok z ORDER BY i TOP – kontekst techniczny oraz porównaniaPołączenie TOP i ORDER BY ma sens wtedy, gdy kolejność służy do ustalenia, które wiersze mają zostać zwrócone. Przykładowo widok może wybierać pięć ostatnich zdarzeń według kolumny z datą. W takim przypadku ORDER BY nie jest obietnicą sposobu prezentacji całego widoku, lecz elementem reguły wyboru. Bez sortowania wybór kilku rekordów może zależeć od planu wykonania, indeksów, rozkładu danych albo chwilowych warunków pracy silnika. Można porównać to do selekcji dokumentów z dużego zbioru. Jeżeli potrzebne są najnowsze dokumenty, najpierw trzeba określić kryterium kolejności, a następnie ograniczyć liczbę wyników. Sam fakt, że dokumenty zostały wybrane od najnowszego do najstarszego, nie gwarantuje, że późniejsza lista zostanie wyświetlona w takim układzie. Do prezentacji należy ponownie wskazać ORDER BY w zapytaniu zewnętrznym. Podobna zasada dotyczy OFFSET-FETCH. Konstrukcja ta pozwala pomijać określoną liczbę wierszy i pobierać następną porcję danych, co jest często stosowane przy stronicowaniu. Stabilne stronicowanie wymaga jednak jednoznacznego sortowania. Jeżeli kilka wierszy ma tę samą wartość w kolumnie użytej do porządku, mogą one zmieniać położenie między kolejnymi stronami. Zwykle stosuje się wtedy dodatkową kolumnę rozstrzygającą, na przykład klucz główny, aby kolejność była jednoznaczna. Warto odróżnić widok od tabeli posiadającej fizycznie utrwalone dane. Tabela również nie gwarantuje kolejności odczytu bez ORDER BY, nawet jeżeli rekordy były dodawane w określonej sekwencji. Indeks może przyspieszać wyszukiwanie i wpływać na obserwowany układ, ale nie zastępuje jawnego wymagania dotyczącego kolejności wyniku. Widok z ORDER BY – typowe problemy w zapytaniachCzęstym błędem jest dodanie TOP 100 PERCENT do widoku wyłącznie po to, aby obejść ograniczenie składniowe. Taki zapis może pozwolić na zaakceptowanie definicji, lecz nie tworzy niezawodnego mechanizmu sortowania wyniku. Optymalizator może usunąć operację sortowania, jeśli nie jest ona potrzebna do osiągnięcia końcowego rezultatu. TOP 100 PERCENT nie powinien być używany jako sposób wymuszania kolejności. Inny problem powstaje wtedy, gdy widok z TOP wybiera dane na podstawie kolumny, która nie rozróżnia rekordów. Jeżeli kilka zdarzeń ma identyczny czas, wybór granicznego wiersza może nie być deterministyczny. W efekcie kolejne wykonania zapytania mogą zwrócić różne rekordy, mimo że dane nie uległy zmianie. Rozwiązaniem jest dodanie drugiego, unikalnego kryterium sortowania, o ile odpowiada ono wymaganiom aplikacji. Ryzyko pojawia się także przy łączeniu widoku z innymi tabelami. Ograniczenie TOP zastosowane wewnątrz widoku może zostać wykonane przed połączeniem, przez co otrzymany zbiór będzie inny niż zbiór uzyskany po połączeniu wszystkich danych i dopiero późniejszym ograniczeniu. Znaczenie ma więc miejsce, w którym znajduje się TOP lub OFFSET-FETCH, a także kolejność logicznych etapów zapytania. Nie powinno się również zakładać, że kolejność widoczna w narzędziu administracyjnym będzie taka sama po przejściu przez aplikację, eksport albo raport. Różne warstwy mogą generować własne zapytania, dodawać filtry i zmieniać plan wykonania. Jeżeli kolejność ma znaczenie biznesowe, należy zapisać ją jawnie w zapytaniu, które zwraca dane do konkretnego odbiorcy. Widok z ORDER BY – praktyczne wskazówki projektowePrzy projektowaniu widoku warto najpierw określić, czy sortowanie ma służyć wyborowi ograniczonej liczby rekordów, czy jedynie ich prezentacji. W pierwszym przypadku można rozważyć TOP albo OFFSET-FETCH wraz z jednoznacznym ORDER BY. W drugim przypadku lepiej pozostawić widok jako logiczny zbiór danych, a porządek umieścić w zapytaniu korzystającym z widoku. Dobrą praktyką jest wybieranie kolumn sortujących zgodnie z rzeczywistą regułą biznesową. Dla rejestru zdarzeń może to być data utworzenia malejąco oraz identyfikator malejąco jako rozstrzygnięcie remisów. Dla listy nazw może to być nazwa rosnąco i klucz rekordu jako dodatkowy warunek. Samo sortowanie po kolumnie, która często zawiera powtarzające się wartości, może nie zapewnić stabilnego rezultatu. Przy stronicowaniu należy zachować ten sam, kompletny zestaw kryteriów sortowania dla każdej strony. W przeciwnym razie rekord może pojawić się na dwóch stronach albo nie pojawić się na żadnej. W większych zbiorach warto także sprawdzić plan wykonania i indeksy, ponieważ sortowanie dużej liczby wierszy może wymagać dodatkowych zasobów. Ocena wydajności powinna obejmować rzeczywiste filtry, liczbę danych oraz sposób, w jaki aplikacja korzysta z widoku. Jeżeli zapytanie ma zwracać zawsze określony zestaw rekordów, warto przetestować przypadki graniczne: puste dane, duplikaty wartości sortującej, rekordy z taką samą datą, usuwanie elementów pomiędzy stronami oraz dopisywanie nowych elementów. Takie testy pokazują, czy wynik jest powtarzalny i czy konstrukcja odpowiada oczekiwaniom użytkownika. Widok z ORDER BY – kiedy zgłosić się do serwisuDo serwisu warto zgłosić się wtedy, gdy problem z kolejnością wyników łączy się z niestabilnym działaniem komputera, błędami systemu, nieprawidłowym działaniem aplikacji bazodanowej albo trudnością w odczytaniu danych. Przed przekazaniem sprzętu przydatne jest zapisanie przykładowego zapytania, komunikatu błędu, używanej wersji programu oraz informacji, czy problem występuje zawsze, czy tylko przy określonej liczbie rekordów. Warszawskie Pogotowie Komputerowe 24/7 przyjmuje zgłoszenia dotyczące problemów ze sprzętem i oprogramowaniem komputerowym, w tym sytuacji, w których aplikacja nie uruchamia się poprawnie, zawiesza się podczas pracy z bazą danych albo wyświetla niespójne rezultaty. Przy analizie można rozdzielić problem składni SQL od problemu wydajności, konfiguracji systemu, uszkodzeń nośnika lub błędów samej aplikacji. Takie rozróżnienie ułatwia dobranie dalszych działań i ogranicza ryzyko pochopnej zmiany zapytania, która tylko maskuje przyczynę. Najważniejsza zasada pozostaje prosta: widok powinien opisywać logiczny zbiór danych, natomiast końcowe zapytanie powinno jawnie określać kolejność prezentacji. ORDER BY wewnątrz widoku może być uzasadniony przy wyborze ograniczonego zbioru z użyciem TOP lub OFFSET-FETCH, ale nie powinien być traktowany jako trwała właściwość wyniku. Takie podejście poprawia przewidywalność zapytań, ułatwia testowanie i pozwala uniknąć zależności od przypadkowego planu wykonania. |