SQL Server 데이터베이스 파티셔닝

25965 단어 sqlsqlserver

데이터베이스 테이블 파티셔닝이란 무엇입니까?



기본적으로 테이블의 데이터는 Primary라는 하나의 파일 그룹에 있습니다. 파티셔닝을 사용하면 큰 테이블을 데이터베이스의 둘 이상의 파일 그룹에 분산될 수 있는 단위로 나누고 테이블에서 대량의 데이터를 빠르게 로드 및 제거할 수 있는 방법을 제공할 수 있습니다. 더 작은 단위로 분할하면 검색할 데이터가 적기 때문에 데이터의 일부에만 액세스하는 쿼리가 더 빠르게 실행될 수 있습니다.

파티셔닝의 이점


  • 대형 테이블 유지보수 지원

  • 작업이 전체 테이블이 아닌 데이터의 하위 집합만을 대상으로 하기 때문에 유지 관리 작업을 신속하게 수행합니다.

    데이터 컬렉션의 무결성을 유지하면서 데이터 하위 집합을 빠르고 효율적으로 전송하거나 액세스할 수 있습니다.

    전.
    테이블에 데이터 로드(ETL)
  • 데이터를 읽고 로드하기 위한 전체 응답 시간 감소

  • 쿼리가 전체 테이블이 아닌 특정 파티션 또는 파티션만 검색할 수 있으므로 쿼리가 향상될 수 있습니다.

    파티션의 종류


  • 수직 파티션

  • 테이블은 열을 기준으로 여러 테이블로 나뉩니다.
  • 수평 파티션

  • 테이블은 행 수가 적은 동일한 수의 열을 가진 여러 개로 나뉩니다.

    SQL 서버에서 수평 분할을 만듭니다.


  • 테스트 DB 및 테스트 테이블 생성

  •    CREATE DATABASE PartitionTest
    
       GO
    
       USE PartitionTest
    
       CREATE TABLE Orders
           (
             OrderID INT IDENTITY NOT NULL,
             OrderDate DATETIME NOT NULL ,
             OrderMonth INT NOT NULL
           );
    
    

  • 파티션 함수 생성

  • 생성Partition function . 파티션 수를 정의합니다. 파티션을 만들고 채우기 위해 파티션 함수에서 사용할 테이블 또는 인덱스의 열( Partition Column )이 필요합니다. 분할 열의 각 값은 분할 값을 반환하는 분할 함수에 대한 입력입니다.

    분할 열(OrderMonth)

       CREATE PARTITION FUNCTION PartitionByMonth (INT)
       AS RANGE RIGHT
       FOR VALUES (202201, 202202, 202203);
    


  • 파일 그룹 생성

  •    --Create File Group
       ALTER DATABASE PartitionTest ADD FILEGROUP FGJan
       GO
       ALTER DATABASE PartitionTest ADD FILEGROUP FGFeb
       GO
       ALTER DATABASE PartitionTest ADD FILEGROUP FGMarch
       GO
    


  • 파일 그룹에 파일 추가

  •    --Create files and attach to File Group
       ALTER DATABASE PartitionTest
       ADD FILE
       (
         NAME = [File_Month_Jan],
         FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\File_Month_Jan.ndf',
           SIZE = 5 MB,
           MAXSIZE = UNLIMITED,
           FILEGROWTH = 10 MB
       ) TO FILEGROUP FGJan
    
       ALTER DATABASE PartitionTest
       ADD FILE
       (
         NAME = [File_Month_Feb],
         FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\File_Month_Feb.ndf',
           SIZE = 5 MB,
           MAXSIZE = UNLIMITED,
           FILEGROWTH = 10 MB
       ) TO FILEGROUP FGFeb
    
       ALTER DATABASE PartitionTest
       ADD FILE
       (
         NAME = [File_Month_March],
         FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\File_Month_March.ndf',
           SIZE = 5 MB,
           MAXSIZE = UNLIMITED,
           FILEGROWTH = 10 MB
       ) TO FILEGROUP FGMarch
    


  • 파티션 구성표 생성

  •    --Create the partition scheme
       CREATE PARTITION SCHEME OrdersPS
        AS PARTITION PartitionByMonth
        TO ([Primary], FGJan, FGFeb, FGMarch);
    


    여기에서 기본 기본 파일 그룹을 포함한 모든 파일 그룹을 언급해야 합니다.

    사용 가능한 파일 그룹을 가져오기 위한 쿼리

       SELECT name AS AvailableFilegroups
         FROM sys.filegroups
         WHERE type = 'FG'
    


  • 파티셔닝을 사용하여 테이블 생성/업데이트

  •    --Create Index
       CREATE CLUSTERED INDEX IX_Orders ON [dbo]. [Orders]
       (
          [OrderMonth]
       )WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON OrdersPS(OrderMonth)
    


  • 행 개수로 파티션 확인

  •    SELECT p.partition_number AS PartitionNumber,
              f.name             AS PartitionFilegroup,
              p.rows             AS NumberOfRows
       FROM sys.partitions p
                JOIN sys.destination_data_spaces dds ON p.partition_number = dds.destination_id
                JOIN sys.filegroups f ON dds.data_space_id = f.data_space_id
       WHERE OBJECT_NAME(OBJECT_ID) = 'Orders'
    


    | 파티션 파일 그룹 | 파티션 번호 | NumberOfRows |
    | ------------------ | --------------- | ------------ |
    | 기본 | 1 | 0 |
    | FG1월 | 2 | 0 |
    | FGFeb | 3 | 0 |
    | FGMarch | 4 | 0 |

    테스트 데이터 삽입

       INSERT INTO PartitionTest.dbo.Orders (OrderDate, OrderMonth)
       VALUES (N'2022-01-18 17:25:05.000', 202201);
    
       INSERT INTO PartitionTest.dbo.Orders (OrderDate, OrderMonth)
       VALUES (N'2022-02-18 17:25:39.000', 202202);
    
       INSERT INTO PartitionTest.dbo.Orders (OrderDate, OrderMonth)
       VALUES (N'2022-03-18 17:25:58.000', 202203);
    


    행이 각 파일 그룹에 분산되어 있는 것을 볼 수 있습니다.

    | 파티션 파일 그룹 | 파티션 번호 | NumberOfRows |
    | ------------------ | --------------- | ------------ |
    | 기본 | 1 | 0 |
    | FG1월 | 2 | 1 |
    | FGFeb | 3 | 1 |
    | FGMarch | 4 | 1 |

    쿼리 완료




    CREATE DATABASE PartitionTest
    
    GO
    
    USE PartitionTest
    
    CREATE TABLE Orders
    (
        OrderID    INT IDENTITY NOT NULL,
        OrderDate  DATETIME     NOT NULL,
        OrderMonth INT          NOT NULL
    );
    
    CREATE PARTITION FUNCTION PartitionByMonth (INT)
        AS RANGE RIGHT
        FOR VALUES (202201, 202202, 202203);
    
    --Create File Group
    ALTER DATABASE PartitionTest ADD FILEGROUP FGJan
    GO
    ALTER DATABASE PartitionTest ADD FILEGROUP FGFeb
    GO
    ALTER DATABASE PartitionTest ADD FILEGROUP FGMarch
    GO
    --Create files and attach to File Group
    ALTER DATABASE PartitionTest
        ADD FILE
            (
                NAME = [File_Month_Jan],
                FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\File_Month_Jan.ndf',
                SIZE = 5 MB,
                MAXSIZE = UNLIMITED,
                FILEGROWTH = 10 MB
                ) TO FILEGROUP FGJan
    
    ALTER DATABASE PartitionTest
        ADD FILE
            (
                NAME = [File_Month_Feb],
                FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\File_Month_Feb.ndf',
                SIZE = 5 MB,
                MAXSIZE = UNLIMITED,
                FILEGROWTH = 10 MB
                ) TO FILEGROUP FGFeb
    
    ALTER DATABASE PartitionTest
        ADD FILE
            (
                NAME = [File_Month_March],
                FILENAME = 'C:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\File_Month_March.ndf',
                SIZE = 5 MB,
                MAXSIZE = UNLIMITED,
                FILEGROWTH = 10 MB
                ) TO FILEGROUP FGMarch
    
    GO
    
    --Create the partition scheme
    CREATE PARTITION SCHEME OrdersPS
        AS PARTITION PartitionByMonth
        TO ([Primary],FGJan, FGFeb, FGMarch);
    
    --Create Index
    CREATE CLUSTERED INDEX IX_Orders ON [dbo].[Orders]
        (
         [OrderMonth]
            ) WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF) ON OrdersPS(OrderMonth)
    
    -- Insert Test Data
    INSERT INTO PartitionTest.dbo.Orders (OrderDate, OrderMonth)
    VALUES (N'2022-01-18 17:25:05.000', 202201);
    
    INSERT INTO PartitionTest.dbo.Orders (OrderDate, OrderMonth)
    VALUES (N'2022-02-18 17:25:39.000', 202202);
    
    INSERT INTO PartitionTest.dbo.Orders (OrderDate, OrderMonth)
    VALUES (N'2022-03-18 17:25:58.000', 202203);
    
    -- View File Groups
    SELECT name AS AvailableFilegroups
    FROM sys.filegroups
    WHERE type = 'FG'
    
    -- View Row counts of Partitions
    SELECT p.partition_number AS PartitionNumber,
           f.name             AS PartitionFilegroup,
           p.rows             AS NumberOfRows
    FROM sys.partitions p
             JOIN sys.destination_data_spaces dds ON p.partition_number = dds.destination_id
             JOIN sys.filegroups f ON dds.data_space_id = f.data_space_id
    WHERE OBJECT_NAME(OBJECT_ID) = 'Orders'
    


    참조


  • https://www.brentozar.com/sql/table-partitioning-resources/
  • https://www.sqlshack.com/database-table-partitioning-sql-server/
  • https://docs.microsoft.com/en-us/sql/relational-databases/partitions/partitioned-tables-and-indexes?view=sql-server-ver15
  • 좋은 웹페이지 즐겨찾기