F.29. pg_stat_statements

pg_stat_statementsģ���ṩһ�ַ���׷��һ����������ִ�е����� SQL ����ִ��ͳ����Ϣ��

��ģ�����ͨ����postgresql.conf��shared_preload_libraries������pg_stat_statements�����룬��Ϊ����Ҫ����Ĺ����ڴ档����ζ�����ӻ��Ƴ���ģ����Ҫһ�η�����������

��pg_stat_statements������ʱ��������ٸ÷����� ���������ݿ��ͳ����Ϣ����ģ���ṩ��һ����ͼ pg_stat_statements�Լ�����pg_stat_statements_reset ��pg_stat_statements���ڷ��ʺͲ�����Щͳ����Ϣ����Щ��ͼ �ͺ�������ȫ�ֿ��õģ����ǿ�����CREATE EXTENSION pg_stat_statements Ϊ�ض����ݿ��������ǡ�

F.29.1. pg_stat_statements��ͼ

�ɸ�ģ���ռ���ͳ����Ϣ����ͨ��һ����Ϊ pg_stat_statements����ͼʹ�á������ͼΪÿ һ�������ֵ����ݿ� ID���û� ID �Ͳ�ѯ ID����ൽ��ģ�����׷ �ٵĿ�������������������϶�����һ�С�����ͼ������ �� F-22����ʾ��

�� F-22. pg_stat_statements��

����������������
useridoidpg_authid.oidִ�и������û��� OID
dbidoidpg_database.oid������ִ�и��������ݿ�� OID
queryidbigint ï¿½Ú²ï¿½ï¿½ï¿½Ï£ï¿½ë£¬ï¿½ï¿½ï¿½ï¿½ï¿½Ä½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
querytext ï¿½ï¿½ï¿½ï¿½ï¿½Ä±ï¿½ï¿½ï¿½Ê½
callsbigint ï¿½ï¿½Ö´ï¿½ÐµÄ´ï¿½ï¿½ï¿½
total_timedouble precision ï¿½Ú¸ï¿½ï¿½ï¿½ï¿½ï¿½Ð»ï¿½ï¿½Ñµï¿½ï¿½ï¿½Ê±ï¿½ä£¬ï¿½Ôºï¿½ï¿½ï¿½ï¿½
min_timedouble precision ï¿½Ú¸ï¿½ï¿½ï¿½ï¿½ï¿½Ð»ï¿½ï¿½Ñµï¿½ï¿½ï¿½Ð¡Ê±ï¿½ä£¬ï¿½Ôºï¿½ï¿½ï¿½ï¿½
max_timedouble precision ï¿½Ú¸ï¿½ï¿½ï¿½ï¿½ï¿½Ð»ï¿½ï¿½Ñµï¿½ï¿½ï¿½ï¿½Ê±ï¿½ä£¬ï¿½Ôºï¿½ï¿½ï¿½ï¿½
mean_timedouble precision ï¿½Ú¸ï¿½ï¿½ï¿½ï¿½ï¿½Ð»ï¿½ï¿½Ñµï¿½Æ½ï¿½ï¿½Ê±ï¿½ä£¬ï¿½Ôºï¿½ï¿½ï¿½ï¿½
stddev_timedouble precision ï¿½Ú¸ï¿½ï¿½ï¿½ï¿½ï¿½Ð»ï¿½ï¿½ï¿½Ê±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½×¼Æ«ï¿½î£¬ï¿½Ôºï¿½ï¿½ï¿½ï¿½
rowsbigint ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½Ó°ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
shared_blks_hitbigint ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ÉµÄ¹ï¿½ï¿½ï¿½ï¿½é»ºï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
shared_blks_readbigint ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È¡ï¿½Ä¹ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
shared_blks_dirtiedbigint ï¿½ï¿½ï¿½ï¿½ï¿½Åªï¿½ï¿½Ä¹ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
shared_blks_writtenbigint ï¿½ï¿½ï¿½ï¿½ï¿½Ð´ï¿½ï¿½Ä¹ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
local_blks_hitbigint ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ÉµÄ±ï¿½ï¿½Ø¿é»ºï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
local_blks_readbigint ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È¡ï¿½Ä±ï¿½ï¿½Ø¿ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
local_blks_dirtiedbigint ï¿½ï¿½ï¿½ï¿½ï¿½Åªï¿½ï¿½Ä±ï¿½ï¿½Ø¿ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
local_blks_writtenbigint ï¿½ï¿½ï¿½ï¿½ï¿½Ð´ï¿½ï¿½Ä±ï¿½ï¿½Ø¿ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
temp_blks_readbigint ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½È¡ï¿½ï¿½ï¿½ï¿½Ê±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
temp_blks_writtenbigint ï¿½ï¿½ï¿½ï¿½ï¿½Ð´ï¿½ï¿½ï¿½ï¿½ï¿½Ê±ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½
blk_read_timedouble precision  ����仨�ڶ�ȡ���ϵ���ʱ�䣬�Ժ���ƣ����track_io_timing�����ã�����Ϊ�㣩
blk_write_timedouble precision  ����仨��д����ϵ���ʱ�䣬�Ժ���ƣ����track_io_timing�����ã�����Ϊ�㣩

