다음을 통해 공유


Microsoft Fabric의 웨어하우스 테이블에서 고유 식별자 생성

적용 대상:✅ Microsoft Fabric 내 웨어하우스

Data Warehouse에서는 테이블의 각 행에 고유 식별자를 할당하는 것이 일반적인 요구 사항입니다. SQL Server 기반 환경에서는 일반적으로 테이블에 ID 열을 만들어서 수행되지만 현재 이 기능은 Microsoft Fabric의 웨어하우스에서 지원되지 않습니다. 대신 해결 방법을 사용해야 합니다. 우리는 두 가지 대안을 제시한다.

이 문서에서는 웨어하우스 테이블에서 고유 식별자를 생성하는 해결 방법을 설명합니다.

방법 1

이 메서드는 ID 값을 만들어야 하는 경우에 가장 적용할 수 있지만 값의 순서는 중요하지 않습니다(비순차적 값은 허용됨).

고유 값은 테이블에 데이터를 삽입하는 코드에서 생성됩니다.

  1. 이 메서드를 사용하여 고유한 데이터를 만들려면 고유 식별자 값을 저장하는 열을 포함하는 테이블을 만듭니다. 열 데이터 형식은 bigint설정해야 합니다. 또한 모든 행에 식별자가 할당되도록 열을 NOT NULL로 정의해야 합니다.

    다음 T-SQL 코드 샘플에서는 열이 고유 키 역할을 하는 스키마에 dbo 명명 Orders_with_IdentifierRow_ID 예제 테이블을 만듭니다.

    --Drop a table named 'Orders_with_Identifier' in schema 'dbo', if it exists
    IF OBJECT_ID('[dbo].[Orders_with_Identifier]', 'U') IS NOT NULL
        DROP TABLE [dbo].[Orders_with_Identifier];
    GO
    
    CREATE TABLE [dbo].[Orders_with_Identifier] (
        [Row_ID] BIGINT NOT NULL,
        [O_OrderKey] BIGINT NULL,
        [O_CustomerKey] BIGINT NULL,
        [O_OrderStatus] VARCHAR(1) NULL,
        [O_TotalPrice] DECIMAL(15, 2) NULL,
        [O_OrderDate] DATE NULL,
        [O_OrderPriority] VARCHAR(15) NULL,
        [O_Clerk] VARCHAR (15) NULL,
        [O_ShipPriority] INT NULL,
        [O_Comment] VARCHAR (79) NULL
    );
    
  2. T-SQL 스크립트 또는 애플리케이션 코드를 통해 테이블에 행을 삽입하거나 그렇지 않으면 함수를 NEWID() 사용하여 Row_ID 고유한 데이터를 생성합니다. 이 함수는 uniqueidentifier 형식의 고유 값을 생성하여 bigint캐스팅하고 저장할 수 있습니다.

    다음 코드는 테이블에 행을 삽입합니다 dbo.Orders_with_Identifier . 열의 Row_ID 값은 함수에서 반환된 값을 변환하여 계산됩니다 newid() . 함수에는 절이 ORDER BY 필요하지 않으며 각 레코드에 대한 새 값이 생성됩니다.

    --Insert new rows with unique identifiers
    INSERT INTO [dbo].[Orders_with_Identifier]
    SELECT
        CONVERT(BIGINT, CONVERT(VARBINARY, CONCAT(NEWID(), GETDATE()))) AS [Row_ID],
        [src].[O_OrderKey],
        [src].[O_CustomerKey],
        [src].[O_OrderStatus],
        [src].[O_TotalPrice],
        [src].[O_OrderDate],
        [src].[O_OrderPriority],
        [src].[O_Clerk],
        [src].[O_ShipPriority],
        [src].[O_Comment]
    FROM [dbo].[Orders] AS [src];
    

방법 2

이 메서드는 순차 ID 값을 만들어야 하는 경우에 가장 적합하지만 대체 메서드보다 느려질 수 있으므로 더 큰 데이터 세트에 주의해서 사용해야 합니다. 중복 값으로 이어질 수 있으므로 동시에 데이터를 삽입하는 여러 프로세스에 대해서도 고려해야 합니다.

  1. 이 메서드를 사용하여 고유한 데이터를 만들려면 고유 식별자 값을 저장하는 열을 포함하는 테이블을 만듭니다. 열 데이터 형식은 저장하려는 데이터의 양에 따라 int 또는 bigint로 설정해야 합니다. 또한 모든 행에 식별자가 할당되도록 열을 NOT NULL로 정의해야 합니다.

    다음 T-SQL 코드 샘플에서는 열이 고유 키 역할을 하는 스키마에 dbo 명명 Orders_with_IdentifierRow_ID 예제 테이블을 만듭니다.

    --Drop a table named 'Orders_with_Identifier' in schema 'dbo', if it exists
    IF OBJECT_ID('[dbo].[Orders_with_Identifier]', 'U') IS NOT NULL
        DROP TABLE [dbo].[Orders_with_Identifier];
    GO
    
    CREATE TABLE [dbo].[Orders_with_Identifier] (
        [Row_ID] BIGINT NOT NULL,
        [O_OrderKey] BIGINT NULL,
        [O_CustomerKey] BIGINT NULL,
        [O_OrderStatus] VARCHAR(1) NULL,
        [O_TotalPrice] DECIMAL(15, 2) NULL,
        [O_OrderDate] DATE NULL,
        [O_OrderPriority] VARCHAR(15) NULL,
        [O_Clerk] VARCHAR (15) NULL,
        [O_ShipPriority] INT NULL,
        [O_Comment] VARCHAR (79) NULL
    );
    GO
    
  2. 테이블에 행을 삽입하기 전에 테이블에 저장된 마지막 식별자 값을 결정해야 합니다. 최대 식별자 값을 검색하여 이를 수행할 수 있습니다. 다음 단계에서 테이블 행을 삽입할 때 참조할 수 있도록 이 값을 변수에 할당해야 합니다.

    다음 코드는 마지막 식별자 값을 @MaxID라는 이름의 변수에 할당합니다.

    --Assign the last identifier value to a variable
    --If the table doesn't contain any rows, assign zero to the variable
    DECLARE @MaxID AS BIGINT;
    
    IF EXISTS(SELECT * FROM [dbo].[Orders_with_Identifier])
        SET @MaxID = (SELECT MAX([Row_ID]) FROM [dbo].[Orders_with_Identifier]);
    ELSE
        SET @MaxID = 0;
    
  3. 테이블에 행을 삽입하면 @MaxID 변수의 값을 ROW_NUMBER 함수에서 반환된 값 에 더하여 고유하고 순차적인 숫자가 계산됩니다. 이 함수는 .로 시작하는 순차 행 번호를 계산하는 창 함수입니다 1.

    2단계의 스크립트와 동일한 일괄 처리로 실행되는 다음 T-SQL 코드는 테이블에 행을 삽입합니다 Orders_with_Identifier . Row_ID 열의 값은 @MaxID 함수에서 반환된 값에 ROW_NUMBER 변수를 더하여 계산됩니다 . 함수에는 결과 집합 내 행의 논리적 순서를 정의하는 ORDER BY 절이 있어야 합니다. 그러나 로 SELECT NULL설정하면 논리적 순서가 부과되지 않으므로 식별자 값이 임의로 할당됩니다. 이 ORDER BY 절을 적용하면 실행 시간이 빨라집니다.

    --Insert new rows with unique identifiers
    INSERT INTO [dbo].[Orders_with_Identifier]
    SELECT
        @MaxID + ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS [Row_ID],
        [src].[O_OrderKey],
        [src].[O_CustomerKey],
        [src].[O_OrderStatus],
        [src].[O_TotalPrice],
        [src].[O_OrderDate],
        [src].[O_OrderPriority],
        [src].[O_Clerk],
        [src].[O_ShipPriority],
        [src].[O_Comment]
    FROM [dbo].[Orders] AS [src];