| Termin | Definicja |
|---|---|
| Typy danych unikatowych | Typ danych unikatowych UNIQUEIDENTIFIER przechowuje 16-bajtowy identyfikator GUID. Szesnaście bajtów zamiast licznikaUNIQUEIDENTIFIER w SQL Server przechowuje wartość GUID — 128 bitów zapisywanych w postaci tekstowej jako 36 znaków w układzie 8-4-4-4-12, na przykład 6F9619FF-8B86-D011-B42D-00C04FC964FF. Wartości generuje się funkcją NEWID(), zwracającą identyfikator praktycznie niepowtarzalny w skali świata, albo NEWSEQUENTIALID(), która nadaje kolejne wartości rosnąco w obrębie danego uruchomienia serwera i może być użyta wyłącznie jako wartość domyślna kolumny. Kolumna typu UNIQUEIDENTIFIER może być kluczem podstawowym, może mieć założone ograniczenie unikalności i porównuje się ją operatorami równości, natomiast sortowanie GUID-ów w SQL Server nie odpowiada kolejności bajtów widocznej w zapisie tekstowym. Cena, jaką płaci indeksKlucz oparty na INT zajmuje 4 bajty, BIGINT 8, a GUID aż 16 — i ten rozmiar powiela się w każdym indeksie nieklastrowym, bo każdy z nich przechowuje klucz klastrowy jako wskaźnik do wiersza. Przy tabeli z kilkoma indeksami różnica w zajętości potrafi urosnąć do kilkuset megabajtów. Gorszy jest jednak efekt losowości: identyfikator z NEWID() trafia w przypadkowe miejsce indeksu klastrowego, powodując rozrywanie stron i szybki wzrost fragmentacji, co widać w sys.dm_db_index_physical_stats jako kilkadziesiąt procent avg_fragmentation_in_percent po kilku dniach pracy. Dlatego GUID-y mają sens tam, gdzie klucz musi powstać poza bazą — w aplikacji mobilnej, w oddziale pracującym offline, przy scalaniu danych z kilku firm — a nie jako domyślny zamiennik kolumny IDENTITY. Skąd biorą się zgłoszenia o „dziwnych numerach”Najczęstszy błąd to wstawianie GUID-a jako tekstu bez konwersji, co kończy się komunikatem o niepowodzeniu konwersji z nvarchar na uniqueidentifier, gdy w ciągu jest spacja albo klamry. Drugi to próba użycia NEWSEQUENTIALID() w klauzuli SELECT lub w INSERT — serwer odrzuca ją, bo funkcja działa tylko w definicji DEFAULT. Trzeci to porównywanie GUID-ów operatorami mniejszości w nadziei na chronologię: kolejność bajtów przy porównaniu jest inna niż w zapisie tekstowym, więc wynik zaskakuje. Zdarza się też, że replikacja scalająca sama dokłada kolumnę rowguid do tabeli, a raporty zaczynają pokazywać kolumnę, której nikt nie projektował. Bazy handlowe pod opieką technicznąIdentyfikatory GUID pojawiają się w schematach programów handlowych i w mechanizmach synchronizacji między oddziałami, a ich niewłaściwe użycie objawia się spowolnieniem wyszukiwania dokumentów albo puchnięciem pliku bazy. Wdrażamy i serwisujemy Subiekta, WAPRO oraz Comarch działające na SQL Server, więc analiza planu zapytania, przebudowa indeksu czy odtworzenie bazy po awarii dysku należą do naszej codziennej pracy — obsługujemy przy tym zarówno firmy, jak i klientów indywidualnych. |