TRUNCATE TABLE(Transact-SQL)TRUNCATE TABLE (Transact-SQL)

적용 대상:Applies to: 예SQL ServerSQL Server(지원되는 모든 버전)yesSQL ServerSQL Server (all supported versions) 예Azure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database 예Azure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance 예Azure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics 예병렬 데이터 웨어하우스Parallel Data Warehouseyes병렬 데이터 웨어하우스Parallel Data Warehouse적용 대상:Applies to: 예SQL ServerSQL Server(지원되는 모든 버전)yesSQL ServerSQL Server (all supported versions) 예Azure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database 예Azure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance 예Azure Synapse AnalyticsAzure Synapse AnalyticsyesAzure Synapse AnalyticsAzure Synapse Analytics 예병렬 데이터 웨어하우스Parallel Data Warehouseyes병렬 데이터 웨어하우스Parallel Data Warehouse

개별 행 삭제를 로깅하지 않고 테이블 또는 테이블의 지정된 파티션에서 모든 행을 제거합니다.Removes all rows from a table or specified partitions of a table, without logging the individual row deletions. TRUNCATE TABLE은 기능상으로 WHERE 절이 없는 DELETE 문과 동일하지만 더 빠르고 시스템 및 트랜잭션 로그 리소스를 덜 사용합니다.TRUNCATE TABLE is similar to the DELETE statement with no WHERE clause; however, TRUNCATE TABLE is faster and uses fewer system and transaction log resources.

항목 링크 아이콘 Transact-SQL 구문 표기 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

-- Syntax for SQL Server and Azure SQL Database  
  
TRUNCATE TABLE   
    { database_name.schema_name.table_name | schema_name.table_name | table_name }  
    [ WITH ( PARTITIONS ( { <partition_number_expression> | <range> }   
    [ , ...n ] ) ) ]  
[ ; ]  
  
<range> ::=  
<partition_number_expression> TO <partition_number_expression>  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
TRUNCATE TABLE { database_name.schema_name.table_name | schema_name.table_name | table_name }  
[;]  

참고

SQL Server 2014 이전 버전의 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조하세요.To view Transact-SQL syntax for SQL Server 2014 and earlier, see Previous versions documentation.

인수Arguments

database_namedatabase_name
데이터베이스의 이름입니다.Is the name of the database.

schema_nameschema_name
테이블이 속한 스키마의 이름입니다.Is the name of the schema to which the table belongs.

table_nametable_name
잘라내거나 모든 행을 제거할 테이블의 이름입니다.Is the name of the table to truncate or from which all rows are removed. table_name은 리터럴이어야 합니다.table_name must be a literal. table_nameOBJECT_ID() 함수 또는 변수일 수 없습니다.table_name cannot be the OBJECT_ID() function or a variable.

WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) )WITH ( PARTITIONS ( { <partition_number_expression> | <range> } [ , ...n ] ) )
적용 대상: SQL ServerSQL Server (SQL Server 2016(13.x)SQL Server 2016 (13.x) ~ 현재 버전)Applies to: SQL ServerSQL Server ( SQL Server 2016(13.x)SQL Server 2016 (13.x) through current version)

자를 파티션이나 모든 행이 제거되는 파티션을 지정합니다.Specifies the partitions to truncate or from which all rows are removed. 테이블이 분할되지 않은 경우 WITH PARTITIONS 인수를 사용하면 오류가 발생합니다.If the table is not partitioned, the WITH PARTITIONS argument will generate an error. WITH PARTITIONS 절을 지정하지 않으면 전체 테이블이 잘립니다.If the WITH PARTITIONS clause is not provided, the entire table will be truncated.

<partition_number_expression> 은 다음과 같은 방법으로 지정할 수 있습니다.<partition_number_expression> can be specified in the following ways:

  • 파티션의 번호를 지정합니다. 예: WITH (PARTITIONS (2))Provide the number of a partition, for example: WITH (PARTITIONS (2))

  • 여러 개별 파티션의 파티션 번호를 쉼표로 구분하여 지정합니다. 예: WITH (PARTITIONS (1, 5))Provide the partition numbers for several individual partitions separated by commas, for example: WITH (PARTITIONS (1, 5))

  • 범위와 개별 파티션을 모두 지정합니다. 예: WITH (PARTITIONS (2, 4, 6 TO 8))Provide both ranges and individual partitions, for example: WITH (PARTITIONS (2, 4, 6 TO 8))

  • <range>TO라는 단어로 구분된 파티션 번호로 지정할 수 있습니다. 예: WITH (PARTITIONS (6 TO 8))<range> can be specified as partition numbers separated by the word TO, for example: WITH (PARTITIONS (6 TO 8))

