1. 程式人生 > 實用技巧 >004.PGSQL-髒資料清理,頻繁delete\update高水位線問題,vacuum full 、vacuum

004.PGSQL-髒資料清理,頻繁delete\update高水位線問題,vacuum full 、vacuum

查看錶大小

-- 查出所有表(包含索引)並排序
-- 查出所有表(包含索引)並排序
SELECT table_schema , table_name AS table_full_name, pg_size_pretty(pg_total_relation_size('"' || table_schema || '"."' || table_name || '"')) AS size
FROM information_schema.tables 
where table_schema ='ioc_dm' and table_name ='m_ss_index_event' ORDER BY
pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC

vacuum full 之前 1386MB

檢視資料量105466

vacuum full之後 74MB

方法2 :建立臨時表儲存資料,並truncate 源表已解決高水位線問題

建立測試表

CREATE SEQUENCE "ioc_dw_second"."test0001_seq" 
INCREMENT 1
MINVALUE  1
MAXVALUE 9223372036854775807
START 1
CACHE 1
CYCLE ; CREATE TABLE "ioc_dw_second"."test0001" ( "rid" int4 NOT NULL DEFAULT nextval('"ioc_dw_second".test0001_seq'::regclass), "name" varchar(20) COLLATE "pg_catalog"."default", "update_time" timestamp(6) DEFAULT pg_systimestamp(), CONSTRAINT "test0001_pkey" PRIMARY KEY ("rid") ) ;

建立儲存過程,插入測試資料 --- while loop迴圈 declare 變數定義

CREATE OR REPLACE FUNCTION "ioc_dw_second"."proc_test0001"(IN "functime" varchar, OUT "v_rowline" varchar, OUT "v_retcode" varchar, OUT "v_retinfo" varchar)
  RETURNS "pg_catalog"."record" AS $BODY$
    
declare cou int;

BEGIN


cou := 0;

while cou< 1000000 LOOP
        insert into ioc_dw_second.test0001
         (
        name
        ) values
        ('new'),
        ('new'),
        ('new'),
        ('new'),
        ('new'),
        ('new');
        
        cou := cou +1;

END LOOP ;


END

$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100

調取儲存過程

call ioc_dw_second.proc_test0001(null,null,null,null);

資料大小

重複刪除、插入資料 資料大小

vacuum \vacuum full 原理

VACUUM
功能描述VACUUM回收表或B-Tree索引中已經刪除的行所佔據的儲存空間。在一般的資料庫操作裡,那些已經DELETE的行並沒有從它們所屬的表中物理刪除;在完成VACUUM之前它們仍然存在。因此有必要週期地執行VACUUM,特別是在經常更新的表上。

如果沒有引數,VACUUM處理當前資料庫裡使用者擁有相應許可權的每個表。如果引數指定了一個表,VACUUM只處理指定的那個表。

VACUUM ANALYZE先執行一個VACUUM操作,然後給每個選定的表執行一個ANALYZE。對於日常維護指令碼而言,這是一個很方便的組合。

簡單的VACUUM(不帶FULL選項)只是簡單地回收空間並且令其可以再次使用。這種形式的命令可以和對錶的普通讀寫併發操作,因為沒有請求排他鎖。VACUUM FULL執行更廣泛的處理,包括跨塊移動行,以便把表壓縮到最少的磁碟塊數目裡。這種形式要慢許多並且在處理的時候需要在表上施加一個排他鎖。

注意事項要對一個表進行VACUUM操作,通常使用者必須是表的所有者或系統管理員。資料庫的所有者允許對資料庫中除了共享目錄以外的所有表進行VACUUM操作(該限制意味著只有系統管理員才能真正對一個數據庫進行VACUUM操作)。VACUUM命令會跳過那些使用者沒有許可權的表進行垃圾回收操作。
VACUUM不能在事務塊內執行。
建議生產資料庫經常清理(至少每晚一次),以保證不斷地刪除失效的行。尤其是在增刪了大量記錄之後,對受影響的表執行VACUUM ANALYZE命令是一個很好的習慣。這樣將更新系統目錄為最近的更改,並且允許查詢優化器在規劃使用者查詢時有更好的選擇。
不建議日常使用FULL選項,但是可以在特殊情況下使用。例如在使用者刪除了一個表的大部分行之後,希望從物理上縮小該表以減少磁碟空間佔用。VACUUM FULL通常要比單純的VACUUM收縮更多的表尺寸。FULL選項並不清理索引,所以推薦週期性的執行REINDEX命令。實際上,首先刪除所有索引,再執行VACUUM FULL命令,最後重建索引通常是更快的選擇。如果執行此命令後所佔用物理空間無變化(未減少),請確認是否有其他活躍事務(刪除資料事務開始之前開始的事務,並在vacuum full執行前未結束)存在,如果有等其他活躍事務退出進行重試。
VACUUM會導致I/O流量的大幅增加,這可能會影響其他活動會話的效能。因此,有時候會建議使用基於開銷的vacuum延遲特性。
如果指定了VERBOSE選項,VACUUM將列印處理過程中的資訊,以表明當前正在處理的表。各種有關當前表的統計資訊也會打印出來。但是對於列存表執行VACUUM操作,指定了VERBOSE選項,無資訊輸出。
當含有帶括號的選項列表時,選項可以以任何順序寫入。如果沒有括號,則選項必須按語法顯示的順序給出。
語法格式回收空間並更新統計資訊,對關鍵字順序無要求。
VACUUM [ ( { FULL | FREEZE | VERBOSE | {ANALYZE | ANALYSE }} [,...] ) ]
    [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ];僅回收空間,不更新統計資訊。
VACUUM [ FULL [COMPACT] ] [ FREEZE ] [ VERBOSE ] [ table_name ] [ PARTITION ( partition_name ) ];回收空間並更新統計資訊,且對關鍵字順序有要求。
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] { ANALYZE | ANALYSE } [ VERBOSE ] 
    [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ];針對HDFS表,將delta table中的資料轉移到HDFS儲存。
VACUUM DELTAMERGE [ table_name ];針對HDFS表,刪除HDFS表在HDFS儲存上的空值分割槽目錄。
VACUUM HDFSDIRECTORY [ table_name ];引數說明FULL
選擇“FULL”清理,這樣可以恢復更多的空間,但是需要耗時更多,並且在表上施加了排他鎖。

FULL選項還可以帶有COMPACT引數,該引數只針對HDFS表,指定該引數的VACUUM FULL操作效能要好於未指定該引數的VACUUM FULL操作。

COMPACT和PARTITION引數不能同時使用。

 說明: 
使用FULL引數會導致統計資訊丟失,如果需要收集統計資訊,請在vacuum full語句中加上analyze關鍵字。

FREEZE
指定FREEZE相當於執行VACUUM時將vacuum_freeze_min_age引數設為0。

VERBOSE
為每個表列印一份詳細的清理工作報告。

ANALYZE | ANALYSE
更新用於優化器的統計資訊,以決定執行查詢的最有效方法。

table_name
要清理的表的名稱(可以有模式修飾)。

取值範圍:要清理的表的名稱。預設時為當前資料庫中的所有表。

column_name
要分析的具體的欄位名稱。

取值範圍:要分析的具體的欄位名稱。預設時為所有欄位。

PARTITION
HDFS表不支援PARTITION引數,COMPACT和PARTITION引數不能同時使用。

partition_name
要清理的表的分割槽名稱。預設時為所有分割槽。

DELTAMERGE
只針對HDFS表,將HDFS表的delta table中的資料轉移到HDFS儲存上。此操作受cstore_insert_mode和enable_upgrade_merge_lock_mode兩個引數的影響。

HDFSDIRECTORY
只針對HDFS表,刪除HDFS表在HDFS儲存上表目錄下的空值分割槽目錄。

示例--在表tpcds.reason上建立索引
CREATE UNIQUE INDEX ds_reason_index1 ON tpcds.reason(r_reason_sk);

--對帶索引的表tpcds.reason執行VACUUM操作。
VACUUM (VERBOSE, ANALYZE) tpcds.reason;

--刪除索引
DROP INDEX ds_reason_index1 CASCADE;
DROP TABLE tpcds.reason;父主題: SQL語法:SET ROLE to VALUES