Udostępnij za pośrednictwem


Używanie tożsamości do tworzenia kluczy zastępczych przy użyciu dedykowanej puli SQL w usłudze Azure Synapse Analytics

W tym artykule znajdziesz zalecenia i przykłady użycia właściwości IDENTITY do tworzenia kluczy zastępczych w tabelach w dedykowanej puli SQL.

Co to jest klucz zastępczy

Klucz zastępczy w tabeli to kolumna z unikatowym identyfikatorem dla każdego wiersza. Klucz nie jest generowany na podstawie danych tabeli. Modelujący dane lubią tworzyć klucze zastępcze w swoich tabelach podczas projektowania modeli magazynu danych. Możesz użyć właściwości IDENTITY, aby osiągnąć ten cel po prostu i skutecznie bez wpływu na wydajność obciążenia.

Uwaga

W usłudze Azure Synapse Analytics:

  • Wartość IDENTITY zwiększa się samodzielnie w każdej dystrybucji i nie nakłada się na wartości IDENTITY w innych dystrybucjach. Wartość IDENTITY w usłudze Synapse nie jest gwarantowana jako unikatowa, jeśli użytkownik jawnie wstawia zduplikowaną wartość z wartością "SET IDENTITY_INSERT ON" lub reseeds IDENTITY. Aby uzyskać szczegółowe informacje, zobacz CREATE TABLE (Transact-SQL) IDENTITY (Właściwość).
  • Aktualizacja kolumny dystrybucji nie gwarantuje unikatowości wartości IDENTITY. Użyj polecenia DBCC CHECKIDENT (Transact-SQL) po aktualizacji w kolumnie dystrybucji, aby zweryfikować unikatowość.

Tworzenie tabeli z kolumną IDENTITY

Właściwość IDENTITY została zaprojektowana do skalowania w poziomie we wszystkich dystrybucjach w dedykowanej puli SQL bez wpływu na wydajność obciążenia. W związku z tym implementacja tożsamości jest ukierunkowana na osiągnięcie tych celów.

Tabelę można zdefiniować jako właściwość IDENTITY podczas pierwszego utworzenia tabeli przy użyciu składni podobnej do następującej instrukcji:

CREATE TABLE dbo.T1
(    C1 INT IDENTITY(1,1) NOT NULL
,    C2 INT NULL
)
WITH
(   DISTRIBUTION = HASH(C2)
,   CLUSTERED COLUMNSTORE INDEX
)
;

Następnie możesz użyć INSERT..SELECT polecenia , aby wypełnić tabelę.

W pozostałej części tej sekcji przedstawiono niuanse implementacji, które ułatwiają zrozumienie ich w pełni.

Alokacja wartości

Właściwość IDENTITY nie gwarantuje kolejności przydzielania wartości zastępczych ze względu na rozproszoną architekturę magazynu danych. Właściwość IDENTITY została zaprojektowana do skalowania w poziomie we wszystkich dystrybucjach w dedykowanej puli SQL bez wpływu na wydajność obciążenia.

Poniższy przykład przedstawia ilustrację:

CREATE TABLE dbo.T1
(    C1 INT IDENTITY(1,1)    NOT NULL
,    C2 VARCHAR(30)                NULL
)
WITH
(   DISTRIBUTION = HASH(C2)
,   CLUSTERED COLUMNSTORE INDEX
)
;

INSERT INTO dbo.T1
VALUES (NULL);

INSERT INTO dbo.T1
VALUES (NULL);

SELECT *
FROM dbo.T1;

DBCC PDW_SHOWSPACEUSED('dbo.T1');

W poprzednim przykładzie dwa wiersze wylądowały w dystrybucji 1. Pierwszy wiersz ma wartość zastępczą 1 w kolumnie C1, a drugi wiersz ma wartość zastępczą 61. Obie te wartości zostały wygenerowane przez właściwość IDENTITY. Jednak alokacja wartości nie jest ciągła. To zachowanie jest celowe.

Niesymetryczne dane

Zakres wartości dla tego typu danych jest rozłożony równomiernie w dystrybucjach. Jeśli tabela rozproszona będzie zawierać dane niesymetryczne, zakres wartości dostępnych dla typu danych może zostać przedwcześnie wyczerpany. Jeśli na przykład wszystkie dane kończą się w jednej dystrybucji, w rzeczywistości tabela ma dostęp tylko do jednej sześćdziesiątej wartości typu danych. Z tego powodu właściwość IDENTITY jest ograniczona tylko do INT typów danych i.BIGINT

WYBIERZ.. DO

Po wybraniu istniejącej kolumny IDENTITY do nowej tabeli nowa kolumna dziedziczy właściwość IDENTITY, chyba że spełniony jest jeden z następujących warunków:

  • Instrukcja SELECT zawiera sprzężenie.
  • Wiele instrukcji SELECT jest połączonych przy użyciu instrukcji UNION.
  • Kolumna IDENTITY jest wymieniona więcej niż raz na liście SELECT.
  • Kolumna IDENTITY jest częścią wyrażenia.

Jeśli którykolwiek z tych warunków ma wartość true, kolumna jest tworzona nie ma wartości NULL zamiast dziedziczyć właściwość IDENTITY.

CREATE TABLE AS SELECT

