0% found this document useful (0 votes)
31 views

Ananda Postgres Assignment

The document discusses various queries to check database statistics, sizes, and connections. It provides queries to view statistics on databases, tables, indexes, and functions. Additional queries show the sizes of databases, tables, indexes, and tablespaces. A final query lists active connections to a specific database.

Uploaded by

Ananda Thimmappa
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
31 views

Ananda Postgres Assignment

The document discusses various queries to check database statistics, sizes, and connections. It provides queries to view statistics on databases, tables, indexes, and functions. Additional queries show the sizes of databases, tables, indexes, and tablespaces. A final query lists active connections to a specific database.

Uploaded by

Ananda Thimmappa
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 12

below query is used to check the statistics details of database

ecomm=> select * from pg_stat_database


datid | datname | numbackends | xact_commit | xact_rollback | blks_read |
blks_hit | tup_returned | tup_fetched | tup_inserted | tup_updated | tup_deleted |
conflicts | tem
p_files | temp_bytes | deadlocks | checksum_failures | checksum_last_failure |
blk_read_time | blk_write_time | stats_reset
-------+---------------+-------------+-------------+---------------+-----------
+-----------+--------------+-------------+--------------+-------------
+-------------+-----------+----
--------+------------+-----------+-------------------+-----------------------
+---------------+----------------+-------------------------------
0 | | 0 | 0 | 0 | 324 |
40338179 | 82313007 | 8437599 | 1176 | 58 | 717 |
0 |
0 | 0 | 0 | 0 | |
0 | 0 | 2022-02-28 16:26:39.925653+00
16384 | cloudsqladmin | 2 | 7938774 | 7 | 3223 |
176152704 | 229740925 | 101627423 | 269 | 644863 | 0 |
0 |
0 | 0 | 0 | 0 | |
794.653 | 0 | 2022-02-28 16:26:40.492001+00
14053 | template0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 0 | 0 |
0 |
0 | 0 | 0 | 0 | |
0 | 0 |
14054 | postgres | 0 | 731226 | 16 | 1841 |
91874969 | 151870671 | 45657107 | 0 | 34 | 0 |
0 |
0 | 0 | 0 | 0 | |
633.951 | 0 | 2022-02-28 16:26:39.925596+00
1 | template1 | 0 | 104003 | 0 | 847 |
4020904 | 64404985 | 582417 | 0 | 37 | 0 |
0 |
0 | 0 | 0 | 0 | |
143.855 | 0 | 2022-02-28 16:26:41.062925+00
16467 | ecomm | 283 | 1497748 | 5310 | 2966 |
104583362 | 230358329 | 50121057 | 10391 | 3023 | 6217 |
0 |
0 | 0 | 0 | 0 | |
749.956 | 0.031 | 2022-03-14 16:22:32.359998+00
(6 rows)

Check the table statistics:


-----------------------------
select * from pg_stat_all_tables;

ecomm=> select * from pg_stat_all_tables;


relid | schemaname | relname | seq_scan | seq_tup_read
| idx_scan | idx_tup_fetch | n_tup_ins | n_tup_upd | n_tup_del | n_tup_hot_upd |
n_live_tup | n_d
ead_tup | n_mod_since_analyze | last_vacuum | last_autovacuum |
last_analyze | last_autoanalyze | vacuum_count | autovacuum_count |
analyze_count | autoa
nalyze_count
-------+--------------------+----------------------------+----------+--------------
+----------+---------------+-----------+-----------+-----------+---------------
+------------+----
--------+---------------------+-------------+-------------------------------
+--------------+-------------------------------+--------------+------------------
+---------------+------
-------------
2615 | pg_catalog | pg_namespace | 110295 | 661578
| 1248753 | 571865 | 2 | 4 | 2 | 4 |
1 |
6 | 8 | | |
| | 0 | 0 | 0 |
0
13916 | pg_toast | pg_toast_13914 | 0 | 0
| 0 | 0 | 0 | 0 | 0 | 0 |
0 |
0 | 0 | | |
| | 0 | 0 | 0 |
0
2840 | pg_toast | pg_toast_2619 | 0 | 0
| 2117 | 2143 | 5 | 0 | 5 | 0 |
0 |
5 | 10 | | |
| | 0 | 0 | 0 |
0
13906 | pg_toast | pg_toast_13904 | 0 | 0
| 0 | 0 | 0 | 0 | 0 | 0 |
0 |
0 | 0 | | |
| | 0 | 0 | 0 |
0
3598 | pg_toast | pg_toast_3596 | 0 | 0
| 0 | 0 | 0 | 0 | 0 | 0 |
0 |
0 | 0 | | |
| | 0 | 0 | 0 |
0
2966 | pg_toast | pg_toast_2964 | 0 | 0
| 0 | 0 | 0 | 0 | 0 | 0 |
0 |
0 | 0 | | |
| | 0 | 0 | 0 |
0
18234 | ecomm | CUST_COSTALLOC_PREF_VAL | 276 | 2767
| 491 | 151 | 48 | 0 | 36 | 0 |
12 |
38 | 28 | | |
| 2022-04-18 05:39:24.821774+00 | 0 |

