TRUNCATE
테이블에서 모든 행을 제거하려면 ' TRUNCATE ' 명령을 사용합니다. 이 명령은 삭제 명령과 동일한 효과가 있지만 큰 테이블의 경우 ' DELETE ' 명령보다 빠릅니다.
- 잘라내는 트랜잭션은 롤백할 수 있으며, 이 경우 테이블 저장소와 콘텐츠는 그대로 유지됩니다.
- 테이블은 잠겨 있으며, 잘라내기 트랜잭션이 커밋되거나 롤백될 때까지 다른 세션이나 트랜잭션에서 테이블에 대한 동시 액세스(' SELECT 명령 포함)는 허용되지 않습니다. 롤백은 ' ROLLBACK 명령 또는 트랜잭션의 실행 실패로 인해 발생할 수 있습니다.
- 자르기 트랜잭션이 기타 테이블에 액세스하는 경우, 교착 상태가 발생할 가능성이 높아집니다. 트랜잭션을 잘라내기 시작할 때 ' LOCK TABLE <tablename> IN ACCESS EXCLUSIVE MODE '을 발행하면 이 문제를 방지할 수 있습니다. 해당 명령 사용에 대한 지침은 테이블 잠그기를 참조하세요.
- TRUNCATE TABLE '은 ' DELETE FROM <table> '로 모든 행을 삭제하는 것보다 훨씬 빠르며 공간을 다시 확보하기 위해 후속 ' GROOM TABLE '이 필요하지 않습니다. 그러나 동일한 테이블을 수정하고 잘라내려는 동시 트랜잭션이 다음과 같은 메시지를 볼 수 있다는 작은 위험이 있습니다ERROR: Cannot truncate table because of concurrent insert or update. ' LOCK TABLE ' 명령을 사용하고 하나 이상의 테이블을 잘라내는 트랜잭션을 목표를 달성하는 데 필요한 시간보다 더 오래 활성화하지 않음으로써 위험을 최소화할 수 있습니다.
NPS는 잘린 테이블에 대한 동시 트랜잭션에서 ' SELECTs '을 지원합니다. 잘린 테이블의 디스크 저장소는 잘린 테이블이 커밋되기 전에 시작된 활성 동시 트랜잭션이 없는 경우에만 해제됩니다. 자르기가 커미트된 시점에 해당 동시 트랜잭션이 없는 경우, 커미트 이후 수 초가 지나면 스토리지가 해제됩니다. ' TRUNCATE 커밋 이전에 시작된 오픈 트랜잭션은 ' TRUNCATE' 이전부터 테이블의 행을 계속 볼 수 있습니다.
잘리는 테이블을 수정하는 ' SELECT ' 이외의 작업은 잘리는 트랜잭션이 커밋되거나 롤백될 때까지 기다려야 합니다.
시스템에 잘린 테이블에 대해 선택하는 동시 세션이 자주 있는 경우 ' TRUNCATE ' 명령은 테이블 행 수 통계를 0으로 재설정합니다. 재설정은 테이블의 신규, 후속 쿼리에 대한 플랜 추정의 장점이 있습니다. ' TRUNCATE '의 행 수 통계를 재설정하면 동시 트랜잭션의 기존 쿼리에 영향을 줄 수 있습니다. 새 행 수 통계가 ' TRUNCATE 이전의 행 수와 매우 다른 경우, 이전 쿼리에 대한 플래너의 부정확한 추정치로 인해 동시 쿼리를 실행하는 데 시간이 더 오래 걸릴 수 있습니다.
인플라이트 쿼리에 도움이 되도록 테이블 통계를 그대로 유지하려는 경우 ' TRUNCATE 이전부터 테이블의 테이블 통계와 행 수를 유지하도록 시스템을 구성할 수 있습니다. 통계를 유지하기 위해 데이터베이스 변수 concurrent_truncate_zero_stats를 false로 설정할 수 있습니다. 이 설정을 사용하면 시스템이 항상 테이블 통계를 유지할 수 있습니다. 이에 따라 새 행이 테이블에 삽입되면서 시간에 따라 증가되며 실행 시간이 보다 길어지는 쿼리 추정 문제점을 유발할 수 있습니다. 기본 작동을 변경하려면 다음을 수행하십시오.
- Nz 사용자 계정으로 NPS 시스템에 로그인합니다.
- 텍스트 편집기를 사용하여 /nz/data/postgresql.conf 파일을 여십시오. postgresql.conf를 편집할 때는 주의가 필요합니다. 여기에는 Netezza Performance Server 시스템 작동을 위한 중요한 구성 매개변수가 포함되어 있습니다.
- 파일에서 concurrent_truncate_zero_stats 정의를 확인하여 아직 하나도 존재하지 않음 및/또는 주석 처리됨을 확인하십시오. 항목을 찾으면 concurrent_truncate_zero_stats=false인지 및 주석 처리되지 않았는지 확인하십시오. 항목을 찾지 못하면 파일에 concurrent_truncate_zero_stats=false를 추가하십시오.
- postgresql.conf 파일을 저장한 후 닫으십시오.
- ' nzstop ' 및 ' nzstart ' 명령을 사용하여 NPS 소프트웨어를 중지했다가 다시 시작합니다.
' set concurrent_truncate_zero_stats to <value> ' 명령을 사용하여 개별 NPS 데이터베이스 세션에서 동시_절단_제로_통계 변수를 설정(또는 재설정)할 수도 있습니다. 예를 들어, 서로 다른 테이블에 대해 서로 다른 동작을 가져오기 위해 세션 레벨에서 변수를 설정할 수 있습니다. 동일 테이블에서 자르는 서로 다른 세션은 이 변수가 일관성 있는 동작을 가져올 수 있도록 일관성 있는 설정을 사용해야 합니다.
- ' TRUNCATE ' 뒤에 ' GENERATE STATISTICS '을 추가하지 마세요(' TRUNCATE ' 커밋을 호출하는 트랜잭션 뒤에).
- 쿼리하기 전에 데이터를 다시 로드한 후 ' GENERATE STATISTICS '을 실행하는 것이 이상적입니다. concurrent_truncate_zero_stats가 false로 설정된 경우 이는 특히 중요합니다. 또한 일부 통계(예: 열 값 "분산")는 로드 중에 자동으로 수집되지 않으므로 대규모 성능 서버 테이블의 경우 일반적으로 이 방법을 사용하는 것이 좋습니다.
- 현재 다시 로드할 때마다 ' GENERATE STATISTICS '이 실행되고 있지 않고 기존 워크플로우를 변경하여 명령을 추가하기가 너무 어려운 경우 concurrent_truncate_zero_stats가 거짓인 경우 백그라운드 작업에서 주기적으로 ' GENERATE STATISTICS '를 실행해야 합니다. 마지막 ' GENERATE STATISTICS 이후 4~5회 이상 잘림 및 재로드가 발생하지 않도록 작업 빈도를 선택합니다.
구문
TRUNCATE [ TABLE ] <name>입력
| 입력 | 설명 |
|---|---|
| <name> | 자르기를 수행할 테이블의 이름입니다. |
출력
| 출력 | 설명 |
|---|---|
| TRUNCATE TABLE | 명령에 성공했습니다. |
특권
관리 사용자, 테이블 소유자, 데이터베이스 또는 스키마의 소유자이거나, 계정에 테이블 또는 테이블 오브젝트 클래스에 대한 자르기 특권이 있어야 합니다.
사용량
bigtable테이블에서 모든 행을 제거합니다.MYDB.SCH1(USER)=> TRUNCATE bigtable;mytable테이블의 컨텐츠를 새 데이터로 대체합니다.BEGIN; TRUNCATE TABLE mytable; INSERT INTO mytable SELECT …; COMMIT;