查看表大小
-- 查出所有表(包含索引)並排序 -- 查出所有表(包含索引)並排序 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