Fabric Data Warehouse의 IDENTITY 열들

적용 대상: Microsoft Fabric의✅ Warehouse

Fabric Data Warehouse에서는 IDENTITY 테이블에 새로운 행을 삽입하면 열이 자동으로 새로운 숫자 값을 생성합니다.

서로게이트 키는 자연 키와 관계없이 행을 고유하게 구분하기 위해 데이터 웨어하우징에 사용되는 식별자입니다. 이 문서에서는 IDENTITY를 사용하여 대리 키를 생성하고 관리하는 방법(명시적 값 삽입 및 시드 재설정 포함)을 설명합니다.

IDENTITY 열을 사용하는 이유는 무엇인가요?

IDENTITY 열은 수동 키 할당을 없애고 오류 위험을 줄이며 데이터 수집 과정을 간소화합니다. 시스템 관리 고유 값은 서로게이트 키 및 기본 키로 이상적입니다. 수동 방식과 비교할 때, IDENTITY 컬럼은 추가 쿼리 논리 없이 고유 키가 자동으로 생성되기 때문에 더 나은 성능을 제공합니다.

컬럼에 IDENTITY 필요한 bigint 데이터 타입은 최대 9,223,372,036,854,775,807개의 양의 정수 값을 저장할 수 있습니다. 이 범위는 테이블의 전체 수명 주기 동안 각 행이 해당 IDENTITY 열에서 고유한 값을 갖도록 보장합니다.

다른 데이터베이스 플랫폼에서 서로게이트 키를 사용하여 데이터를 마이그레이션하는 계획은 IDENTITY 열을 Fabric Data Warehouse로 마이그레이션을 참조하세요.

문법

Fabric Data Warehouse에서 열을 IDENTITY 정의하려면 열 정의에서 다음과 IDENTITY 같은 속성을 사용하세요:

CREATE TABLE { warehouse_name.schema_name.table_name | schema_name.table_name | table_name } (
    [ column_name ] BIGINT IDENTITY ,
    [ ,...n ]
    -- Other columns here
);

정체성 열이 테이블 정의의 첫 번째 열일 필요는 없습니다.

IDENTITY 열의 작동 방식

Fabric Data Warehouse에서는 커스텀 시작 값이나 증분을 지정할 수 없습니다. 시스템은 내부적으로 가치를 관리하여 고유성을 보장합니다. IDENTITY 열은 항상 양의 정수 값을 생성합니다. 각 새 행은 새 값을 받으며 테이블이 있는 한 고유성이 보장됩니다. 한 번 값을 사용하면, IDENTITY 같은 값을 다시 사용하지 않습니다. IDENTITY 열이 생성하는 값에 누락이 생길 수 있습니다.

값 할당

웨어하우스 엔진의 분산 아키텍처 때문에, 이 속성은 IDENTITY 대리 값이 할당되는 순서를 보장하지 않습니다. 이 특성은 부하 성능에 영향을 주지 않으면서 병렬성을 극대화하기 위해 컴퓨팅 노드 전반에 걸쳐 확장됩니다. 따라서 서로 다른 섭취 과제의 가치 범위가 순차적이지 않을 수 있습니다.

다음은 이 동작에 대한 예입니다.

-- Create a table with an IDENTITY column
CREATE TABLE dbo.Table1(
    Column1 BIGINT IDENTITY,
    Column2 VARCHAR(30) NULL
)

-- Ingestion task A
INSERT INTO dbo.Table1
VALUES (NULL), (NULL), (NULL), (NULL);

-- Ingestion task B
INSERT INTO dbo.Table1
VALUES (NULL), (NULL), (NULL), (NULL);

-- Review the data
SELECT * FROM dbo.Table1;

샘플 결과:

Column1과 Column2로 표시된 두 열의 테이블 쿼리 결과 스크린샷으로, 8행의 데이터를 보여줍니다. 1열은 큰 숫자 값을, 2열은 텍스트를 담고 있습니다.

이 예시에서, Ingestion task AIngestion task B 는 독립적인 작업으로 순차적으로 실행됩니다. 작업들은 연속적으로 실행되지만, 첫 번째와 마지막 네 행은 에서 서로 다른 정체성 키 범위를 dbo.Table1.Column1가집니다. 작업 A와 작업 B에 할당된 범위 간에 공백이 발생할 수도 있습니다.

Fabric Data Warehouse에서 IDENTITYIDENTITY_INSERT을(를) 사용하지 않는 한 IDENTITY 열의 모든 값이 고유함을 보장하지만, 수집 작업에서 생성된 범위에는 간격이 생길 수 있습니다.

시스템 메타데이터 객체

다음 시스템 메타데이터 객체들은 Fabric Data Warehouse에서 식별 값을 설계하고 다룰 때 유용하게 제공됩니다.

sys.identity_columns 시스템 뷰로 식별 칼럼을 나열하세요

sys.identity_columns 카탈로그 뷰를 사용해 창고 내 모든 신원 열을 나열하세요. 다음 예시는 스키마, 테이블 및 ID 열 이름을 포함하여 IDENTITY 열이 있는 모든 테이블을 나열합니다:

SELECT
    s.name AS SchemaName,
    t.name AS TableName,
    c.name AS IdentityColumnName
FROM
    sys.identity_columns AS ic
INNER JOIN
    sys.columns AS c ON ic.[object_id] = c.[object_id]
    AND ic.column_id = c.column_id
INNER JOIN
    sys.tables AS t ON ic.[object_id] = t.[object_id]
INNER JOIN
    sys.schemas AS s ON t.[schema_id] = s.[schema_id]
ORDER BY
    s.name, t.name;

Fabric Data Warehouse에서 NULLseed_valueincrement_value 열은 sys.identity_columns을(를) 반환하며, IDENTITY 열이 생성된 후에는 업데이트되지 않습니다. last_value 열은 기본적으로 NULL을 반환하지만, 테이블에서 첫 번째 ID 삽입 작업이 수행된 후에는 영구적으로 -1로 전환됩니다.

IDENTITY_INSERT를 사용하여 값 삽입

기본적으로 열에 IDENTITY 값을 삽입할 수 없습니다. 하지만 데이터 마이그레이션, 재해 복구, 또는 센티넬 값을 채울 때(예 -1 : 차원 테이블의 "미지") 시 특정 값을 삽입해야 할 수도 있습니다.

SET IDENTITY_INSERT을 사용하여 일시적으로 식별 열에 명시적 삽입을 허용하세요:

SET IDENTITY_INSERT dbo.DimCustomer ON;

INSERT INTO dbo.DimCustomer (CustomerKey, CustomerName, Email)
VALUES (-1, 'John Doe', 'john@contoso.com');

SET IDENTITY_INSERT dbo.DimCustomer OFF;

IDENTITY_INSERT이(가) ON인 경우:

  • INSERT 문에는 열 목록이 필요합니다.
  • 세션당 한 번에 하나의 테이블에서만 IDENTITY_INSERTON(으)로 설정할 수 있습니다.

중요합니다

IDENTITY_INSERT를 끈 후 DBCC CHECKIDENT로 ID 값의 시드를 다시 설정합니다.

DBCC CHECKIDENT로 식별 값을 재시드

명시적 값 IDENTITY_INSERT를 삽입한 후 DBCC CHECKIDENT 를 사용해 식별 열을 다시 시드합니다. 이 연산은 RESEED 분산된 컴퓨팅 노드 간에 사용되고 예약된 모든 신원 범위를 스캔하여 올바른 다음 값을 결정하여 고유성을 보장하고 키 충돌을 방지합니다.

DBCC CHECKIDENT('dbo.DimProduct', RESEED);

Fabric Data Warehouse에서는 DBCC CHECKIDENTRESEED 옵션만 지원합니다. 창고가 자동으로 올바른 다음 값 범위를 결정하며, 커스텀 재시드 값을 지정할 수 없습니다. 자세한 내용은 DBCC CHECKIDENT를 참조하세요.

제한점

