004.PGSQL-髒資料清理,頻繁delete\update高水位線問題,vacuum full 、vacuum
阿新 • • 發佈:2020-07-27
查看錶大小
-- 查出所有表(包含索引)並排序 -- 查出所有表(包含索引)並排序 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 BYpg_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 1CYCLE ; 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