PostgreSQL에서 수집해야 할 vacuum 테이블 정보를 찾는 방법

앞말


일반적으로 PostgreSQL에서는 항상 테이블에 대한 업데이트와 DELETE가 필요하기 때문에 시계에 조각 공간이 생긴다.
PostgreSQL에서 VACUM을 사용하면 VACUM 테이블을 실행해야 하는 경우에만 삭제된 공간을 사용하지 않은 것으로 표시하여 나중에 이 공간을 다시 사용할 수 있지만 사용 공간을 운영 체제에 즉시 반환할 수 없기 때문에 VACUM FULL을 사용해야 공간을 확보하고 운영 체제에 즉시 반환할 수 있습니다.

구현 스크립트


레코드 수집 테이블 작성


CREATE TABLE IF NOT EXISTS tab_vacuum_record
(sqltext text);

수집에 필요한 VACUM 테이블 함수


CREATE OR REPLACE FUNCTION f_vacuum_tables()
RETURNS void AS
$FUNCTION$
 DECLARE
 v_tablename text;
 v_dead_cond bigint;
 v_sql    text;
 cur_tablename REFCURSOR;
 v_vacuum_record text;
 BEGIN
 v_vacuum_record := 'tab_vacuum_record';
 OPEN cur_tablename FOR SELECT tablename FROM pg_tables WHERE tablename !~ '^pg|^sql';
 LOOP
  FETCH cur_tablename INTO v_tablename;
   SELECT n_dead_tup INTO v_dead_cond FROM pg_stat_user_tables WHERE relname = v_tablename;
     IF v_dead_cond > 0 THEN
      v_sql := 'INSERT INTO ' || v_vacuum_record || ' VALUES(' || chr(39) ||'VACUUM FULL ' || v_tablename ||';'|| chr(39) ||')';
    EXECUTE v_sql;
     END IF;
   EXIT WHEN NOT FOUND;
 END LOOP;
 CLOSE cur_tablename;
 END;
$FUNCTION$
LANGUAGE PLPGSQL;

SHELL 스크립트


#!/bin/bash
# 
CURRDIR=$(cd "$(dirname $0)";pwd)
TOPDIR=$(cd $CURRDIR/..;pwd)
CONFIG=$TOPDIR/conf/host.ini
CT_FILE=${TOPDIR}/sql/CREATE_VACCUM_TABLE_RECORD.sql
CT_FUNCTION=${TOPDIR}/sql/CHECK_NEEDS_VACUUM_TABLE_FUNCTION.sql
source $CONFIG
CONNINFO="psql -U $USER -d $DBNAME -h $HOSTADDR -p $PORT"
function check_status()
{
    echo "  !"
    stat=`$CONNINFO -Aqt -c 'SELECT 1'`
    if [ "${stat}" == "1" ];then
        echo " "
    else
        echo " , "
        exit -1;
    fi
}
function create_table()
{
    echo " vacuum "
    $CONNINFO -f $CT_FILE
}
function create_function()
{
    echo "  vacuum  "
    $CONNINFO -f $CT_FUNCTION
}
check_status
create_table
create_function

실행 방식


postgres=# SELECT * FROM f_vacuum_tables();
 f_vacuum_tables 
-----------------
 
(1 row)
-- 
postgres=# CREATE TABLE tab_test(id int);
-- 
postgres=# INSERT INTO tab_test SELECT id FROM generate_series(1,100000) as id;
INSERT 0 100000
-- 
postgres=# DELETE FROM tab_Test WHERE id <= 10000;
DELETE 10002
postgres=# SELECT * FROM tab_vacuum_record ;
    sqltext    
-----------------------
 VACUUM FULL tab_test;
(1 row)
이 스크립트도 필요에 따라 수정할 수 있습니다. 상세히 보십시오github
보충: PostgreSQL의 Vacuum 약관
VACUUM doc

라우팅 정리


PostgreSQL은 정기적으로 청소를 유지해야 합니다. 일반적으로 수호 프로세스가 자동으로 청소합니다. 우리는 파라미터 조정이 필요할 뿐입니다. 스크립트를 실행할 때 회수를 정리할 수 있습니다.

Vacuumming Basics


PG는 다음 이유로 각 테이블에 대해 Vacuum 명령을 실행해야 합니다.
1. 업데이트나 삭제를 통해 사용된 디스크 공간을 회수하고 재활용하기 위해
2. PG 조회 계획에 사용된 데이터 분석을 업데이트하기 위해
3. 읽기 전용 색인 스캔의 보이는 집합을 업데이트하기 위해
4. 트랜잭션 ID 또는 혼합 트랜잭션 ID로 인해 역사 데이터가 손실되지 않도록 합니다.
이러한 이유로 빈번한 VACUM 작업을 수행할 때 다음과 같이 규정됩니다.
표준 VACUM
재활용 시 운영 환경은 데이터베이스 라이브러리의 정상적인 사용(SELECT, INSERT, UPDATE, DELETE)에 영향을 주지 않으며, 정리 시 테이블 구조를 수정할 수 없음(ALTER TABLE) 권장 사항
VACUUM FULL
a. 대량의 공간을 회수할 수 있지만 표준 회수보다 느리다
b, 실행 시 자물쇠 시계 필요
VACUM을 실행하면 읽기 및 쓰기 성능이 저하되므로 일부 매개변수를 조정하여 영향을 줄여야 합니다.

temp_file_limit = -1 # -1 , kb
#max_files_per_process = 1000 # 
VACUM과 ANYLYZE를 실행하는 동안 시스템은 각종 I/O 작업에 소모되는 내부 카운터를 유지합니다. 이 값이 vacuum_에 도달하면cost_limit 값 시 프로세스가 휴면됩니다 vacuum_cost_delay가 지정한 시간을 재설정하고 카운터의 값을 재설정하여 VACUM 또는 ANYLYZE 작업을 계속합니다

vacuum_cost_limit = 200 
vacuum_cost_delay = 0 #  ,  0  
이 매개변수 vacuum_cost_delay는 병발 시 I/O의 영향을 낮추는 데 주로 사용되며, 10으로 추천합니다.

vacuum_cost_page_hit = 1 #  hash table   ` ` 
             # 
vacuum_cost_page_miss = 10   # 0-10000 credits
vacuum_cost_page_dirty = 20

NOTE


한 장의 표에 대량의 데이터가 포함되어 있을 때 삭제나 업데이트 작업을 동시에 진행할 때 VACUM은 가장 좋은 방안이 아니다.
이 경우 VACUU FULL을 사용해야 합니다. Alter TABLE을 실행할 때 다시 COPY 정렬됩니다.
새 데이터 COPY가 완료될 때까지 테이블과 인덱스를 재구성하여 잠금을 실행하고 원본 테이블 크기의 디스크 공간을 임시로 사용합니다.

업그레이드 실행 계획


실행 계획은 자체 또는 VACUM 호출 명령 analyze를 통해 통계를 수집합니다.
표현식 인덱스를 만들면 조회 실행 계획을 높일 수 있습니다

default_statistics_target = 100 #   
이상의 개인적인 경험으로 여러분께 참고가 되었으면 좋겠습니다. 또한 많은 응원 부탁드립니다.만약 잘못이 있거나 완전한 부분을 고려하지 않으신다면 아낌없이 가르침을 주시기 바랍니다.

좋은 웹페이지 즐겨찾기