TRUNCATE

테이블에서 모든 행을 제거하려면 ' TRUNCATE ' 명령을 사용합니다. 이 명령은 삭제 명령과 동일한 효과가 있지만 큰 테이블의 경우 ' DELETE ' 명령보다 빠릅니다.

트랜잭션 또는 저장 프로시저 내에서 ' TRUNCATE '을 사용하여 하나의 원자 단위로 데이터에 다른 관련 변경을 수행할 수 있습니다. 이런 식으로 ' TRUNCATE '을 사용하는 경우:
  • 잘라내는 트랜잭션은 롤백할 수 있으며, 이 경우 테이블 저장소와 콘텐츠는 그대로 유지됩니다.
  • 테이블은 잠겨 있으며, 잘라내기 트랜잭션이 커밋되거나 롤백될 때까지 다른 세션이나 트랜잭션에서 테이블에 대한 동시 액세스(' 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로 설정할 수 있습니다. 이 설정을 사용하면 시스템이 항상 테이블 통계를 유지할 수 있습니다. 이에 따라 새 행이 테이블에 삽입되면서 시간에 따라 증가되며 실행 시간이 보다 길어지는 쿼리 추정 문제점을 유발할 수 있습니다. 기본 작동을 변경하려면 다음을 수행하십시오.

  1. Nz 사용자 계정으로 NPS 시스템에 로그인합니다.
  2. 텍스트 편집기를 사용하여 /nz/data/postgresql.conf 파일을 여십시오. postgresql.conf를 편집할 때는 주의가 필요합니다. 여기에는 Netezza Performance Server 시스템 작동을 위한 중요한 구성 매개변수가 포함되어 있습니다.
  3. 파일에서 concurrent_truncate_zero_stats 정의를 확인하여 아직 하나도 존재하지 않음 및/또는 주석 처리됨을 확인하십시오. 항목을 찾으면 concurrent_truncate_zero_stats=false인지 및 주석 처리되지 않았는지 확인하십시오. 항목을 찾지 못하면 파일에 concurrent_truncate_zero_stats=false를 추가하십시오.
  4. postgresql.conf 파일을 저장한 후 닫으십시오.
  5. ' nzstop ' 및 ' nzstart ' 명령을 사용하여 NPS 소프트웨어를 중지했다가 다시 시작합니다.

' set concurrent_truncate_zero_stats to <value> ' 명령을 사용하여 개별 NPS 데이터베이스 세션에서 동시_절단_제로_통계 변수를 설정(또는 재설정)할 수도 있습니다. 예를 들어, 서로 다른 테이블에 대해 서로 다른 동작을 가져오기 위해 세션 레벨에서 변수를 설정할 수 있습니다. 동일 테이블에서 자르는 서로 다른 세션은 이 변수가 일관성 있는 동작을 가져올 수 있도록 일관성 있는 설정을 사용해야 합니다.

참고: 반복적으로 잘리고 다시 로드되는 테이블에서 ' GENERATE STATISTICS '을 사용하는 것과 관련하여 다음과 같은 관행이 있습니다:
  • ' 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>

입력

TRUNCATE 명령의 입력은 다음과 같습니다.
표 1. TRUNCATE 입력
입력 설명
<name> 자르기를 수행할 테이블의 이름입니다.

출력

TRUNCATE 명령의 출력은 다음과 같습니다.
테이블 2. TRUNCATE 출력
출력 설명
TRUNCATE TABLE 명령에 성공했습니다.

특권

관리 사용자, 테이블 소유자, 데이터베이스 또는 스키마의 소유자이거나, 계정에 테이블 또는 테이블 오브젝트 클래스에 대한 자르기 특권이 있어야 합니다.

사용량

샘플 사용법은 다음과 같습니다.
  • bigtable 테이블에서 모든 행을 제거합니다.
    MYDB.SCH1(USER)=> TRUNCATE  bigtable;
  • mytable 테이블의 컨텐츠를 새 데이터로 대체합니다.
    BEGIN;
    TRUNCATE TABLE mytable;
    INSERT INTO mytable SELECT …;
    COMMIT;