분할된 테이블을 자르려면 테이블과 인덱스를 정렬해야 합니다(동일한 파티션 함수에 분할).To truncate a partitioned table, the table and indexes must be aligned (partitioned on the same partition function).

설명Remarks

DELETE 문과 비교하여 TRUNCATE TABLE에는 다음과 같은 이점이 있습니다.Compared to the DELETE statement, TRUNCATE TABLE has the following advantages:

  • 트랜잭션 로그 공간을 덜 사용합니다.Less transaction log space is used.

    DELETE 문은 행을 한번에 하나씩 제거하고 삭제된 각 행에 대해 트랜잭션 로그에 항목을 기록합니다.The DELETE statement removes rows one at a time and records an entry in the transaction log for each deleted row. 반면 TRUNCATE TABLE은 테이블의 데이터를 저장하는 데 사용되는 데이터 페이지의 할당을 취소하는 방식으로 데이터를 제거하며 페이지 할당 취소만을 트랜잭션 로그에 기록합니다.TRUNCATE TABLE removes the data by deallocating the data pages used to store the table data and records only the page deallocations in the transaction log.

  • 일반적으로 적은 수의 잠금이 사용됩니다.Fewer locks are typically used.

    행 잠금을 사용하여 DELETE 문을 실행하면 삭제를 위해 테이블의 각 행이 잠깁니다.When the DELETE statement is executed using a row lock, each row in the table is locked for deletion. TRUNCATE TABLE은 항상 테이블(스키마(SCH-M) 잠금 포함)과 페이지를 잠그지만 각 행은 잠그지 않습니다.TRUNCATE TABLE always locks the table (including a schema (SCH-M) lock) and page but not each row.

  • 빈 페이지는 예외 없이 테이블에 남습니다.Without exception, zero pages are left in the table.

    DELETE 문이 실행된 후에도 테이블은 계속 빈 페이지를 포함할 수 있습니다.After a DELETE statement is executed, the table can still contain empty pages. 예를 들어, 힙의 빈 페이지는 최소한 배타적인(LCK_M_X) 테이블 잠금이 있어야만 할당 취소할 수 있으므로For example, empty pages in a heap cannot be deallocated without at least an exclusive (LCK_M_X) table lock. 삭제를 위해 테이블 잠금을 사용하지 않는 경우 테이블(힙)에는 빈 페이지가 많이 남게 됩니다.If the delete operation does not use a table lock, the table (heap) will contain many empty pages. 인덱스의 경우도 삭제 작업 후에 빈 페이지가 남을 수 있지만 이러한 페이지는 백그라운드 정리 프로세스에 의해 신속하게 할당 취소됩니다.For indexes, the delete operation can leave empty pages behind, although these pages will be deallocated quickly by a background cleanup process.

TRUNCATE TABLE은 테이블에서 모든 행을 제거하지만 테이블 구조와 테이블의 열, 제약 조건, 인덱스 등은 그대로 남습니다.TRUNCATE TABLE removes all rows from a table, but the table structure and its columns, constraints, indexes, and so on remain. 테이블 정의 및 테이블의 데이터를 제거하려면 DROP TABLE 문을 사용하세요.To remove the table definition in addition to its data, use the DROP TABLE statement.

테이블에 ID 열이 포함되어 있으면 해당 열의 카운터는 열에 대한 초기값으로 다시 설정됩니다.If the table contains an identity column, the counter for that column is reset to the seed value defined for the column. 초기값이 정의되어 있지 않으면 기본값인 1이 사용됩니다.If no seed was defined, the default value 1 is used. ID 카운터를 보존하려면 DELETE를 대신 사용하세요.To retain the identity counter, use DELETE instead.

참고

TRUNCATE TABLE 작업은 롤백할 수 있습니다.A TRUNCATE TABLE operation can be rolled back.

제한Restrictions

다음과 같은 테이블에서는 TRUNCATE TABLE 문을 사용할 수 없습니다.You cannot use TRUNCATE TABLE on tables that:

  • FOREIGN KEY 제약 조건에 의해 참조됩니다.Are referenced by a FOREIGN KEY constraint. 자신을 참조하는 외래 키가 있는 테이블을 잘라낼 수 있습니다.You can truncate a table that has a foreign key that references itself.

  • 인덱싱된 뷰에 참여합니다.Participate in an indexed view.

  • 트랜잭션 복제 또는 병합 복제에 의해 게시됩니다.Are published by using transactional replication or merge replication.

  • 시스템 버전 임시 테이블입니다.Are system-versioned temporal.

  • EDGE 제약 조건에 의해 참조됩니다.Are referenced by an EDGE constraint.

이런 특징을 한 개 이상 갖고 있는 테이블의 경우 DELETE 문을 대신 사용하세요.For tables with one or more of these characteristics, use the DELETE statement instead.

TRUNCATE TABLE은 개별 행 삭제를 기록하지 않기 때문에 트리거를 실행할 수 없습니다.TRUNCATE TABLE cannot activate a trigger because the operation does not log individual row deletions. 자세한 내용은 CREATE TRIGGER(Transact-SQL)를 참조하세요.For more information, see CREATE TRIGGER (Transact-SQL).

Azure Synapse Analytics(SQL Data Warehouse)Azure Synapse Analytics (SQL Data Warehouse)병렬 데이터 웨어하우스Parallel Data Warehouse의 경우:In Azure Synapse Analytics(SQL Data Warehouse)Azure Synapse Analytics (SQL Data Warehouse) and 병렬 데이터 웨어하우스Parallel Data Warehouse:

  • TRUNCATE TABLE은 EXPLAIN 문 내에 허용되지 않습니다.TRUNCATE TABLE is not allowed within the EXPLAIN statement.

  • TRUNCATE TABLE은 트랜잭션 내부에서 실행할 수 없습니다.TRUNCATE TABLE cannot be ran inside of a transaction.

대형 테이블 잘라내기Truncating Large Tables

MicrosoftMicrosoft SQL ServerSQL Server에는 삭제할 모든 익스텐트에 대한 동시 잠금이 없는 한 128개를 초과하는 익스텐트를 갖고 있는 테이블을 삭제하거나 잘라내는 기능이 추가되었습니다.SQL ServerSQL Server has the ability to drop or truncate tables that have more than 128 extents without holding simultaneous locks on all the extents required for the drop.

사용 권한Permissions

최소한 table_name에 대한 ALTER 권한이 필요합니다.The minimum permission required is ALTER on table_name. TRUNCATE TABLE 권한은 기본적으로 테이블 소유자, sysadmin 고정 서버 역할의 멤버와 db_ownerdb_ddladmin 고정 데이터베이스 역할에 할당되며 이전할 수 없습니다.TRUNCATE TABLE permissions default to the table owner, members of the sysadmin fixed server role, and the db_owner and db_ddladmin fixed database roles, and are not transferable. 하지만 저장 프로시저와 같은 모듈 내에 TRUNCATE TABLE 문을 통합한 뒤 EXECUTE AS 절을 사용하여 적절한 권한을 모듈에 허용할 수 있습니다.However, you can incorporate the TRUNCATE TABLE statement within a module, such as a stored procedure, and grant appropriate permissions to the module using the EXECUTE AS clause.

예제Examples

A.A. 테이블 자르기Truncate a Table

다음 예에서는 JobCandidate 테이블의 모든 데이터를 제거합니다.The following example removes all data from the JobCandidate table. SELECT 문이 TRUNCATE TABLE 문 앞과 뒤에 포함되어 결과를 비교합니다.SELECT statements are included before and after the TRUNCATE TABLE statement to compare results.

USE AdventureWorks2012;  
GO  
SELECT COUNT(*) AS BeforeTruncateCount   
FROM HumanResources.JobCandidate;  
GO  
TRUNCATE TABLE HumanResources.JobCandidate;  
GO  
SELECT COUNT(*) AS AfterTruncateCount   
FROM HumanResources.JobCandidate;  
GO  

B.B. 테이블 파티션 자르기Truncate Table Partitions

적용 대상: SQL ServerSQL Server (SQL Server 2016(13.x)SQL Server 2016 (13.x) ~ 현재 버전)Applies to: SQL ServerSQL Server ( SQL Server 2016(13.x)SQL Server 2016 (13.x) through current version)

다음 예에서는 분할된 테이블의 지정된 파티션을 자릅니다.The following example truncates specified partitions of a partitioned table. WITH (PARTITIONS (2, 4, 6 TO 8)) 구문은 파티션 번호 2, 4, 6, 7, 8이 잘리도록 합니다.The WITH (PARTITIONS (2, 4, 6 TO 8)) syntax causes partition numbers 2, 4, 6, 7, and 8 to be truncated.

TRUNCATE TABLE PartitionTable1   
WITH (PARTITIONS (2, 4, 6 TO 8));  
GO  

참고 항목See Also

DELETE(Transact-SQL) DELETE (Transact-SQL)
DROP TABLE(Transact-SQL) DROP TABLE (Transact-SQL)
IDENTITY(속성)(Transact-SQL)IDENTITY (Property) (Transact-SQL)