Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
I den här artikeln hittar du rekommendationer och exempel för hur du använder IDENTITY egenskapen för att skapa surrogatnycklar på tabeller i en dedikerad SQL-pool.
Vad är en surrogatnyckel?
En surrogatnyckel i en tabell är en kolumn med en unik identifierare för varje rad. Nyckeln genereras inte från tabelldata. Datamodellerare gillar att skapa surrogatnycklar på sina tabeller när de utformar datalagermodeller. Du kan använda egenskapen IDENTITY för att uppnå det här målet enkelt och effektivt utan att påverka belastningsprestandan.
Note
In Azure Synapse Analytics:
- IDENTITY-värdet ökar automatiskt i varje distribution och överlappar inte IDENTITY-värden i andra distributioner. Identitetsvärdet i Synapse är inte garanterat unikt om användaren uttryckligen infogar ett duplicerat värde med SET IDENTITY_INSERT ONeller återställer IDENTITY. Mer information finns i CREATE TABLE (Transact-SQL) IDENTITY (Property).
- UPDATE i distributionskolumnen garanterar inte att IDENTITY-värdet är unikt. Använd DBCC CHECKIDENT (Transact-SQL) efter UPDATE i distributionskolumnen för att verifiera unikhet.
Skapa en tabell med en identitetskolumn
Egenskapen IDENTITY är utformad för att skala ut över alla distributioner i den dedikerade SQL-poolen utan att påverka belastningsprestandan. Genomförandet av IDENTITY är därför inriktat på att uppnå dessa mål.
Du kan definiera en tabell som att ha IDENTITY egenskapen när du först skapar tabellen med hjälp av syntax som liknar följande instruktion:
CREATE TABLE dbo.T1
(    C1 INT IDENTITY(1,1) NOT NULL,
     C2 INT NULL
)
WITH
(   DISTRIBUTION = HASH(C2),
    CLUSTERED COLUMNSTORE INDEX
);
Du kan sedan använda INSERT..SELECT för att fylla i tabellen.
Resten av det här avsnittet belyser nyanserna i implementeringen för att hjälpa dig att förstå dem mer fullständigt.
Allokering av värden
Egenskapen IDENTITY garanterar inte i vilken ordning surrogatvärdena allokeras på grund av datalagrets distribuerade arkitektur. Egenskapen IDENTITY är utformad för att skala ut över alla distributioner i den dedikerade SQL-poolen utan att påverka belastningsprestandan.
Följande exempel är en bild:
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');
I föregående exempel landade två rader i distribution 1. Den första raden har surrogatvärdet 1 i kolumnen C1och den andra raden har surrogatvärdet 61. Båda dessa värden genererades av IDENTITY egenskapen. Allokeringen av värdena är dock inte sammanhängande. Detta beteende är av design.
Skewed data
Intervallet med värden för datatypen är jämnt fördelat över distributionerna. Om en distribuerad tabell har skeva data kan värdeintervallet som är tillgängligt för datatypen förbrukas i förtid. Om alla data till exempel hamnar i en enda distribution har tabellen i praktiken endast åtkomst till en sextiedel av datatypens värden. Därför är egenskapen IDENTITY begränsad till INT och BIGINT endast datatyper.
SELECT..INTO
När en befintlig IDENTITY kolumn har valts i en ny tabell ärver IDENTITY den nya kolumnen egenskapen, såvida inte något av följande villkor är sant:
- Instruktionen SELECTinnehåller en sammanfogning.
- Multiple SELECTstatements are joined by usingUNION.
- Kolumnen IDENTITYvisas mer än en gång i listanSELECT.
- Kolumnen IDENTITYär en del av ett uttryck.
Om något av dessa villkor är sant, skapas kolumnen NOT NULL i stället för att ärva IDENTITY-egenskapen.
CREATE TABLE AS SELECT
              CREATE TABLE AS SELECT (CTAS) följer samma SQL Server-beteende som dokumenteras för SELECT..INTO. Du kan dock inte ange en IDENTITY egenskap i kolumndefinitionen för CREATE TABLE delen av -instruktionen. Du kan inte heller använda IDENTITY funktionen i den SELECT del av CTAS. För att fylla i en tabell måste du använda CREATE TABLE för att definiera tabellen följt av INSERT..SELECT för att fylla i den.
Infoga explicita värden i en identitetskolumn
Dedikerad SQL-pool stöder SET IDENTITY_INSERT <your table> ON|OFF syntax. Du kan använda den här syntaxen för att uttryckligen infoga värden i IDENTITY kolumnen.
Många datamodellerare gillar att använda fördefinierade negativa värden för vissa rader i sina dimensioner. Ett exempel är raden -1 eller okänd medlem .
Nästa skript visar hur du uttryckligen lägger till den här raden med hjälp SET IDENTITY_INSERTav :
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;
Load data
Förekomsten av IDENTITY egenskapen har vissa konsekvenser för din datainläsningskod. Det här avsnittet visar några grundläggande mönster för att läsa in data i tabeller med hjälp IDENTITYav .
För att läsa in data i en tabell och generera en surrogatnyckel med hjälp av IDENTITY, skapa tabellen och använd INSERT..SELECT eller INSERT..VALUES för att utföra inläsningen.
I följande exempel visas det grundläggande mönstret:
--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');
Note
Det går inte att använda CREATE TABLE AS SELECT för närvarande när data läses in i en tabell med en IDENTITY kolumn.
Mer information om hur du läser in data finns i Designa extrahering, inläsning och transformering (ELT) för dedikerad SQL-pool och metodtips för inläsning.
System views
Du kan använda sys.identity_columns katalogvy för att identifiera en kolumn som har IDENTITY egenskapen .
För att hjälpa dig att bättre förstå databasschemat visar det här exemplet hur du integrerar sys.identity_columns med andra systemkatalogvyer:
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'
;
Begränsningar
Egenskapen IDENTITY kan inte användas:
- När kolumndatatypen inte INTär ellerBIGINT
- När kolumnen också är distributionsnyckeln
- När tabellen är en extern tabell
Följande relaterade funktioner stöds inte i en dedikerad SQL-pool:
Vanliga åtgärder
Du kan använda följande exempelkod för att utföra vanliga uppgifter när du arbetar med IDENTITY kolumner.
Kolumn C1 är IDENTITY i alla följande uppgifter.
Hitta det högsta allokerade värdet för en tabell
              MAX() Använd funktionen för att fastställa det högsta allokerade värdet för en distribuerad tabell:
SELECT MAX(C1)
FROM dbo.T1
Find the seed and increment for the IDENTITY property
Du kan använda katalogvyerna för att identifiera konfigurationsvärdena för identitetsinkrement och startvärde för en tabell med hjälp av följande fråga:
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'
;