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);

數據大小

 

重復刪除、插入數據   數據大小

 

 

 

truncate table ioc_dw_second.test0001;

 

 

vacuum full  ioc_dw_second.test0001;

 

 

 

 

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM