postgresql 數據庫管理經常使用查詢

  1. 查看運行時間長的sqlhtml

    select pid,datname,usename,client_addr,query_start,now()-query_start as time_run, query from pg_stat_activitynode

    where state='active' order by time_run desc limit 20;mysql

  2. 查看指定表空間下的表和索引sql

    SELECT  c.relname, t.spcname FROM  pg_class c left JOIN pg_tablespace t ON c.reltablespace = t.oid WHERE t.spcname = 'data1tbs';數據庫

    默認表空間的話where判斷 c.reltablespace=0 或 t.spcname is null
     緩存

  3. 查看指定pid須要的鎖狀態app

    select pc.relname,pl.* from pg_locks pl left join pg_class pc on pc.relfilenode=pl.relation where pl.pid=13912函數

  4. 查看未使用索引post

    select schemaname,relname,indexrelname,idx_scan from pg_stat_user_indexes where idx_scan=0 and schemaname='public' and indexrelname not like '%_pkey'性能

  5. 查看指定表的索引

    select schemaname,relname,indexrelname,idx_scan from pg_stat_user_indexes where schemaname='public' and relname='visited_article'

  6. 某個pid在等待的鎖的持有者

    select pl1.*,pl2.pid,pa.usename,pa.query from pg_locks pl1 left join pg_locks pl2 on pl1.transactionid=pl2.transactionid and pl2.granted

    left join pg_stat_activity pa on pl2.pid=pa.pid where pl1.pid=21641 and not pl1.granted

  7. 查看全部鎖的狀態

    select

         pg_stat_activity.datname,pg_class.relname,pg_locks.transactionid, pg_locks.mode, pg_locks.granted,

         pg_stat_activity.usename,substr(pg_stat_activity.query,1,30), pg_stat_activity.query_start,

         age(now(),pg_stat_activity.query_start) as "age"pg_stat_activity.pid

       from pg_stat_activity,pg_locks left

         outer join pg_class on (pg_locks.relation = pg_class.oid) 

       where pg_locks.pid=pg_stat_activity.pid order by query_start limit 10

查看數據庫

--查看ve數據庫的大小
select pg_size_pretty(pg_database_size('ve'));
--查看錶大小(不含索引等信息)
select pg_relation_size('user');                      
select pg_size_pretty(pg_relation_size('use'))
--查看每一個DB的使用狀況(讀,寫,緩存,更新,事務等)
select * from pg_stat_database

--查看索引的使用狀況
select * from pg_stat_user_indexes;

--查看錶所對應的數據文件路徑與大小
SELECT pg_relation_filepath(oid), relpages FROM pg_class WHERE relname = 'empsalary';
--查看錶空間大小
select pg_tablespace_size('pg_default');
select pg_database_size('playboy');       //查看playboy數據庫的大小
select pg_database.datname, pg_database_size(pg_database.datname) AS size from pg_database;             //查看全部數據庫的大小
select pg_size_pretty(pg_database_size('runoobdb'));                   # 以KB,MB,GB的方式來查看數據庫大小  
 pg_size_pretty 
----------------
 7447 kB
(1 row)

 

查看多表

postgres=#  select pg_relation_size('a');                    ----查看錶的大小
postgres=# \d a              -----查看錶的信息(若是表中有索引會在下面顯示索引的內容)
playboy=> \d test;                      //至關於mysql的,mysql> desc test;
select pg_relation_size('test');   //查看錶大小
select pg_size_pretty(pg_relation_size('test'));                    //以KB,MB,GB的方式來查看錶大小
select pg_size_pretty(pg_total_relation_size('test'));        //查看錶的總大小,包括索引大小

 

查看單表

select pg_relation_size('test');                      //查看test表大小
select pg_size_pretty(pg_relation_size('test'));      //以KB,MB,GB的方式來查看錶大小
select pg_size_pretty(pg_total_relation_size('test'));      //查看錶的總大小,包括索引大小

 

使用pg_table_size() 函數查看查看test表大小  

david=# select pg_table_size('test');
david=# select pg_size_pretty(pg_table_size('test'));

 

查看指定表的總大小

postgres=# select pg_total_relation_size('test');
 pg_total_relation_size 
------------------------
                   8192
(1 row)

postgres=# select pg_size_pretty(pg_total_relation_size('test'));
 pg_size_pretty 
----------------
 8192 bytes
(1 row)

 

查看指定schema 裏全部的表大小,按從大到小的順序排列。

david=# select relname, pg_size_pretty(pg_relation_size(relid)) from pg_stat_user_tables where schemaname='public' order by pg_relation_size(relid) desc;

 

查看錶空間大小

postgres=# select spcname from pg_tablespace;

postgres=# select pg_tablespace_size('pg_default');

postgres=# select pg_size_pretty(pg_tablespace_size('pg_default'));

另外一種查看方法:

=# select pg_tablespace_size('pg_default')/1024/1024 as "SIZE M";  
=# select pg_tablespace_size('pg_default')/1024/1024/1024 as "SIZE G";

 

查看索引

\di                      //查看數據庫的全部索引  ,  至關於mysql的,mysql> show index from test;
select pg_size_pretty(pg_relation_size('playboy_id_pk'));         //查看索大小

查看錶空間,以及大小

select spcname from pg_tablespace;                     //查看全部表空間
select pg_size_pretty(pg_tablespace_size('pg_default'));         //查看錶空間大小
postgres=# select pg_size_pretty(pg_tablespace_size('pg_default'));       ----查看錶空間的大小
postgres=# \db             ------查看全部的表空間以及表空間對應的目錄

