Použití IDENTITY k vytvoření náhradních klíčů s využitím vyhrazeného fondu SQL v Azure Synapse Analytics
V tomto článku najdete doporučení a příklady použití vlastnosti IDENTITY k vytvoření náhradních klíčů u tabulek ve vyhrazeném fondu SQL.
Co je náhradní klíč
Náhradní klíč v tabulce je sloupec s jedinečným identifikátorem pro každý řádek. Klíč se negeneruje z dat tabulky. Modelátoři dat při návrhu modelů datového skladu rádi ve svých tabulkách vytvářejí náhradní klíče. Vlastnost IDENTITY můžete použít k dosažení tohoto cíle jednoduše a efektivně, aniž by to mělo vliv na výkon načítání.
Poznámka
V Azure Synapse Analytics:
- Hodnota IDENTITY se v každém rozdělení zvyšuje sama o sobě a nepřekrývá se s hodnotami IDENTITY v jiných distribucích. Hodnota IDENTITY ve službě Synapse není zaručená jedinečná, pokud uživatel explicitně vloží duplicitní hodnotu s parametrem SET IDENTITY_INSERT ON nebo znovu nastaví identitu. Podrobnosti najdete v tématu CREATE TABLE (Transact-SQL) IDENTITY (Vlastnost).
- Update v distribučním sloupci nezaručuje jedinečnou hodnotu IDENTITY. Pomocí příkazu DBCC CHECKIDENT (Transact-SQL) po aktualizaci v distribučním sloupci ověřte jedinečnost.
Vytvoření tabulky se sloupcem IDENTITY
Vlastnost IDENTITY je navržená tak, aby škálovat na více instancí napříč všemi distribucemi ve vyhrazeném fondu SQL, aniž by to mělo vliv na výkon načítání. Proto se implementace IDENTITY zaměřuje na dosažení těchto cílů.
Tabulku můžete definovat tak, aby měla vlastnost IDENTITY při prvním vytvoření tabulky pomocí syntaxe podobné následujícímu příkazu:
CREATE TABLE dbo.T1
( C1 INT IDENTITY(1,1) NOT NULL
, C2 INT NULL
)
WITH
( DISTRIBUTION = HASH(C2)
, CLUSTERED COLUMNSTORE INDEX
)
;
Tabulku pak můžete naplnit pomocí příkazu INSERT..SELECT
.
V této části se zvýrazní drobné odlišnosti implementace, abyste je lépe pochopili.
Přidělení hodnot
Vlastnost IDENTITY nezaručuje pořadí, ve kterém se náhradní hodnoty přidělují, kvůli distribuované architektuře datového skladu. Vlastnost IDENTITY je navržená tak, aby škálovat na více instancí napříč všemi distribucemi ve vyhrazeném fondu SQL, aniž by to mělo vliv na výkon načítání.
Následující příklad je znázorněný na obrázku:
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');
V předchozím příkladu se dva řádky dostaly do distribuce 1. První řádek má náhradní hodnotu 1 ve sloupci C1
a druhý řádek má náhradní hodnotu 61. Obě tyto hodnoty byly vygenerovány vlastností IDENTITY. Přidělení hodnot však není souvislé. Toto chování je záměrné.
Nerovnoměrná data
Rozsah hodnot určitého datového typu je rovnoměrně rozložený napříč distribucemi. Pokud distribuovaná tabulka trpí nerovnoměrnou distribucí dat, může dojít k předčasnému vyčerpání rozsahu hodnot dostupných pro daný datový typ. Pokud například všechna data skončí v jednom rozdělení, pak má tabulka ve skutečnosti přístup pouze k 1-šedesátiny hodnot datového typu. Z tohoto důvodu je vlastnost IDENTITY omezena pouze na INT
datové typy a BIGINT
.
VYBERTE.. DO
Pokud je existující sloupec IDENTITY vybraný do nové tabulky, zdědí nový sloupec vlastnost IDENTITY, pokud není splněna jedna z následujících podmínek:
- Příkaz SELECT obsahuje spojení.
- Několik příkazů SELECT je spojených pomocí klauzule UNION.
- Sloupec IDENTITY je v seznamu SELECT uvedený vícekrát.
- Sloupec IDENTITY je součástí výrazu.
Pokud je některá z těchto podmínek splněná, vytvoří se sloupec NOT NULL místo dědění vlastnosti IDENTITY.
CREATE TABLE AS SELECT
FUNKCE CREATE TABLE AS SELECT (CTAS) se řídí stejným SQL Server chováním, které je popsáno pro funkci SELECT. DO. V definici CREATE TABLE
sloupce části příkazu ale nemůžete zadat vlastnost IDENTITY. V části CTAS také nemůžete použít funkci SELECT
IDENTITY. Pokud chcete naplnit tabulku, musíte použít CREATE TABLE
příkaz k definování tabulky, po INSERT..SELECT
které následuje k jejímu naplnění.
Explicitní vkládání hodnot do sloupce IDENTITY
Vyhrazený fond SQL podporuje SET IDENTITY_INSERT <your table> ON|OFF
syntaxi. Pomocí této syntaxe můžete explicitně vložit hodnoty do sloupce IDENTITY.
Mnozí modelátoři dat rádi používají předdefinované záporné hodnoty pro určité řádky ve svých dimenzích. Příkladem je řádek -1 nebo "neznámý člen".
Další skript ukazuje, jak explicitně přidat tento řádek pomocí IDENTITY_INSERT SET:
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
;
Načítají se data
Přítomnost vlastnosti IDENTITY má určité důsledky pro kód pro načítání dat. Tato část popisuje některé základní vzory pro načítání dat do tabulek pomocí identity.
Pokud chcete načíst data do tabulky a vygenerovat náhradní klíč pomocí identity, vytvořte tabulku a pak použijte insert. VYBERTE nebo INSERT. HODNOTY pro provedení zatížení.
Následující příklad zvýrazňuje základní vzor:
--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');
Poznámka
Aktuálně není možné použít CREATE TABLE AS SELECT
při načítání dat do tabulky se sloupcem IDENTITY.
Další informace o načítání dat najdete v tématech Návrh extrakce, načítání a transformace (ELT) pro vyhrazený fond SQL a Osvědčené postupy načítání.
Systémová zobrazení
Pomocí zobrazení katalogu sys.identity_columns můžete identifikovat sloupec, který má vlastnost IDENTITY.
Abychom vám pomohli lépe porozumět schématu databáze, tento příklad ukazuje, jak integrovat sys.identity_column' s jinými zobrazeními systémového katalogu:
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'
;
Omezení
Vlastnost IDENTITY není možné použít v následujících případech:
- Pokud datový typ sloupce není INT nebo BIGINT
- Pokud je sloupec zároveň distribučním klíčem
- Když je tabulka externí tabulkou
Následující související funkce se ve vyhrazeném fondu SQL nepodporují:
Běžné úkoly
Tato část obsahuje ukázkový kód, který můžete použít k provádění běžných úloh při práci se sloupci IDENTITY.
Sloupec C1 je IDENTITA ve všech následujících úlohách.
Vyhledání nejvyšší přidělené hodnoty pro tabulku
MAX()
Pomocí funkce můžete určit nejvyšší hodnotu přidělenou distribuované tabulce:
SELECT MAX(C1)
FROM dbo.T1
Vyhledání počáteční hodnoty a přírůstku pro vlastnost IDENTITY
Zobrazení katalogu můžete použít ke zjištění hodnot přírůstku identity a počáteční konfigurace pro tabulku pomocí následujícího dotazu:
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'
;