below tables will fetch details same as above 2 queries


------------------------------------------------------------
Check the system table statistics:
select * from pg_stat_sys_tables;

Check the index statistics:


select * from pg_stat_all_indexes;
Check the user functions statistics:
select * from pg_stat_user_functions;

to get details of database size, table, index, tablespaces sizes


------------------------------------------------------------------------
table size:
-----------
select pg_relation_size('address');

SELECT pg_size_pretty (pg_relation_size('address'));

SELECT pg_size_pretty (pg_total_relation_size ('address'));

the following query returns top 5 biggest tables in the ecomm database
--------------------------------------------------------------------------
SELECT relname AS "relation",pg_size_pretty (pg_total_relation_size (C .oid)) AS
"total_size"
FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C .relnamespace) WHERE nspname
NOT IN ( 'pg_catalog','information_schema')
AND C .relkind <> 'i' AND nspname !~ '^pg_toast' ORDER BY pg_total_relation_size (C
.oid) DESC LIMIT 5;

PostgreSQL database size


-------------------------
SELECT pg_size_pretty ( pg_database_size ('ecomm') );

ecomm=> SELECT pg_size_pretty ( pg_database_size ('ecomm') );


pg_size_pretty
----------------
11 MB
(1 row)

SELECT pg_database.datname,pg_size_pretty(pg_database_size(pg_database.datname)) AS
size FROM pg_database;

ecomm=> SELECT
pg_database.datname,pg_size_pretty(pg_database_size(pg_database.datname)) AS size
FROM pg_database;
datname | size
---------------+---------
cloudsqladmin | 8305 kB
template0 | 8033 kB
postgres | 8185 kB
template1 | 8177 kB
ecomm | 11 MB
(5 rows)

PostgreSQL index size


---------------------
SELECT pg_size_pretty (pg_indexes_size('contact'));
PostgreSQL tablespace size
---------------------------
SELECT pg_size_pretty (pg_tablespace_size ('pg_default'));

ecomm=> SELECT pg_size_pretty (pg_tablespace_size ('pg_default'));


pg_size_pretty
----------------
43 MB
(1 row)

===================================================================================
================

The following query returns the active connections:


----------------------------------------------------

ecomm=> \d pg_stat_activity
View "pg_catalog.pg_stat_activity"
Column | Type | Collation | Nullable | Default
------------------+--------------------------+-----------+----------+---------
datid | oid |
| |
datname | name | | |
pid | integer | | |
usesysid | oid | | |
usename | name | | |
application_name | text | | |
client_addr | inet | | |
client_hostname | text | | |
client_port | integer | | |
backend_start | timestamp with time zone | | |
xact_start | timestamp with time zone | | |
query_start | timestamp with time zone | | |
state_change | timestamp with time zone | | |
wait_event_type | text | | |
wait_event | text | | |
state | text | | |
backend_xid | xid | | |
backend_xmin | xid | | |
query | text | | |
backend_type | text | | |

SELECT pid, usename, client_addr FROM pg_stat_activity WHERE datname ='ecomm';

