Postgresql表和索引占用空间回收释放(表空间膨胀)

Postgresql表和索引占用空间回收释放(表空间膨胀)

复制代码
-- 1.创建测试表t_user
create table if not exists t_user(
	id serial primary key,
	user_name varchar(255),
	pass_word varchar(255),
	create_time date,
	dr char(1)
);
 
create index ind_time on t_user(create_time);


-- 2.注释
comment on column t_user.id is '测试表';
comment on column t_user.user_name is '账号';
comment on column t_user.pass_word is '密码';
comment on column t_user.create_time is '创建日期';
comment on column t_user.dr is 'delete remark';


-- 创建存储过程插入数据
create or replace function batch_insert_proc(num int) returns void as 
$$
begin
	while num > 0 loop
		insert into t_user(user_name,pass_word,create_time,dr) values('username'||round(random()*num),'password'||round(random()*num),now(),0);
		num = num -1;
	end loop;
exception
	when others then
	raise exception'(%)',SQLERRM;
end;
$$ language plpgsql;


-- 插入100*10000条数据
select batch_insert_proc(1000*1000); 

--分析表统计信息
analyze t_user;

--查询统计信息
SELECT
    relname AS "表名",
    seq_scan AS "顺序扫描次数",
    seq_tup_read AS "顺序扫描行数",
    idx_scan AS "索引扫描次数",
    idx_tup_fetch AS "通过索引获取的行数",
    n_tup_ins AS "插入的行数",
    n_tup_upd AS "更新的行数",
    n_tup_del AS "删除的行数",
    n_live_tup AS "表中当前行数",
    n_dead_tup AS "表中已删除的行数",
    last_vacuum AS "上次VACUUM操作的时间",
    last_autovacuum AS "上次自动VACUUM操作的时间",
    last_analyze AS "上次ANALYZE操作的时间",
    last_autoanalyze AS "上次自动ANALYZE操作的时间"
FROM pg_stat_user_tables;



--查询表数据量大小信息

SELECT
    table_size.relname 表名,
    pg_size_pretty ( pg_relation_size ( relid ) ) 表数据大小,
    pg_size_pretty ( pg_indexes_size ( relid ) ) 表总索引大小,
    pg_size_pretty ( pg_total_relation_size ( relid ) ) 表总大小,
    表行数 
FROM
pg_stat_user_tables table_size
    LEFT JOIN (
        SELECT
            relname,
            reltuples :: DECIMAL ( 19, 0 ) 表行数 
        FROM
        pg_class r
        JOIN pg_namespace n ON ( relnamespace = n.oid ) 
        WHERE
            relkind = 'r' 
            AND n.nspname = 'public' 
        ) table_num ON table_num.relname = table_size.relname 
WHERE
    schemaname = 'public' 
ORDER BY
    pg_relation_size ( relid ) DESC;

--查询表的大小信息
  表名  | 表数据大小 | 表总索引大小 |  表总大小  | 表行数  
--------+------------+--------------+------------+---------
 t_user | 71 MB      | 21 MB        | 93 MB      | 1000000
 tab1   | 8192 bytes | 0 bytes      | 8192 bytes |       1
(2 rows)

--物理文件大小信息
[postgres@SJZTproxy-103-38 16646]$ du -sh 16675
72M     16675
[postgres@SJZTproxy-103-38 16646]$ du -sh 16677
22M     16677

--备注:
--获取表的物理文件路径
select pg_relation_filenode('t_user'),pg_relation_filepath('t_user');
--查看索引对应的物理文件路劲
select pg_relation_filenode('ind_time'),pg_relation_filepath('ind_time');

--truncate前数据文件大小 
[postgres@SJZTproxy-103-38 16646]$ ls -l 16661
-rw------- 1 postgres postgres 6832128 Sep  2 16:54 16661
[postgres@SJZTproxy-103-38 16646]$ 
[postgres@SJZTproxy-103-38 16646]$ du -sh 16661
6.6M    16661


dbtest=> truncate table t_user;
TRUNCATE TABLE


--truncate后数据文件大小
[postgres@SJZTproxy-103-38 16646]$ du -sh 16661
0       16661



--删除索引

drop index t_user_pkey;
相关推荐
宇钶宇夕17 分钟前
S7-1200 数字量模块接线:从源型 / 漏型到信号板扩展全解析
运维·服务器·数据库·程序人生·自动化
BlueBirdssh29 分钟前
linux 解析设备树文件时,怎么区分是属于Platform 设备和非Platform 设备1
linux·运维·服务器
阿猿收手吧!31 分钟前
【高并发服务器】多路复用的总结 eventfd timerfd
服务器·c++·计算机网络
千帐灯无此声33 分钟前
iw 命令 -- linux 无线管理
linux·运维·服务器·mcu
wanhengidc43 分钟前
国内外服务器的不同之处
运维·服务器
zcg19421 小时前
工作第一步建立连接——ssh
运维·服务器·ssh
朝九晚五ฺ1 小时前
【MySQL基础】MySQL事务详解:原理、特性与实战应用
数据库·mysql
落落鱼20131 小时前
CentOS服务器安装Supervisor使队列可以在后台运行
linux·服务器·centos·队列
Digitally1 小时前
如何将华为文件传输到电脑
服务器·华为·电脑
Lightning-py1 小时前
TCP重传
服务器·网络·tcp/ip