[root@pg-server01 ~]# uname -aLinux pg-server01 4.18.0-348.el8.x86_64 #1 SMP Tue Oct 19 15:14:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux[root@pg-server01 ~]# cat /etc/redhat-release CentOS Linux release 8.5.2111
yum -y install gcc readline readline-devel zlib-devel openssl-devel libicu-devel make json-c-devel git wget
mkdir -p /data/software/pg/;cd /data/software/pg/;wget https://ftp.postgresql.org/pub/source/v15.4/postgresql-15.4.tar.gz tar -xvf postgresql-15.4.tar.gz;cd ./postgresql-15.4;./configure \--prefix=/opt/pgsql \--with-openssl make && make install
cd /data/software/pg/postgresql-15.4/;cd ./contrib/pgstattuple;make && make install
cd /data/software/pg/postgresql-15.4/;cd ./contrib/btree_gin;make && make install
useradd postgres chown -R postgres:postgres /home/postgres;chown -R postgres:postgres /opt/pgsql;
vi /etc/profile # 添加如下内容# pg envexport PGHOME=/opt/pgsqlexport PATH=$PATH:$PGHOME/bin
mkdir -p /data/pgdata/;chown postgres:postgres /data/pgdata/;
su - postgres
initdb -D /data/pgdata/ -U postgres --encoding=UTF8 --lc-collate=en_US.UTF-8 --lc-ctype=en_US.UTF-8
pg_ctl -D /data/pgdata/ start
su - postgrespsqlselect * from pg_available_extensions where name='pgstattuple';create extension pgstattuple;select * from pg_available_extensions where name='pgstattuple'; # 我的操作输出类似如下:[root@pg-server01 opt]# su - postgres[postgres@pg-server01 ~]$ psqlpsql (15.4)Type "help" for help. postgres=# select * from pg_available_extensions where name='pgstattuple'; name | default_version | installed_version | comment -------------+-----------------+-------------------+----------------------------- pgstattuple | 1.5 | | show tuple-level statistics(1 row) postgres=# create extension pgstattuple;CREATE EXTENSIONpostgres=# select * from pg_available_extensions where name='pgstattuple'; name | default_version | installed_version | comment -------------+-----------------+-------------------+----------------------------- pgstattuple | 1.5 | 1.5 | show tuple-level statistics(1 row) postgres=#
grant pg_stat_scan_tables to <nonsuperuser>;
psqlcreate table workshop (jobno int);insert into workshop values (generate_series(1,80000));create index workshop_index on workshop (jobno);
[postgres@pg-server01 ~]$ psqlpsql (15.4)Type "help" for help.postgres=# create table workshop (jobno int);CREATE TABLEpostgres=# insert into workshop values (generate_series(1,80000));INSERT 0 80000postgres=# create index workshop_index on workshop (jobno);CREATE INDEXpostgres=#
SELECT * FROM pgstattuple('pg_catalog.pg_proc');
SELECT * FROM pgstattuple('workshop');
postgres=# \xExpanded display is on.postgres=# SELECT * FROM pgstattuple('pg_catalog.pg_proc');-[ RECORD 1 ]------+-------table_len | 786432tuple_count | 3253tuple_len | 731586tuple_percent | 93.03dead_tuple_count | 12dead_tuple_len | 4790dead_tuple_percent | 0.61free_space | 22564free_percent | 2.87 postgres=# SELECT * FROM pgstattuple('workshop'); -[ RECORD 1 ]------+--------table_len | 2899968tuple_count | 80000tuple_len | 2240000tuple_percent | 77.24dead_tuple_count | 0dead_tuple_len | 0dead_tuple_percent | 0free_space | 10056free_percent | 0.35
-------------------------------------------------------------------| 字段名 | 类型 | 说明 |-------------------------------------------------------------------| table_len | bigint | 物理关系长度,以字节为单位 |-------------------------------------------------------------------| tuple_count | bigint | 活动元组的数量 |-------------------------------------------------------------------| tuple_len | bigint | 活元组的总长度(以字节为单位) |-------------------------------------------------------------------| tuple_percent | float8 | 活元组的百分比 |-------------------------------------------------------------------| dead_tuple_count | bigint | 无效(死)元组的数量 |-------------------------------------------------------------------| dead_tuple_len | bigint | 无效(死)元组的总长度(以字节为单位) |-------------------------------------------------------------------| dead_tuple_percent | float8 | 无效(死)元组的百分比 |-------------------------------------------------------------------| free_space | bigint | 总可用空间(以字节为单位) |------------------------------------------------------------------| free_percent | float8 | 可用空间百分比 |------------------------------------------------------------------
postgres=# SELECT * FROM pgstattuple('workshop');-[ RECORD 1 ]------+--------table_len | 2899968tuple_count | 80000tuple_len | 2240000tuple_percent | 77.24dead_tuple_count | 0dead_tuple_len | 0dead_tuple_percent | 0free_space | 10056free_percent | 0.35 # 2. Delete the few ROWS from the table.DELETE FROM workshop WHERE jobno % 8 = 0;
postgres=# SELECT * FROM pgstattuple('workshop');-[ RECORD 1 ]------+--------table_len | 2899968tuple_count | 70000tuple_len | 1960000tuple_percent | 67.59dead_tuple_count | 10000dead_tuple_len | 280000dead_tuple_percent | 9.66free_space | 10056free_percent | 0.35
vacuum workshop;SELECT * FROM pgstattuple('workshop');
vacuum full workshop;SELECT * FROM pgstattuple('workshop');
postgres=# vacuum workshop;VACUUMpostgres=# SELECT * FROM pgstattuple('workshop');-[ RECORD 1 ]------+--------table_len | 2899968tuple_count | 70000tuple_len | 1960000tuple_percent | 67.59dead_tuple_count | 0dead_tuple_len | 0dead_tuple_percent | 0free_space | 330412free_percent | 11.39 postgres=# vacuum full workshop;VACUUMpostgres=# SELECT * FROM pgstattuple('workshop');-[ RECORD 1 ]------+--------table_len | 2539520tuple_count | 70000tuple_len | 1960000tuple_percent | 77.18dead_tuple_count | 0dead_tuple_len | 0dead_tuple_percent | 0free_space | 10840free_percent | 0.43
select relname,(pgstattuple(oid)).dead_tuple_percent from pg_class where relkind = 'r' order by dead_tuple_percent desc limit 10;
postgres=# \xExpanded display is off.postgres=# postgres=# select relname,(pgstattuple(oid)).dead_tuple_percent postgres-# from pg_class postgres-# where relkind = 'r' postgres-# order by dead_tuple_percent desc limit 10; relname | dead_tuple_percent -----------------------+-------------------- pg_init_privs | 2.56 pg_extension | 1.28 pg_class | 0.75 pg_proc | 0.61 pg_depend | 0.47 pg_statistic | 0.36 pg_type | 0.29 pg_attribute | 0.06 pg_user_mapping | 0 pg_statistic_ext_data | 0(10 rows)
SELECT relname, oid, relowner, (pgstattuple(oid)).* FROM pg_class WHERE relkind = 'r' order by dead_tuple_percent desc limit 5;
postgres=# SELECT relname, oid, relowner,postgres-# (pgstattuple(oid)).* postgres-# FROM pg_class postgres-# WHERE relkind = 'r' order by dead_tuple_percent desc limit 5;-[ RECORD 1 ]------+--------------relname | pg_init_privsoid | 3394relowner | 10table_len | 24576tuple_count | 222tuple_len | 17316tuple_percent | 70.46dead_tuple_count | 9dead_tuple_len | 630dead_tuple_percent | 2.56free_space | 4568free_percent | 18.59-[ RECORD 2 ]------+--------------relname | pg_extensionoid | 3079relowner | 10table_len | 8192tuple_count | 2tuple_len | 210tuple_percent | 2.56dead_tuple_count | 1dead_tuple_len | 105dead_tuple_percent | 1.28free_space | 7816free_percent | 95.41-[ RECORD 3 ]------+--------------relname | pg_classoid | 1259relowner | 10table_len | 114688tuple_count | 412tuple_len | 79912tuple_percent | 69.68dead_tuple_count | 5dead_tuple_len | 860dead_tuple_percent | 0.75free_space | 28656free_percent | 24.99-[ RECORD 4 ]------+--------------relname | pg_procoid | 1255relowner | 10table_len | 786432tuple_count | 3253tuple_len | 731586tuple_percent | 93.03dead_tuple_count | 12dead_tuple_len | 4790dead_tuple_percent | 0.61free_space | 22564free_percent | 2.87-[ RECORD 5 ]------+--------------relname | pg_dependoid | 2608relowner | 10table_len | 114688tuple_count | 1854tuple_len | 90846tuple_percent | 79.21dead_tuple_count | 11dead_tuple_len | 539dead_tuple_percent | 0.47free_space | 2288free_percent | 1.99
SELECT * FROM pgstatindex ('workshop_index');
postgres=# SELECT * FROM pgstatindex ('workshop_index');-[ RECORD 1 ]------+--------version | 4tree_level | 1index_size | 1589248root_block_no | 3internal_pages | 1leaf_pages | 192empty_pages | 0deleted_pages | 0avg_leaf_density | 89.74leaf_fragmentation | 0
-------------------------------------------------------------------| 字段名 | 类型 | 说明 |-------------------------------------------------------------------| version | integer | b树版本号 |-------------------------------------------------------------------| tree_level | integer | 根页面的树级别 |-------------------------------------------------------------------| index_size | bigint | 总索引大小(以字节为单位) |-------------------------------------------------------------------| root_block_no | bigint | 根页面的位置(如果没有则为零) |-------------------------------------------------------------------| internal_pages | bigint | “内部”(上层)页面的数量 |-------------------------------------------------------------------| leaf_pages | bigint | 叶子结点的个数 |-------------------------------------------------------------------| empty_pages | bigint | 空页的个数 |-------------------------------------------------------------------| deleted_pages | bigint | 删除页面数 |-------------------------------------------------------------------
-- DROP TABLE IF EXISTS test;CREATE TABLE test ( id bigserial PRIMARY KEY, data jsonb);INSERT INTO test(data) VALUES ('{"field": "value1"}');INSERT INTO test(data) VALUES ('{"field": "value2"}');INSERT INTO test(data) VALUES ('{"other_field": "value42"}');-- CREATE INDEX ON test USING gin(data jsonb_path_ops);CREATE INDEX test_data_gin_idx ON test USING gin(data jsonb_path_ops);EXPLAIN SELECT * FROM test WHERE data @> '{"field": "value1"}';
postgres=# SELECT * FROM pgstatginindex('test_data_gin_idx'); version | pending_pages | pending_tuples ---------+---------------+---------------- 2 | 0 | 0(1 row)
select *from pg_indexeswhere tablename = 'test';
dnf install perfsudo perf probe -x /opt/pgsql/bin/postgres ginInsertCleanupsudo perf stat -a -e probe_postgres:ginInsertCleanup -- sleep 60
-- DROP TABLE IF EXISTS records;CREATE TABLE records ( id bigserial PRIMARY KEY, customer_id int4, data jsonb); CREATE EXTENSION btree_gin;CREATE INDEX ON records USING gin (data, customer_id); EXPLAIN SELECT * FROM records WHERE customer_id = 123 AND data @> '{ "location": "New York" }';EXPLAIN SELECT * FROM records WHERE customer_id = 123; select *from pg_indexeswhere tablename = 'records';
CREATE TABLE post( id SERIAL PRIMARY KEY, title TEXT NOT NULL, content TEXT NOT NULL, author_id INT NOT NULL, language text NOT NULL DEFAULT('english'), document tsvector); SELECT id, title FROM postWHERE post.document @@ to_tsquery('english', 'Endangered & Species')ORDER BY ts_rank(post.document, to_tsquery('english', 'Endangered & Species')) DESC
create extension pgstattuple;select * from pg_available_extensions where name='pgstattuple';
select *from pg_indexeswhere tablename = 'flights';
explain (costs off) select * from flights where flight_no = 'PG0001';select * from pgstathashindex('flights_flight_no_idx');
demo=# explain (costs off) select * from flights where flight_no = 'PG0001'; QUERY PLAN ---------------------------------------------------- Bitmap Heap Scan on flights Recheck Cond: (flight_no = 'PG0001'::bpchar) -> Bitmap Index Scan on flights_flight_no_idx Index Cond: (flight_no = 'PG0001'::bpchar)(4 rows) demo=# select * from pgstathashindex('flights_flight_no_idx'); version | bucket_pages | overflow_pages | bitmap_pages | unused_pages | live_items | dead_items | free_percent ---------+--------------+----------------+--------------+--------------+------------+------------+------------------- 4 | 128 | 13 | 1 | 0 | 33121 | 0 | 42.36979656038809(1 row)
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69998444/viewspace-2997910/ ,如需转载,请注明出处,否则将追究法律责任。