���ڰ�ȫ��ԭ�򣬷dz����û������������������û�ִ�еIJ�ѯ �� SQL �ı�����queryid�� �������������ͼ����װ�����ǵ����ݿ��У����Ǿ��ܹ�����ͳ ����Ϣ��

ֻҪ�ɹ滮�IJ�ѯ����SELECT��INSERT��UPDATE�Լ�DELETE������һ���ڲ���ϣ���������ͬ�IJ�ѯ�ṹ�����Ǿͻᱻ��ϵ�һ����һ��pg_stat_statements�ͨ�������������Ŀ�ģ����������ѯ���˲�ѯ�е��ı�����ֵ֮���������ϵ�Ч�����ǽ��ᱻ��Ϊ����ͬ�ġ��������������������������������ϸ�������ǵ��ı���ѯ�ַ���Ϊ�������бȽϡ�

��Ϊ�˰�һ����ѯ��������ѯƥ�䣬����ֵ�ᱻ���ԣ���pg_stat_statements��ʾ�����ᱻһ��?���滻����ѯ�ı���ʣ�ಿ�־��Ǿ������pg_stat_statements����ص��ض�queryid��ϣֵ�ĵ�һ����ѯ���ı���

��ijЩ����У��������Բ�ͬ�ı��IJ�ѯ���ܻᱻ�ںϵ�һ����һ��pg_stat_statements�ͨ����ֻ�ᷢ��������ȼ۵IJ�ѯ���ϣ�����Ҳ�к�С�Ļ�����Ϊ��ϣ��ײ��ԭ�����޹صIJ�ѯ���ںϵ�һ�����У��������������ڲ�ͬ�û������ݿ�IJ�ѯ��˵���ᷢ�������������

����queryid��ϣֵ�Ǹ��ݲ�ѯ�������ͷ�����ı������ģ����������Ҳ���ܴ��ڣ����������ͬ�ı��IJ�ѯ���ڲ������粻ͬ��search_path���ã���ԭ������в�ͬ�ĺ��壬���ǾͿ�����Ϊ��ͬ������ڡ�

pg_stat_statements��ʹ���߿���ϣ��ʹ�� queryid��Ҳ������dbid��userid��ϣ���Ϊһ����Ȳ�ѯ�ı����ȶ��Ϳɿ��ı�ʶ�������ǣ���һ�����Ҫ���ǣ�����queryid��ϣֵ�ȶ���ֻ�����޵ı��ϡ���Ϊ�ñ�ʶ���Ǵӽ�����������������ģ�����ֵ����������ʽ���ֵ��ڲ������ʶ���ĺ���������һЩΥ��ֱ���ĺ��塣���磬�����������ѯ������ͬһ���������Ǹñ������β�ѯ֮�䱻ɾ�������ؽ�����Ȼ��������ѯ����ȫһ�µģ�����pg_stat_statements����������Ϊ�Dz�ͬ�ġ���ϣ����Ҳ�Ի����ܹ��Լ�ƽ̨����������IJ������С�����һ������ΪPostgreSQL�IJ�ͬ���汾֮��queryid���ᱣ���ȶ��Dz���ȫ�ġ�

���ݾ��飬ֻ���ڵײ�������汾�Լ�Ŀ¼Ԫ����ϸ�ڱ�����ȫ��ͬʱ��queryidֵ���ܱ��ٶ�Ϊ�ȶ����ҿɱȡ���̨���뵽�������� WAL �طŵĸ����еķ����������ͬ�IJ�ѯ����һ����queryidֵ�����ǣ��߼�����ģʽ������֤���������ϸ���϶�������ȫһ���ĸ��ƣ�������߼����ƻ�֮��������ʱ��queryid������һ�����õı�ʶ������������ʣ��Ƽ�ֱ�ӽ��в��ԡ�

�д����ԵIJ�ѯ�ı���������һ���ⲿ�����ļ��У����Ҳ������Ĺ����ڴ档 ��ˣ������Ǻܳ��IJ�ѯ�ı�Ҳ�ܱ��ɹ��Ĵ洢����������������ۻ��˺ܶ� ���IJ�ѯ�ı������ⲿ�ļ�Ҳ���������ܴ���Ϊһ�ָֻ���������������� ���������pg_stat_statements���ܻ�ѡ������Щ��ѯ�ı��� ����pg_stat_statements��ͼ�е��������������ʾ�յ� query�򣬲�����ÿ��queryid������� ͳ����Ϣ�ᱻ�����������������������������Կ��Ǽ�С pg_stat_statements.max����ֹ������

F.29.2. ����

pg_stat_statements_reset() ���� void

pg_stat_statements_reset����Ŀǰ��pg_stat_statements�ռ�������ͳ����Ϣ��Ĭ������£��������ֻ�ܱ������û�ִ�С�

pg_stat_statements(showtext boolean) returns setof record

pg_stat_statements��ͼ����һ��Ҳ�� pg_stat_statements�ĺ��������塣�ͻ��˿���ֱ�ӵ��� pg_stat_statements����������ͨ��ָ�� showtext := false�����Բ�ѯ�ı���������Ӧ����ͼ�� query�е�OUT���������ؿ�ֵ���� ���������Ϊ��֧�ֲ����ظ����ճ��Ȳ����IJ�ѯ�ı����ⲿ���߶���Ƶġ� ���๤�߿���ת�����л����һ���۲쵽�IJ�ѯ�ı�����Ϊ����� pg_stat_statements�Լ�������ȫ������������ֻ����Ҫ�� ʱ�������ѯ�ı�����Ϊ��������Ѳ�ѯ�ı��洢��һ���ļ��У����ַ����� �Խ����ظ����pg_stat_statements���ݵ� ���� I/O��

F.29.3. ����

pg_stat_statements.max (integer)

pg_stat_statements.max���ɸ�ģ����ٵ����������Ŀ����pg_stat_statements��ͼ���е����������������۲⵽�Ŀ����ֵ���䳬��������������ٱ�ִ�е�������Ϣ���ᱻ������Ĭ��ֵΪ 5000���������ֻ���ڷ���������ʱ���á�

pg_stat_statements.track (enum)

pg_stat_statements.track������Щ���ᱻ��ģ�������ָ��top���Ը��ٶ�����䣨��Щֱ���ɿͻ��˷�������䣩��ָ��all�����Ը���Ƕ�׵���䣨�����ں����е��õ���䣩��ָ��none���Խ������ͳ����Ϣ�ռ���Ĭ��ֵ��top�� ֻ�г����û��ܹ��ı�������á�

pg_stat_statements.track_utility (boolean)

pg_stat_statements.track_utility���Ƹ�ģ���Ƿ����ٹ���������������dz���SELECT��INSERT�� UPDATE��DELETE֮�����е��������Ĭ��ֵ��on�� ֻ�г����û��ܹ��ı�������á�

pg_stat_statements.save (boolean)

pg_stat_statements.saveָ���Ƿ��ڷ������ر�֮�󻹱������ͳ����Ϣ�����������Ϊoff����ô�رպ󲻱���ͳ����Ϣ�����ڷ���������ʱҲ������������ͳ����Ϣ��Ĭ��ֵΪon���������ֻ����postgresql.conf�ļ��л����ڷ����������������á�

��ģ��Ҫ����pg_stat_statements.max�ɱ����Ķ��⹲���ڴ档ע��ֻҪ��ģ�鱻����ͻ�������ô����ڴ棬����pg_stat_statements.track������Ϊnone��

��Щ����������postgresql.conf�����á����͵��÷������ǣ�

# postgresql.conf
shared_preload_libraries = 'pg_stat_statements'

pg_stat_statements.max = 10000
pg_stat_statements.track = all

F.29.4. ʾ�����

bench=# SELECT pg_stat_statements_reset();

$ pgbench -i bench
$ pgbench -c10 -t300 bench

bench=# \x
bench=# SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit /
               nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
          FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5;
-[ RECORD 1 ]---------------------------------------------------------------------
query       | UPDATE pgbench_branches SET bbalance = bbalance + ? WHERE bid = ?;
calls       | 3000
total_time  | 9609.00100000002
rows        | 2836
hit_percent | 99.9778970000200936
-[ RECORD 2 ]---------------------------------------------------------------------
query       | UPDATE pgbench_tellers SET tbalance = tbalance + ? WHERE tid = ?;
calls       | 3000
total_time  | 8015.156
rows        | 2990
hit_percent | 99.9731126579631345
-[ RECORD 3 ]---------------------------------------------------------------------
query       | copy pgbench_accounts from stdin
calls       | 1
total_time  | 310.624
rows        | 100000
hit_percent | 0.30395136778115501520
-[ RECORD 4 ]---------------------------------------------------------------------
query       | UPDATE pgbench_accounts SET abalance = abalance + ? WHERE aid = ?;
calls       | 3000
total_time  | 271.741999999997
rows        | 3000
hit_percent | 93.7968855088209426
-[ RECORD 5 ]---------------------------------------------------------------------
query       | alter table pgbench_accounts add primary key (aid)
calls       | 1
total_time  | 81.42
rows        | 0
hit_percent | 34.4947735191637631

F.29.5. ����

Takahiro Itagaki ��Peter Geoghegan Ϊ�������˲�ѯ���滯�Ĺ��ܡ