To terminate the active connections to the dvdrental database,


--------------------------------------------------------------
SELECT pg_terminate_backend (pid) FROM pg_stat_activity WHERE datname = 'ecomm';

find the activities associated with the database by querying the pg_stat_activity
view
-----------------------------------------------------------------------------
SELECT * FROM pg_stat_activity WHERE datname = 'ecomm';
ecomm=> SELECT * FROM pg_stat_activity WHERE datname = 'ecomm';
datid | datname | pid | usesysid | usename |
application_name | client_addr | client_hostname | client_port |
backend_start |
xact_start | query_start | state_change
| wait_event_type | wait_event | state | backend_xid | backend_xmin |
query | backend_type
-------+---------+--------+----------+-----------------------------
+--------------------------+--------------+-----------------+-------------
+-------------------------------+------
-------------------------+-------------------------------
+-------------------------------+-----------------+------------+--------
+-------------+--------------+---------------------
------------------------------------+----------------
16467 | ecomm | 524363 | 17952 | ecomm_api | PostgreSQL
JDBC Driver | | | |
|
| |
| | | | | |
<insufficient privil
ege> |
16467 | ecomm | 524361 | 17952 | ecomm_api | PostgreSQL
JDBC Driver | | | |
|
| |
| | | | | |
<insufficient privil
ege> |
16467 | ecomm | 524509 | 17952 | ecomm_api | PostgreSQL
JDBC Driver | | | |
|
| |
| | | | | |
<insufficient privil
ege> |
16467 | ecomm | 524510 | 17952 | ecomm_api | PostgreSQL
JDBC Driver | | | |
|
| |
| | | | | |
<insufficient privil
ege> |
16467 | ecomm | 524511 | 17952 | ecomm_api | PostgreSQL
JDBC Driver | | | |
|
| |
| | | | | |
<insufficient privil
ege> |
16467 | ecomm | 524825 | 17952 | ecomm_api | PostgreSQL
JDBC Driver | | | |
|
| |
| | | | | |
<insufficient privil
ege> |
16467 | ecomm | 525016 | 17952 | ecomm_api | PostgreSQL
JDBC Driver | | | |
|
| |
| | | | | |
<insufficient privil
ege>

terminate the active connections by issuing the following query:


-----------------------------------------------------------------
SELECT pg_terminate_backend (524363) FROM pg_stat_activity WHERE
pg_stat_activity.datname = 'ecomm';

===================================================================================
==============================

to get details of no of rows for all the tables in database


------------------------------------------------------------------------
ecomm=> select n.nspname as table_schema,
ecomm-> c.relname as table_name,
ecomm-> c.reltuples as rows
ecomm-> from pg_class c
ecomm-> join pg_namespace n on n.oid = c.relnamespace
ecomm-> where c.relkind = 'r'
ecomm-> and n.nspname not in ('information_schema','pg_catalog')
ecomm-> order by c.reltuples desc;
table_schema | table_name | rows
--------------+----------------------------+------
ecomm | CONTACT | 208
ecomm | CUST_CONTACT_RELATION | 152
ecomm | CA_CATEGORY_VAL | 62
ecomm | CUSTOMER | 55
ecomm | CA_CATEGORY | 54
ecomm | CUSTOMER_PROFILE | 52
ecomm | PURCHASE_ORDERS | 35
ecomm | CUST_COSTALLOC_PREF_VAL | 10
ecomm | CONTACT_CA_RSTR | 5
ecomm | ULTIMATE_ADDRESS | 0
ecomm | CUST_COSTALLOC_PREF | 0
ecomm | CUST_ORDAPPR_PREF | 0
ecomm | CUST_ORDAPPR_PREF_VAL | 0
ecomm | CONTACT_ROLE | 0
ecomm | CONTACT_PROFILE | 0
ecomm | CUSTOMER_SEGMENT | 0
ecomm | CONTACT_BASIC_ATTR | 0
ecomm | CONTACT_BASIC_ATTR_VAL | 0
ecomm | CONTACT_SHIP_PREF_VAL | 0
ecomm | CONTACT_SHIP_PREF | 0
ecomm | COMMON_CONTACT_INFO | 0
ecomm | CONTACT_FLAGS | 0
ecomm | CONTACT_ORD_PREF_VAL | 0
ecomm | CONTACT_ORD_PREF | 0
ecomm | CUSTOMER_SEGMENT_VAL | 0
ecomm | CONTACT_CA_DEFAULTS | 0
ecomm | CA_UPLOAD | 0
ecomm | ORDERS | 0
ecomm | CONTACT_COSTALLOC_ATTR | 0
ecomm | PO_ORDER_HISTORY | 0
ecomm | CONTACT_COSTALLOC_ATTR_VAL | 0
ecomm | CUST_BASIC_PREF_VAL | 0
ecomm | CONTACT_FLAGS_VAL | 0
ecomm | AUDIT_DATA | 0
ecomm | MSG_AUDIT | 0
ecomm | COMMON_ADDRESS_INFO | 0
ecomm | BILLING_ADDRESS | 0
ecomm | CUSTOMER_FLAG_VAL | 0
ecomm | CUSTOMER_FLAG | 0
ecomm | CUST_BASIC_PREF | 0
ecomm | SHIPPING_ADDRESS | 0

performance tunning
==============================

pg_stats_statements
---------------------
It simply tracks execution statistics of SQL statements and can be an easy way to
find poor performing queries.

SELECT *
FROM
pg_stat_statements
ORDER BY
total_time DESC;

SELECT sum(total_time) AS total_time,


sum(blk_read_time + blk_write_time) AS io_time,
sum(total_time - blk_read_time - blk_write_time) AS cpu_time,
sum(calls) AS ncalls,
sum(rows) AS total_rows
FROM pg_stat_statements
WHERE dbid IN (SELECT oid FROM pg_database WHERE datname=current_database());

WITH ttl AS (
SELECT sum(total_time) AS total_time, sum(blk_read_time + blk_write_time) AS
io_time,
sum(total_time - blk_read_time - blk_write_time) AS cpu_time,
sum(calls) AS ncalls, sum(rows) AS total_rows
FROM pg_stat_statements WHERE dbid IN (
SELECT oid FROM pg_database WHERE datname=current_database())

)
SELECT *,(pss.total_time-pss.blk_read_time-pss.blk_write_time)/ttl.cpu_time*100
cpu_pct
FROM pg_stat_statements pss, ttl
WHERE (pss.total_time-pss.blk_read_time-pss.blk_write_time)/ttl.cpu_time >= 0.05
ORDER BY pss.total_time-pss.blk_read_time-pss.blk_write_time DESC LIMIT 1;

missing index
---------------

SELECT
relname,
seq_scan - idx_scan AS too_much_seq,
CASE
WHEN
seq_scan - coalesce(idx_scan, 0) > 0
THEN
'Missing Index?'
ELSE
'OK'
END,
pg_relation_size(relname::regclass) AS rel_size, seq_scan, idx_scan
FROM
pg_stat_all_tables
WHERE
schemaname = 'public'
AND pg_relation_size(relname::regclass) > 80000
ORDER BY
too_much_seq DESC;

ecomm=> SELECT
ecomm-> relname,
ecomm-> seq_scan - idx_scan AS too_much_seq,
ecomm-> CASE
ecomm-> WHEN
ecomm-> seq_scan - coalesce(idx_scan, 0) > 0
ecomm-> THEN
ecomm-> 'Missing Index?'
ecomm-> ELSE
ecomm-> 'OK'
ecomm-> END,
ecomm-> pg_relation_size(relname::regclass) AS rel_size, seq_scan, idx_scan
ecomm-> FROM
ecomm-> pg_stat_all_tables
ecomm-> WHERE
ecomm-> schemaname = 'public'
ecomm-> AND pg_relation_size(relname::regclass) > 80000
ecomm-> ORDER BY
ecomm-> too_much_seq DESC;
relname | too_much_seq | case | rel_size | seq_scan | idx_scan
---------+--------------+------+----------+----------+----------
(0 rows)

unused index
------------------
SELECT
indexrelid::regclass as index,
relid::regclass as table,
'DROP INDEX ' || indexrelid::regclass || ';' as drop_statement
FROM
pg_stat_user_indexes
JOIN
pg_index USING (indexrelid)
WHERE
idx_scan = 0
AND indisunique is false;

ecomm=> SELECT
ecomm-> indexrelid::regclass as index,
ecomm-> relid::regclass as table,
ecomm-> 'DROP INDEX ' || indexrelid::regclass || ';' as drop_statement
ecomm-> FROM
ecomm-> pg_stat_user_indexes
ecomm-> JOIN
ecomm-> pg_index USING (indexrelid)
ecomm-> WHERE
ecomm-> idx_scan = 0
ecomm-> AND indisunique is false;
index | table | drop_statement
-------+-------+----------------
(0 rows)

explain plan for query:


=============================
ecomm=> EXPLAIN (analyze) SELECT relname,relpages,reltuples FROM pg_class WHERE
reltuples>10000;
QUERY PLAN
-----------------------------------------------------------------------------------
-----------------
Seq Scan on pg_class (cost=0.00..23.04 rows=1 width=72) (actual time=0.120..0.120
rows=0 loops=1)
Filter: (reltuples > '10000'::double precision)
Rows Removed by Filter: 564
Planning Time: 0.111 ms
Execution Time: 0.133 ms
(5 rows)

ecomm=> EXPLAIN (analyze, buffers) SELECT r.relname, a.attname FROM pg_class r JOIN
pg_attribute a ON a.attrelid=r.oid
ecomm-> WHERE a.attnum>0 AND NOT attisdropped;
QUERY PLAN
-----------------------------------------------------------------------------------
------------------------------------
Hash Join (cost=28.67..167.34 rows=2884 width=128) (actual time=0.284..3.778
rows=2887 loops=1)
Hash Cond: (a.attrelid = r.oid)
Buffers: shared hit=96
-> Seq Scan on pg_attribute a (cost=0.00..131.05 rows=2884 width=68) (actual
time=0.007..2.596 rows=2887 loops=1)
Filter: ((NOT attisdropped) AND (attnum > 0))
Rows Removed by Filter: 1200
Buffers: shared hit=80
-> Hash (cost=21.63..21.63 rows=563 width=68) (actual time=0.268..0.269
rows=564 loops=1)
Buckets: 1024 Batches: 1 Memory Usage: 64kB
Buffers: shared hit=16
-> Seq Scan on pg_class r (cost=0.00..21.63 rows=563 width=68) (actual
time=0.005..0.149 rows=564 loops=1)
Buffers: shared hit=16
Planning Time: 0.574 ms
Execution Time: 4.014 ms
(14 rows)

long running and idle applications;


====================================
SELECT COALESCE(now() - query_start, '0 seconds'::INTERVAL) AS duration, *
FROM pg_stat_activity
WHERE state != 'idle'
AND pid != pg_backend_pid()
ORDER BY 1 DESC, backend_start;

ecomm=> SELECT COALESCE(now() - query_start, '0 seconds'::INTERVAL) AS duration, *


ecomm-> FROM pg_stat_activity
ecomm-> WHERE state != 'idle'
ecomm-> AND pid != pg_backend_pid()
ecomm-> ORDER BY 1 DESC, backend_start;
duration | datid | datname | pid | usesysid | usename | application_name |
client_addr | client_hostname | client_port | backend_start | xact_start |
query_start | state_change |
wait_event_type | wait_event | state | backend_xid | backend_xmin | query |
backend_type
----------+-------+---------+-----+----------+---------+------------------
+-------------+-----------------+-------------+---------------+------------
+-------------+--------------+-
----------------+------------+-------+-------------+--------------+-------
+--------------
(0 rows)

SELECT
pid,
now() - pg_stat_activity.query_start AS duration,
state,
query
FROM pg_stat_activity
WHERE state ='active' AND query NOT ILIKE '%pg_stat_activity%' AND (now() -
pg_stat_activity.query_start) > interval '5 seconds'
ORDER BY duration desc;

