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

Typy danych unikatowych

Termin Definicja
Typy danych unikatowych

Typ danych unikatowych UNIQUEIDENTIFIER przechowuje 16-bajtowy identyfikator GUID.

Szesnaście bajtów zamiast licznika

UNIQUEIDENTIFIER 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 indeks

Klucz 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.

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