자세한 내용은 IDENTITY 열, IDENTITY (Transact-SQL), 그리고 Microsoft Fabric에서 Warehouse에서 테이블 생성을 참조하세요.

  • Fabric Data Warehouse의 열에는 IDENTITY 데이터 유형만 지원됩니다. 다른 데이터 유형은 오류를 일으킵니다.
  • 시드와 인크리먼트를 정의하는 기능은 지원되지 않습니다. 시스템은 내부적으로 가치를 관리합니다.
  • 기존 IDENTITY 테이블에 ALTER TABLE 열을 추가하는 것은 지원되지 않습니다. 기존 테이블의 복사본을 만들고 IDENTITY 열을 추가하려면 CREATE TABLE AS SELECT (CTAS) 또는 SELECT...INTO를 사용하는 것을 고려하세요.
  • CTAS 또는 SELECT...INTO를 사용하여 다른 테이블에서 선택하여 테이블을 생성할 때 컬럼이 보존되는 방식 IDENTITY 에는 제한이 있습니다. 자세한 내용은 SELECT - INTO 절(Transact-SQL)의 데이터 유형 섹션을 참조하세요.
  • DBCC CHECKIDENTRESEED 옵션만 지원합니다. 커스텀 재시드 값을 지정하거나 사용하는 NORESEED 것은 지원되지 않습니다.
  • IDENTITY 열은 고유한 값을 생성하지만, 값이 반드시 순차적이거나 순서가 정해져 있지 않아 공백이 발생할 수 있습니다.

예시

A. IDENTITY 열이 있는 테이블 만들기

CREATE TABLE Employees (
    EmployeeID BIGINT IDENTITY,
    FirstName VARCHAR(50),
    LastName VARCHAR(50)
);

이 문은 새 행이 추가될 때마다 각 행에 고유한 Employees 값으로 자동 할당되는 EmployeeID 테이블을 생성합니다.

B. 식별 열이 있는 테이블에 행을 삽입합니다

모든 비항등성 열에 대해 정의된 순서대로 값을 제공하면, 열 목록을 지정할 필요가 없습니다:

INSERT INTO Employees VALUES ('Quarantino', 'Esposito');

또한 정체성 열을 생략한 열 목록을 제공할 수도 있습니다:

INSERT INTO Employees (FirstName, LastName)
VALUES ('Ensi', 'Vasala');

C. 명시적인 값을 IDENTITY_INSERT로 삽입하세요

SET IDENTITY_INSERT dbo.Employees ON;

INSERT INTO dbo.Employees (EmployeeID, FirstName, LastName)
VALUES (100, 'Sentinel', 'Row');

SET IDENTITY_INSERT dbo.Employees OFF;

D. COPY INTO 사용으로 명시적 값을 삽입하세요

이 문장은 COPY INTO 명령어 내에서 명시적인 값을 인징하는 옵션을 지원합니다 IDENTITY_INSERT . COPY INTO 옵션은 IDENTITY_INSERT에 대한 모든 세션 수준 설정을 덮어씁니다.

COPY INTO dbo.Employees (EmployeeID 1, FirstName 2, LastName 3)
FROM 'https://myaccount.blob.core.windows.net/myblobcontainer/folder1/'
WITH (
    FILE_TYPE = 'CSV',
    IDENTITY_INSERT = 'ON'
);

E. 명시적 삽입 후 테이블을 다시 시드

DBCC CHECKIDENT('dbo.Employees', RESEED);

F. CREATE TABLE AS SELECT로 테이블을 생성하세요

CTAS를 사용해 테이블 복사본을 생성하고 대상 테이블에 속성을 보존 IDENTITY 합니다:

CREATE TABLE RetiredEmployees
AS SELECT * FROM Employees;

대상 테이블의 열은 소스 테이블로부터 속성을 상속 IDENTITY 받습니다. 제한 사항은 SELECT - INTO 절의 데이터 타입 섹션을 참조하세요.

G. SELECT...INTO를 사용하여 테이블 만들기

IDENTITY을 사용하여 테이블의 복사본을 만들고 대상 테이블에 SELECT...INTO 속성을 유지합니다:

SELECT *
INTO dbo.RetiredEmployees
FROM dbo.Employees
WHERE LastName = 'Esposito';

대상 테이블의 열은 소스 테이블로부터 속성을 상속 IDENTITY 받습니다. 제한 사항은 SELECT - INTO 절의 데이터 타입 섹션을 참조하세요.

다음 단계: