파티션 함수 수정

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Transact-SQL을 사용하여 분할된 테이블 또는 인덱스의 파티션 함수에서 지정된 파티션 수를 1씩 추가하거나 빼서 SQL Server, Azure SQL Database 및 Azure SQL Managed Instance에서 테이블 또는 인덱스가 분할되는 방식을 변경할 수 있습니다. 파티션을 추가할 때 기존 파티션을 두 파티션으로 "분할"하고 새 파티션의 경계를 다시 정의하여 파티션을 추가합니다. 파티션을 삭제할 때 두 파티션의 경계를 하나로 "병합"하여 파티션을 삭제합니다. 이 마지막 작업은 하나의 파티션을 다시 채우고 다른 파티션은 할당되지 않은 상태로 둡니다. 파티션 함수를 수정하기 전에 모범 사례를 검토합니다.

주의

둘 이상의 테이블 또는 인덱스가 같은 파티션 함수를 사용할 수 있습니다. 파티션 함수를 수정할 때 단일 트랜잭션의 모든 함수에 영향을 미칩니다. 파티션 함수를 수정하기 전에 파티션 함수의 종속성을 확인합니다.

테이블 분할은 몇 가지 구문 차이와 함께 Azure Synapse Analytics의 전용 SQL 풀에서도 사용할 수 있습니다. 전용 SQL 풀분할 테이블에 대해 자세히 알아봅니다.

제한 사항

  • ALTER PARTITION FUNCTION은 하나의 파티션을 두 파티션으로 분할하거나 두 파티션을 하나로 병합하는 데만 사용할 수 있습니다. 10개의 파티션을 5개로 줄이는 것과 같이 테이블이나 인덱스가 분할되는 방식을 변경하려면 다음 옵션 중 하나를 사용합니다.

    • 원하는 파티션 함수를 사용하여 분할된 새 테이블을 만든 다음 INSERT INTO를 사용하여 이전 테이블의 데이터를 새 테이블에 삽입합니다. SELECT FROM Transact-SQL 문 또는 SSMS(SQL Server Management Studio)파티션 관리 마법사

    • 힙에 분할된 클러스터형 인덱 스 만들기

      참고

      분할된 클러스터형 인덱스를 삭제하면 힙이 분할됩니다.

    • DROP EXISTING = ON 절과 함께 Transact-SQL CREATE INDEX 문을 사용하여 기존 분할된 인덱스 삭제 및 다시 작성

    • ALTER PARTITION FUNCTION 문의 시퀀스를 수행합니다.

  • 데이터베이스 엔진은 파티션 함수를 수정하기 위한 복제 지원을 제공하지 않습니다. 게시 데이터베이스의 파티션 함수를 변경하려면 구독 데이터베이스에서 직접 파티션 함수를 수정해야 합니다.

  • ALTER PARTITION FUNCTION의 영향을 받는 모든 파일 그룹이 온라인 상태여야 합니다.

사용 권한

ALTER PARTITION FUNCTION을 실행하려면 다음 중 하나의 권한이 필요합니다.

  • ALTER ANY DATASPACE 권한. 이 권한은 기본적으로 sysadmin 고정 서버 역할 및 db_ownerdb_ddladmin 고정 데이터베이스 역할의 멤버에게 부여됩니다.

  • 파티션 함수가 생성된 데이터베이스에 대한 CONTROL 또는 ALTER 권한

  • 파티션 함수가 생성된 데이터베이스의 서버에 대한 CONTROL SERVER 또는 ALTER ANY DATABASE 권한

데이터베이스에서 분할된 개체 쿼리

다음 쿼리는 데이터베이스의 분할된 모든 개체를 나열합니다. 이를 사용하여 파티션 함수를 수정하기 전에 파티션 함수에 대한 종속성을 확인할 수 있습니다.

