Serwisanci dostępni teraz · czynne całą dobę, także w weekendy i świętaWarszawa i okolice · dojazd bezpłatny
Darmowa diagnoza laptopa
Darmowa diagnoza laptopa
Dojazd do klienta bezpłatnie
Dojazd do klienta bezpłatnie
Laptopy zastępcze bezpłatnie
Laptopy zastępcze bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie
Odbiór i zwrot sprzętu bezpłatnie

Widok z DISTINCT

Termin Definicja
Widok z DISTINCT

Widok z DISTINCT zwraca wyłącznie unikalne kombinacje wartości kolumn.

Jak silnik bazy realizuje taki widok

Definicja wygląda niepozornie: CREATE VIEW v_klienci AS SELECT DISTINCT miasto, branza FROM zamowienia. Za słowem kluczowym kryje się jednak operacja usuwania duplikatów całych krotek, a nie pojedynczych kolumn - DISTINCT zawsze dotyczy pełnej listy wybranych pól. Optymalizator realizuje ją operatorem Sort Distinct albo Hash Match Aggregate, w zależności od statystyk i dostępnych indeksów. Oba warianty wymagają pamięci roboczej; gdy jej zabraknie, plan wykonania sypie się do tempdb i zapytanie zwalnia wielokrotnie. Wartości NULL są przy tym traktowane jako jedna wspólna wartość, więc dwa wiersze z pustą branżą zostaną zredukowane do jednego, mimo że w porównaniu NULL = NULL dają nieznany wynik.

DISTINCT kontra GROUP BY i funkcje okna

Dla samego usunięcia duplikatów DISTINCT i GROUP BY po tych samych kolumnach dają identyczny plan wykonania - różnica jest czytelnościowa. GROUP BY wygrywa, gdy do listy trzeba dołożyć agregaty, na przykład liczbę zamówień na miasto. Zupełnie inna klasa problemu pojawia się, gdy chodzi o jeden reprezentatywny wiersz na klucz, a nie o unikalne kombinacje: wtedy właściwym narzędziem jest ROW_NUMBER() OVER (PARTITION BY klient_id ORDER BY data DESC) z filtrem na wartość 1 w zapytaniu nadrzędnym. Próba załatwienia tego przez DISTINCT kończy się tym, że dodanie kolumny z datą przywraca wszystkie duplikaty, bo każda krotka znów staje się unikalna.

Ograniczenia, o które łatwo się potknąć

Widok z DISTINCT nie jest aktualizowalny - polecenia INSERT, UPDATE i DELETE skierowane do niego zostaną odrzucone, ponieważ silnik nie potrafi jednoznacznie wskazać wiersza źródłowego. Nie da się go też zdefiniować jako widoku indeksowanego: w SQL Server widok z klauzulą WITH SCHEMABINDING i indeksem klastrowym nie dopuszcza ani DISTINCT, ani wielu innych konstrukcji. Osobna pułapka to widok z DISTINCT nałożony na inny widok z DISTINCT - deduplikacja wykonuje się wtedy dwa razy, choć drugie przejście niczego nie zmienia, a kosztuje pełne sortowanie. Jeżeli DISTINCT jest w widoku po to, żeby ukryć skutki źle napisanego złączenia, prawdziwym rozwiązaniem jest poprawienie warunku JOIN, a nie maskowanie efektu.

Serwery bazodanowe w małych firmach

Instancje SQL Server w niewielkich przedsiębiorstwach często stoją na zwykłym pececie w kącie pokoju, bez klimatyzacji, na pojedynczym dysku, z kopią zapasową w tym samym katalogu co baza. Przeglądamy takie stanowiska, wymieniamy nośniki na sprawne, dokładamy pamięć, ustawiamy sensowny harmonogram kopii i weryfikujemy, czy w ogóle da się z nich cokolwiek odtworzyć. Gdy serwer już padł, zaczynamy od zabezpieczenia zawartości dysku, zanim zaczniemy cokolwiek naprawiać. Zgłoszenia przyjmujemy o dowolnej porze doby, we wszystkie dni tygodnia.

+48 22 100 48 29Zadzwoń teraz · serwisant w 1 godzinę