ecomm=> SELECT
ecomm-> pid,
ecomm-> now() - pg_stat_activity.query_start AS duration,
ecomm-> state,
ecomm-> query
ecomm-> FROM pg_stat_activity
ecomm-> WHERE state ='active' AND query NOT ILIKE '%pg_stat_activity%' AND (now() -
pg_stat_activity.query_start) > interval '5 seconds'
ecomm-> ORDER BY duration desc;
pid | duration | state | query
-----+----------+-------+-------
(0 rows)

Creating a List of PostgreSQL Tables from ecomm

ecomm=> SELECT
ecomm-> table_schema, table_name
ecomm-> FROM
ecomm-> information_schema.tables
ecomm-> WHERE
ecomm-> table_schema <> 'information_schema'
ecomm-> AND table_name NOT LIKE 'pg_%'
ecomm-> ORDER BY
ecomm-> table_schema,
ecomm-> table_name;
table_schema | table_name
--------------+----------------------------
ecomm | AUDIT_DATA
ecomm | BILLING_ADDRESS
ecomm | CA_CATEGORY
ecomm | CA_CATEGORY_VAL
ecomm | CA_UPLOAD
ecomm | COMMON_ADDRESS_INFO
ecomm | COMMON_CONTACT_INFO
ecomm | CONTACT
ecomm | CONTACT_BASIC_ATTR
ecomm | CONTACT_BASIC_ATTR_VAL
ecomm | CONTACT_CA_DEFAULTS
ecomm | CONTACT_CA_RSTR
ecomm | CONTACT_COSTALLOC_ATTR
ecomm | CONTACT_COSTALLOC_ATTR_VAL
ecomm | CONTACT_FLAGS
ecomm | CONTACT_FLAGS_VAL
ecomm | CONTACT_ORD_PREF
ecomm | CONTACT_ORD_PREF_VAL
ecomm | CONTACT_PROFILE
ecomm | CONTACT_ROLE
ecomm | CONTACT_SHIP_PREF
ecomm | CONTACT_SHIP_PREF_VAL
ecomm | CUSTOMER
ecomm | CUSTOMER_FLAG
ecomm | CUSTOMER_FLAG_VAL
ecomm | CUSTOMER_PROFILE
ecomm | CUSTOMER_SEGMENT
ecomm | CUSTOMER_SEGMENT_VAL
ecomm | CUST_BASIC_PREF
ecomm | CUST_BASIC_PREF_VAL
ecomm | CUST_CONTACT_RELATION
ecomm | CUST_COSTALLOC_PREF
ecomm | CUST_COSTALLOC_PREF_VAL
ecomm | CUST_ORDAPPR_PREF
ecomm | CUST_ORDAPPR_PREF_VAL
ecomm | MSG_AUDIT
ecomm | ORDERS
ecomm | PO_ORDER_HISTORY
ecomm | PURCHASE_ORDERS
ecomm | SHIPPING_ADDRESS
ecomm | ULTIMATE_ADDRESS

Querying to Check PostgreSQL Open Connections

ecomm-> COUNT(*) as connections,


ecomm-> backend_type
ecomm-> FROM
ecomm-> pg_stat_activity
ecomm-> GROUP BY
ecomm-> backend_type
ecomm-> ORDER BY
ecomm-> connections DESC
ecomm-> ;
connections | backend_type
-------------+----------------
293 |
1 | client backend

hit ratio:
============

SELECT
sum(heap_blks_read) as reads,
sum(heap_blks_hit) as hits,
ROUND(
sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)),
4
) as hit_ratio
FROM
pg_statio_user_tables;

ecomm=> SELECT
ecomm-> sum(heap_blks_read) as reads,
ecomm-> sum(heap_blks_hit) as hits,
ecomm-> ROUND(
ecomm(> sum(heap_blks_hit) / (sum(heap_blks_hit) + sum(heap_blks_read)),
ecomm(> 4
ecomm(> ) as hit_ratio
ecomm-> FROM
ecomm-> pg_statio_user_tables;
reads | hits | hit_ratio
-------+-------+-----------
38 | 67616 | 0.9994

You might also like