FUNKCJA CREATE TABLE AS SELECT (CTAS) jest zgodna z tym samym zachowaniem SQL Server, które zostało udokumentowane dla funkcji SELECT. DO. Nie można jednak określić właściwości IDENTITY w definicji CREATE TABLE kolumny części instrukcji. Nie można również użyć funkcji IDENTITY w SELECT części CTAS. Aby wypełnić tabelę, należy użyć CREATE TABLE polecenia , aby zdefiniować tabelę, po której następuje INSERT..SELECT wypełnienie.

Jawne wstawianie wartości do kolumny IDENTITY

Dedykowana pula SQL obsługuje SET IDENTITY_INSERT <your table> ON|OFF składnię. Przy użyciu tej składni można jawnie wstawić wartości do kolumny IDENTITY.

Wielu modelerów danych, takich jak używanie wstępnie zdefiniowanych wartości ujemnych dla niektórych wierszy w ich wymiarach. Przykładem jest wiersz -1 lub "nieznany element członkowski".

Następny skrypt pokazuje, jak jawnie dodać ten wiersz przy użyciu zestawu IDENTITY_INSERT:

SET IDENTITY_INSERT dbo.T1 ON;

INSERT INTO dbo.T1
(   C1
,   C2
)
VALUES (-1,'UNKNOWN')
;

SET IDENTITY_INSERT dbo.T1 OFF;

SELECT     *
FROM    dbo.T1
;

Ładowanie danych

Obecność właściwości IDENTITY ma pewne konsekwencje dla kodu ładowania danych. W tej sekcji przedstawiono podstawowe wzorce ładowania danych do tabel przy użyciu tożsamości.

Aby załadować dane do tabeli i wygenerować klucz zastępczy przy użyciu funkcji IDENTITY, utwórz tabelę, a następnie użyj metody INSERT.. WYBIERZ lub WSTAW.. WARTOŚCI do wykonania obciążenia.

W poniższym przykładzie wyróżniono podstawowy wzorzec:

--CREATE TABLE with IDENTITY
CREATE TABLE dbo.T1
(    C1 INT IDENTITY(1,1)
,    C2 VARCHAR(30)
)
WITH
(   DISTRIBUTION = HASH(C2)
,   CLUSTERED COLUMNSTORE INDEX
)
;

--Use INSERT..SELECT to populate the table from an external table
INSERT INTO dbo.T1
(C2)
SELECT     C2
FROM    ext.T1
;

SELECT *
FROM   dbo.T1
;

DBCC PDW_SHOWSPACEUSED('dbo.T1');

Uwaga

Obecnie nie można używać CREATE TABLE AS SELECT danych podczas ładowania danych do tabeli z kolumną IDENTITY.

Aby uzyskać więcej informacji na temat ładowania danych, zobacz Projektowanie wyodrębniania, ładowania i przekształcania (ELT) dla dedykowanej puli SQL i Najlepsze rozwiązania dotyczące ładowania.

Widoki systemu

Aby zidentyfikować kolumnę zawierającą właściwość IDENTITY, możesz użyć widoku wykazu sys.identity_columns .

Aby lepiej zrozumieć schemat bazy danych, w tym przykładzie pokazano, jak zintegrować sys.identity_column z innymi widokami wykazu systemu:

SELECT  sm.name
,       tb.name
,       co.name
,       CASE WHEN ic.column_id IS NOT NULL
             THEN 1
        ELSE 0
        END AS is_identity
FROM        sys.schemas AS sm
JOIN        sys.tables  AS tb           ON  sm.schema_id = tb.schema_id
JOIN        sys.columns AS co           ON  tb.object_id = co.object_id
LEFT JOIN   sys.identity_columns AS ic  ON  co.object_id = ic.object_id
                                        AND co.column_id = ic.column_id
WHERE   sm.name = 'dbo'
AND     tb.name = 'T1'
;

Ograniczenia

Właściwości IDENTITY nie można używać w następujących przypadkach:

  • Gdy typ danych kolumny nie jest INT ani BIGINT
  • Gdy kolumna jest również kluczem dystrybucji
  • Gdy tabela jest tabelą zewnętrzną

Następujące powiązane funkcje nie są obsługiwane w dedykowanej puli SQL:

Typowe zadania

Ta sekcja zawiera przykładowy kod, którego można użyć do wykonywania typowych zadań podczas pracy z kolumnami IDENTITY.

Kolumna C1 jest tożsamością we wszystkich następujących zadaniach.

Znajdowanie najwyższej przydzielonej wartości dla tabeli

MAX() Użyj funkcji, aby określić najwyższą wartość przydzieloną dla tabeli rozproszonej:

SELECT MAX(C1)
FROM dbo.T1

Znajdź inicjację i przyrost dla właściwości IDENTITY

Za pomocą widoków wykazu można odnajdywać wartości konfiguracji tożsamości przyrostowej i inicjujących dla tabeli przy użyciu następującego zapytania:

SELECT  sm.name
,       tb.name
,       co.name
,       ic.seed_value
,       ic.increment_value
FROM        sys.schemas AS sm
JOIN        sys.tables  AS tb           ON  sm.schema_id = tb.schema_id
JOIN        sys.columns AS co           ON  tb.object_id = co.object_id
JOIN        sys.identity_columns AS ic  ON  co.object_id = ic.object_id
                                        AND co.column_id = ic.column_id
WHERE   sm.name = 'dbo'
AND     tb.name = 'T1'
;

Następne kroki