SELECT 
	PF.name AS PartitionFunction,
	ds.name AS PartitionScheme,
    OBJECT_SCHEMA_NAME(si.object_id) as SchemaName,
	OBJECT_NAME(si.object_id) AS PartitionedTable, 
	si.name as IndexName
FROM sys.indexes AS si
JOIN sys.data_spaces AS ds
	ON ds.data_space_id = si.data_space_id
JOIN sys.partition_schemes AS PS
	ON PS.data_space_id = si.data_space_id
JOIN sys.partition_functions AS PF
	ON PF.function_id = PS.function_id
WHERE ds.type = 'PS'
AND OBJECTPROPERTYEX(si.object_id, 'BaseType') = 'U'
ORDER BY PartitionFunction, PartitionScheme, SchemaName, PartitionedTable;

Transact-SQL을 사용하여 파티션 분할

  1. 개체 탐색기에서 대상 데이터베이스에 연결합니다.

  2. 표준 도구 모음에서 새 쿼리를 선택합니다.

  3. 다음 예제를 복사하여 쿼리 창에 붙여넣고 실행을 선택합니다.

    이 예제는 다음과 같이 작성되었습니다.

    • 파티션 함수의 이전 버전을 확인하고 파티션 함수 myRangePF1 가 발견되면 삭제합니다.
    • 테이블을 4개의 파티션으로 분할하는 파티션 함수를 myRangePF1 만듭니다.
    • 파티션을 boundary_values 100에서 1000 사이로 분할하여 boundary_values 100에서 500 사이의 파티션과 boundary_values 500에서 1000 사이의 파티션을 만듭니다.
    IF EXISTS (SELECT * FROM sys.partition_functions  
        WHERE name = 'myRangePF1')  
        DROP PARTITION FUNCTION myRangePF1;  
    GO
    
    CREATE PARTITION FUNCTION myRangePF1 (int)  
    AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );  
    GO  
    
    ALTER PARTITION FUNCTION myRangePF1 ()  
    SPLIT RANGE (500);  
    

Transact-SQL을 사용하여 두 파티션 병합

  1. 개체 탐색기에서 대상 데이터베이스에 연결합니다.

  2. 표준 도구 모음에서 새 쿼리를 선택합니다.

  3. 다음 예제를 복사하여 쿼리 창에 붙여넣고 실행을 선택합니다.

    이 예제는 다음과 같이 작성되었습니다.

    • 파티션 함수의 이전 버전이 있는지 확인하고, 파티션 함수 myRangePF1 가 발견되면 삭제합니다.
    • 세 개의 경계 값을 사용하여 호출 myRangePF1 되는 파티션 함수를 만들면 4개의 파티션이 생성됩니다.
    • boundary_values 1에서 100 사이의 파티션을 boundary_values 100에서 1,000 사이의 파티션과 병합합니다.
    • 이로 인해 파티션 함수 myRangePF1 는 1과 1,000의 두 경계 지점을 갖습니다.
    IF EXISTS (SELECT * FROM sys.partition_functions  
        WHERE name = 'myRangePF1')  
        DROP PARTITION FUNCTION myRangePF1;  
    GO 
    
    CREATE PARTITION FUNCTION myRangePF1 (int)  
    AS RANGE LEFT FOR VALUES ( 1, 100, 1000 );  
    GO  
    
    ALTER PARTITION FUNCTION myRangePF1 ()  
    MERGE RANGE (100);  
    

SSMS를 사용하여 파티션 함수 삭제

  1. 개체 탐색기에서 대상 데이터베이스에 연결합니다.

  2. 파티션 함수를 삭제할 데이터베이스를 확장한 다음 Storage 폴더를 확장합니다.

  3. Partition Functions 폴더를 확장합니다.

  4. 삭제할 파티션 함수를 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다.

  5. 개체 삭제 대화 상자에서 올바른 파티션 함수가 선택되어 있는지 확인하고 확인을 선택합니다.

다음 단계

다음 문서에서 관련 개념에 대해 자세히 알아보세요.