| Termin | Definicja |
|---|---|
| INTERSECT | INTERSECT to operator Transact-SQL zwracający wyłącznie wiersze występujące jednocześnie w obu porównywanych zestawach wyników. INTERSECT w Transact-SQL: czym jest operator części wspólnejINTERSECT służy do porównywania dwóch zestawów wyników i pozostawia wyłącznie te rekordy, które pojawiają się w obu z nich. Można potraktować go jako operację wyznaczania części wspólnej zbiorów. Jeżeli pierwsze zapytanie zwraca identyfikatory produktów oznaczonych jako dostępne, a drugie identyfikatory produktów przypisanych do wybranej kategorii, wynik INTERSECT obejmie tylko te identyfikatory, które spełniają oba warunki jednocześnie. Operator nie służy do dopisywania kolumn z drugiego zapytania ani do łączenia tabel po kluczu. Jego zadaniem jest filtrowanie pełnych wierszy na podstawie zgodności wartości w wybranych kolumnach. W podstawowej postaci składnia wygląda następująco: SELECT kolumna_a, kolumna_b Obie instrukcje SELECT tworzą części operatora. Wynik jest zbiorem wspólnym, a powtarzające się rekordy są standardowo redukowane, podobnie jak przy operacjach zbiorowych opartych na unikalnych wartościach. Z tego powodu INTERSECT bywa przydatny przy sprawdzaniu zgodności list, wykrywaniu elementów obecnych w dwóch źródłach oraz budowaniu warunków opartych na wspólnym występowaniu danych. Warto pamiętać, że porównywane są wartości zwracane przez zapytania, a nie fizyczne wiersze tabel. Dwa rekordy z różnych tabel mogą zostać uznane za zgodne, jeżeli mają takie same wartości w odpowiadających sobie kolumnach. INTERSECT a UNION i EXCEPT: kontekst techniczny oraz porównanieINTERSECT należy do operatorów zbiorowych Transact-SQL. Dla zrozumienia jego działania przydatne jest zestawienie go z UNION oraz EXCEPT. UNION łączy wyniki dwóch zapytań i zwraca elementy należące do pierwszego lub drugiego zestawu, przy czym domyślna forma usuwa duplikaty. INTERSECT ogranicza wynik do elementów wspólnych dla obu zestawów. EXCEPT zwraca rekordy obecne w pierwszym zapytaniu, lecz nieobecne w drugim. Różnica może zostać przedstawiona na prostym przykładzie: jeżeli pierwszy zbiór zawiera wartości 1, 2 i 3, a drugi 2, 3 i 4, UNION zwróci 1, 2, 3, 4, INTERSECT zwróci 2, 3, natomiast EXCEPT zapisane jako pierwszy zestaw EXCEPT drugi zwróci tylko 1. Zapytania po obu stronach INTERSECT muszą być zgodne pod względem liczby kolumn. Kolumny znajdujące się na tych samych pozycjach powinny mieć typy danych możliwe do porównania albo takie, dla których Transact-SQL może zastosować reguły konwersji. Znaczenie ma również kolejność kolumn. Poniższe zapytania mogą dać inny rezultat niż oczekiwany, nawet gdy używają tych samych nazw pól: SELECT id, nazwa FROM pierwsza_lista W takim przypadku pierwsza kolumna jest zestawiana z pierwszą, a druga z drugą. Nie następuje automatyczne dopasowanie według nazw. Dlatego przed użyciem operatora należy ustalić, które wartości mają reprezentować porównywany rekord i w jakiej kolejności powinny zostać zwrócone. Warto rozróżnić INTERSECT od JOIN. JOIN pozwala zestawiać kolumny z wielu tabel i zwykle zwraca szerszy wynik, zawierający dane z powiązanych źródeł. INTERSECT zachowuje układ kolumn pierwszego zapytania i wskazuje wspólne wiersze wynikowe. Jeżeli celem jest pobranie dodatkowych informacji o zgodnych rekordach, często stosuje się najpierw INTERSECT w podzapytaniu, a następnie łączenie z tabelą szczegółową. Wybór rozwiązania powinien zależeć od celu, czytelności instrukcji oraz planu wykonania. INTERSECT przy typowych problemach z danymi i zapytaniamiOperator INTERSECT jest często rozważany podczas porównywania dwóch raportów, list importowanych z różnych źródeł albo zestawów identyfikatorów wygenerowanych przez odmienne warunki filtrujące. Jednym z typowych zastosowań jest znalezienie klientów, którzy jednocześnie spełniają dwa niezależne kryteria. Pierwsza część może wskazywać osoby z aktywnym kontem, a druga osoby z zapisanym adresem kontaktowym. Wynik pokaże wspólną grupę, którą można dalej analizować bez powtarzania całej logiki w jednym, rozbudowanym WHERE. Innym przypadkiem jest kontrola kompletności migracji. Jeżeli jedna lista zawiera identyfikatory rekordów ze źródła, a druga identyfikatory zapisane już w tabeli docelowej, INTERSECT pozwala określić, które elementy występują po obu stronach. Sam wynik części wspólnej nie pokaże jednak brakujących rekordów. Do tego celu przydatne będzie porównanie w odwrotnym kierunku z użyciem EXCEPT, na przykład źródło EXCEPT cel. W praktyce oba zestawienia mogą być analizowane razem: jedno pokazuje elementy zgodne, a drugie rekordy, które wymagają wyjaśnienia. Problemy pojawiają się wtedy, gdy dane wyglądają podobnie, ale nie są identyczne. Spacje na końcu tekstu, różnice wielkości liter zależne od kolacji, odmienne formaty identyfikatorów, wartości NULL oraz niejawne konwersje typów mogą wpływać na wynik. Przed zastosowaniem INTERSECT warto więc sprawdzić definicje kolumn, kolację, długości tekstów i sposób reprezentowania brakujących wartości. Szczególnej uwagi wymaga porównywanie dat zapisanych jako tekst, ponieważ ten sam dzień może mieć różny zapis zależnie od formatu źródła. Warto także uważać na duplikaty. Zwykły INTERSECT zwraca wynik bez powielania tych samych wierszy. Jeżeli potrzebne jest zachowanie wielokrotności, można rozważyć INTERSECT ALL, o ile używana wersja środowiska oraz wymagania zadania pozwalają na takie rozwiązanie. Dla danych, w których liczba wystąpień ma znaczenie, należy dokładnie określić, czy porównywane są unikalne wartości, czy całe rozkłady rekordów. Bez tego raport może wyglądać poprawnie, ale nie odpowiadać założeniom biznesowym. INTERSECT w praktyce: wskazówki dotyczące czytelności i wydajnościPrzed zapisaniem operatora warto ograniczyć obie części zapytania do kolumn rzeczywiście potrzebnych do porównania. Zwracanie szerokich rekordów zwiększa ilość danych do zestawienia i może sprawić, że wiersze uznawane za równoważne przestaną być zgodne z powodu jednej dodatkowej kolumny. Jeżeli celem jest porównanie identyfikatorów, najlepiej zestawić identyfikatory, a nie cały opis rekordu. Dodatkowe szczegóły można pobrać w następnym kroku, gdy wspólna lista zostanie już ustalona. Filtry powinny być umieszczane możliwie blisko źródła danych. Warunek WHERE w pierwszym albo drugim SELECT może zmniejszyć liczbę przetwarzanych wierszy jeszcze przed wykonaniem operacji zbiorowej. Należy jednak zadbać o równoważność logiki. Dwie instrukcje zwracające identyfikator klienta mogą być formalnie poprawne, lecz porównywać inne przedziały czasu, statusy lub wersje danych. Zawsze warto czytać oba zapytania jako osobne zestawy wyników, a dopiero potem analizować działanie INTERSECT. Na wydajność wpływa rozmiar danych, selektywność filtrów, typy kolumn i dostępne indeksy. Przy dużych tabelach znaczenie może mieć indeks obejmujący kolumny używane w filtrach oraz w zestawieniu. Nie należy jednak tworzyć indeksów wyłącznie na podstawie jednego zapytania bez sprawdzenia częstotliwości jego wykonywania i kosztu utrzymania. Do oceny zachowania zapytania przydatny jest plan wykonania oraz porównanie czasu i liczby odczytów dla alternatywnych rozwiązań, takich jak JOIN, EXISTS albo warunek z podzapytaniem. Sortowanie należy wykonywać dopiero wtedy, gdy jest potrzebne do prezentacji. Kolejność wierszy zwróconych przez operację zbiorową nie powinna być zakładana bez jawnego ORDER BY. Klauzula ORDER BY może być stosowana na końcu całego wyrażenia, a nie jako niezależny element każdej części INTERSECT, chyba że zapytanie jest odpowiednio opakowane. Takie podejście ułatwia przewidywanie rezultatu i ogranicza zbędne sortowanie pośrednie. INTERSECT i moment zgłoszenia problemu do serwisuNieprawidłowy wynik INTERSECT może wynikać z błędu w zapytaniu, ale także z problemu z bazą danych, usługą systemową, dyskiem, pamięcią albo konfiguracją środowiska pracy. Do serwisu warto zgłosić się wtedy, gdy aplikacja bazodanowa przestaje odpowiadać, zapytania wyraźnie zwalniają mimo niezmienionej ilości danych, pojawiają się błędy odczytu lub system nie uruchamia narzędzi potrzebnych do diagnostyki. Przed przekazaniem sprzętu dobrze jest zachować kopię zapytań, komunikaty błędów i przykładowe wyniki, bez ujawniania danych wrażliwych. W Warszawie pomoc techniczną w zakresie sprzętu komputerowego świadczy Warszawskie Pogotowie Komputerowe 24/7. Przy zgłoszeniu można opisać objawy związane z działaniem systemu, aplikacji bazodanowej lub nośnika danych, a następnie ustalić zakres sprawdzenia. Takie rozdzielenie problemu programistycznego od sprzętowego ułatwia ocenę, czy przyczyny należy szukać w składni INTERSECT, strukturze danych, planie wykonania, czy w stabilności komputera. |