| Termin | Definicja |
|---|---|
| Indeks unikalny nieklastrowany | Indeks unikalny nieklastrowany to niezależna od fizycznego porządku danych struktura wymuszająca unikalność wartości. Budowa i działanie indeksu unikalnego nieklastrowanegoIndeks unikalny nieklastrowany jest pomocniczą strukturą danych utrzymywaną przez silnik relacyjnej bazy danych. Jego zadaniem jest przyspieszenie wyszukiwania wierszy według jednej lub kilku kolumn oraz wymuszenie zasady, że określona wartość albo określona kombinacja wartości może wystąpić w tabeli tylko raz. Określenie „nieklastrowany” oznacza, że indeks nie wyznacza fizycznej kolejności wszystkich wierszy tabeli. Dane tabeli pozostają przechowywane niezależnie od kolejności kluczy indeksu, a indeks zawiera uporządkowane wpisy pozwalające odszukać odpowiadające im rekordy. Typowy wpis indeksu składa się z wartości klucza indeksowego oraz identyfikatora albo lokalizacji wiersza. W przypadku indeksu obejmującego jedną kolumnę kluczem jest wartość tej kolumny. Przy indeksie wielokolumnowym klucz tworzy uporządkowana kombinacja wartości, na przykład para składająca się z identyfikatora oddziału i numeru dokumentu. Unikalność dotyczy całego klucza indeksowego, a niekoniecznie każdej kolumny osobno. Jeżeli indeks obejmuje kolumny A i B, dopuszczalne mogą być powtórzenia A albo B, ale identyczna para A+B nie może wystąpić drugi raz. Unikalność a wartości NULL i kolumny wielokolumnoweNajważniejszą właściwością indeksu unikalnego jest kontrola operacji, które mogłyby doprowadzić do powstania duplikatu. Podczas wstawiania nowego wiersza lub zmiany wartości objętej indeksem silnik sprawdza, czy taki klucz już istnieje. Jeżeli istnieje, operacja zostaje odrzucona błędem naruszenia unikalności. To sprawdzenie odbywa się również wtedy, gdy aplikacja nie wykonuje wcześniej osobnego zapytania kontrolnego. Dzięki temu reguła jest egzekwowana na poziomie bazy danych, a nie tylko w kodzie jednego programu. Sposób traktowania wartości NULL zależy od konkretnego silnika bazy danych i jego reguł indeksowania. NULL nie jest zwykłą wartością tekstową ani liczbową, lecz oznacza brak znanej wartości, dlatego porównywanie NULL z NULL nie jest równoważne zwykłemu porównaniu dwóch identycznych liczb. W różnych systemach i konfiguracjach indeks unikalny może dopuścić jedną wartość NULL, wiele wartości NULL albo wymagać dodatkowego mechanizmu, aby ograniczenie obejmowało wyłącznie wartości niepuste. Z tego powodu zachowania dotyczącego NULL nie należy przenosić między silnikami bez sprawdzenia dokumentacji konkretnego produktu. Przy indeksie wielokolumnowym kolejność kolumn ma znaczenie dla wyszukiwania. Indeks z kluczem uporządkowanym jako A, B jest naturalnie użyteczny dla warunków filtrujących po A albo po A i B. Nie zapewnia takiej samej efektywności dla zapytania filtrującego wyłącznie po B, ponieważ wartości B są uporządkowane wewnątrz grup wyznaczonych przez A. Unikalność nadal odnosi się do całej kombinacji, ale użyteczność wydajnościowa zależy od sposobu formułowania zapytań. Wpływ na zapytania, modyfikacje i plan wykonaniaOptymalizator zapytań może wykorzystać indeks unikalny nieklastrowany do szybkiego odnalezienia konkretnego wiersza. Gdy warunek filtruje po pełnym kluczu unikalnym, silnik wie, że wynik może zawierać najwyżej jeden rekord. Ta informacja może wpłynąć na wybór planu wykonania, ograniczyć zakres odczytu i zmniejszyć liczbę operacji potrzebnych do potwierdzenia wyniku. Indeks może być również używany przy wyszukiwaniu po prefiksie klucza wielokolumnowego, sortowaniu lub sprawdzaniu istnienia rekordu, o ile struktura indeksu odpowiada warunkom zapytania. Indeks nie jest jednak darmowym dodatkiem. Każde wstawienie, usunięcie albo zmiana wartości objętej indeksem może wymagać aktualizacji jego stron, wpisów i metadanych. Przy dużej liczbie modyfikacji dodatkowa struktura zwiększa koszt zapisu oraz zużycie miejsca. Zmiana kolumny będącej częścią klucza może być szczególnie kosztowna, ponieważ wymaga usunięcia starego wpisu i dodania nowego. Jeżeli indeks zawiera także kolumny dołączone wyłącznie w celu pokrycia zapytań, ich aktualizacja również może wpływać na wydajność operacji zapisu. Nie każdy indeks unikalny nieklastrowany jest właściwym rozwiązaniem dla każdej reguły biznesowej. Indeks kontroluje równość kluczy zgodnie z zasadami porównywania ustalonymi przez silnik, typ danych, sortowanie lub kolację. Nie sprawdza samodzielnie zależności między tabelami, zakresów dat ani warunków wymagających bardziej złożonego predykatu. Do takich reguł mogą być potrzebne inne ograniczenia, indeksy warunkowe, wyrażenia indeksowane albo procedury kontrolne, zależnie od możliwości konkretnego systemu. Weryfikacja poprawności i typowe problemy eksploatacyjneAnalizę problemu z indeksem unikalnym należy rozpocząć od ustalenia jego dokładnej definicji: nazwy tabeli, kolumn wchodzących w skład klucza, kolejności tych kolumn, typów danych oraz reguł dotyczących NULL. Następnie trzeba sprawdzić, która operacja wywołuje błąd: INSERT, UPDATE, import danych czy synchronizacja. Komunikat o naruszeniu unikalności wskazuje zwykle, że klucz już istnieje, ale przyczyną może być także nieoczekiwane przekształcenie wartości, takie jak ignorowanie wielkości liter, normalizacja znaków lub porównywanie końcowych spacji zgodnie z regułami danego silnika. Przed utworzeniem indeksu na istniejącej tabeli należy wykryć powtarzające się klucze. Dla klucza złożonego sprawdzenie musi obejmować całą kombinację kolumn, a nie każdą kolumnę oddzielnie. Samo usunięcie jednego z powtarzających się wierszy może być niebezpieczne, jeśli rekordy są powiązane z innymi tabelami. Bezpieczne porządkowanie danych wymaga ustalenia, który rekord jest właściwy, zachowania wymaganych relacji oraz wykonania operacji w sposób zgodny z mechanizmem transakcji używanym przez dany silnik. Podczas diagnostyki warto odróżnić problem logiczny od problemu wydajnościowego. Błąd unikalności oznacza naruszenie reguły danych, natomiast wolne zapytanie może wynikać z niepasującego prefiksu klucza, nieaktualnych statystyk, dużej liczby odczytów z tabeli albo nadmiarowych indeksów. Ostateczna ocena powinna opierać się na definicji schematu, planie wykonania, rzeczywistych warunkach zapytań i historii modyfikacji danych. Ponieważ szczegóły składni oraz zachowanie NULL różnią się między produktami, polecenia diagnostyczne trzeba dobierać dopiero po ustaleniu używanego silnika bazy danych. |