查看單索引大小

david=# select pg_relation_size('idx_test');
 pg_relation_size 
------------------
         41238528
(1 row)

david=# select pg_size_pretty(pg_relation_size('idx_test'));
 pg_size_pretty 
----------------
 39 MB
(1 row)

 

查看指定表中全部索引大小

david=# select pg_indexes_size('test');                  
 pg_indexes_size 
-----------------
        82477056
(1 row)

david=# select pg_size_pretty(pg_indexes_size('test'));
 pg_size_pretty 
----------------
 79 MB
(1 row)

找出最大的表和索引

postgres=# SELECT relname, relpages
           FROM pg_class
           ORDER BY relpages DESC;

顯示索引的尺寸

postgres=# SELECT c2.relname, c2.relpages                       
           FROM pg_class c, pg_class c2, pg_index i
           WHERE c.relname = 'ctetest' AND
                 c.oid = i.indrelid AND
                 c2.oid = i.indexrelid
           ORDER BY c2.relname;
    relname     | relpages 
----------------+----------
 ctetest_id_idx |     2198
(1 row)

 

查看指定schema 裏全部的索引大小,按從大到小的順序排列。

=# select * from pg_namespace;

或者

查看全部的索引大小,按從大到小的順序排列。

=# select indexrelname, pg_size_pretty(pg_relation_size(relid)) from pg_stat_user_indexes where schemaname='public' order by pg_relation_size(relid) desc;

 

查看索引

select * from pg_indexes where tablename='tbname';     

或者    

select * from pg_statio_all_indexes where relname='tbname';

建立索引

create index  tbl_bb_index  on  tbl_bb(id,name);

注:tbl_bb  位表名稱,  tbl_bb_index  爲建立的索引名稱,  id 和 name 爲 表裏的字段

刪除索引

DROP INDEX index;  

index是要刪除的索引名

注意 : 沒法刪除DBMS爲主鍵約束和惟一約束自動建立的索引

 

測試數據基數約等於行數的狀況下(IN語句中的數據量大小爲20)

EXPLAIN ANALYSE SELECT id, name, password, description FROM test_100000 WHERE name IN (
  SELECT name FROM test_1000000 LIMIT 20
);

 

查Postgresql 數據庫、各表佔用磁盤大小

統計各數據庫佔用磁盤大小:

SELECT d.datname AS Name,  pg_catalog.pg_get_userbyid(d.datdba) AS Owner,
    CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
        THEN pg_catalog.pg_size_pretty(pg_catalog.pg_database_size(d.datname))
        ELSE 'No Access'
    END AS SIZE
FROM pg_catalog.pg_database d
    ORDER BY
    CASE WHEN pg_catalog.has_database_privilege(d.datname, 'CONNECT')
        THEN pg_catalog.pg_database_size(d.datname)
        ELSE NULL
    END DESC -- nulls first
    LIMIT 20;

統計數據庫中各表佔用磁盤大小:

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
ORDER BY
    pg_total_relation_size('"' || table_schema || '"."' || table_name || '"') DESC;

 

查詢某個字段屬於哪一個表

SELECT * FROM information_schema. COLUMNS WHERE COLUMN_NAME = 'storename';
SELECT c.relname AS "表名",a.attname AS "字段名",c.oid FROM pg_class c LEFT JOIN pg_attribute a ON a.attrelid = c.oid WHERE c.relname NOT LIKE 'pg_%' -- AND c.relname =  'kx_store' AND a.attname = 'storename';

 

查詢當前數據庫下的全部模式

SELECT * FROM information_schema.schemata;

 

查詢慢SQL

第一種方法是使用pg_stat_statements插件定位慢SQL,步驟以下

create extension pg_stat_statements;
select pg_stat_reset();
select pg_stat_statements_reset();

查詢最耗時的SQL(通常就是致使問題的直接緣由)。

select * from pg_stat_statements order by total_time desc limit 5;

查詢讀取Buffer次數最多的SQL,這些SQL可能因爲所查詢的數據沒有索引,而致使了過多的Buffer讀,也同時大量消耗了CPU。

select * from pg_stat_statements order by shared_blks_hit+shared_blks_read desc limit 5;

第二種方法是,直接經過pg_stat_activity視圖,利用下面的查詢,查看當前長時間執行,一直不結束的SQL。這些SQL對應形成CPU滿,也有直接嫌疑。

select datname, usename, client_addr, application_name, state, backend_start, xact_start, xact_stay, query_start, query_stay, replace(query, chr(10), ' ') as query from (select pgsa.datname as datname, pgsa.usename as usename, pgsa.client_addr client_addr, pgsa.application_name as application_name, pgsa.state as state, pgsa.backend_start as backend_start, pgsa.xact_start as xact_start, extract(epoch from (now() - pgsa.xact_start)) as xact_stay, pgsa.query_start as query_start, extract(epoch from (now() - pgsa.query_start)) as query_stay , pgsa.query as query from pg_stat_activity as pgsa where pgsa.state != 'idle' and pgsa.state != 'idle in transaction' and pgsa.state != 'idle in transaction (aborted)') idleconnections order by query_stay desc limit 5;

 

 

 

 

PostgreSQL CPU佔用100%性能分析及慢sql優化 :https://www.cnblogs.com/ilifeilong/p/8488119.html

相關文章
相關標籤/搜索