日志功能

记录慢查询语句

开启慢查询记录功能,执行时间等于或者大于 log_min_duration_statement 设置值的语句会被记录:

ALTER database postgres SET log_min_duration_statement = '250ms';

设置日志记录的语句类型

使用 log_statement 选项设置日志记录的语句类型:

ALTER DATABASE postgres SET log_statement = 'all';

有效的取值包括 all、ddl、none 以及 mod。

记录锁等待事件

当数据库出现锁等待事件时记录日志:

ALTER DATABASE postgres SET log_lock_waits = 'on';

性能技巧

设置语句的执行超时时间

设置语句的执行超时可以阻止超长运行的语句。超时时间可以基于数据库、用户或者会话进行设置。推荐设置一个全局的超时时间,然后根据需要为具体用户或者会话设置特殊的超时时间。

ALTER DATABASE mydatabase SET statement_timeout = '60s';

查找占用资源最多的查询和进程

pg_stat_statements 插件可以帮助我们发现消耗资源最多的查询和进程。

# create extension pg_stat_statements;SELECTtotal_exec_time,mean_exec_time as avg_ms,calls,query
FROM pg_stat_statements
ORDER BY mean_exec_time DESC
LIMIT 10;

监控数据库连接

以下查询可以按照状态返回数据库连接的数量:

SELECT count(*),state
FROM pg_stat_activity
GROUP BY state;

如果空闲(idle)连接数量超过了 20,推荐使用连接池,例如 PgBouncer。

查看表的大小

使用以下语句查看表的文件大小:

SELECT pg_relation_size('table_name');-- 更好的显示格式
SELECT pg_size_pretty(pg_relation_size('table_name'));

查看全部表的大小

以下查询返回了数据库中全部表的大小,从大到小进行排序:

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

检查未使用的索引

使用以下查询返回未被使用的索引,按照索引大小降序排列。

SELECT schemaname || '.' || relname AS table,indexrelname AS index,pg_size_pretty(pg_relation_size(i.indexrelid)) AS "index size",idx_scan as "index scans"
FROM pg_stat_user_indexes ui
JOIN pg_index i ON ui.indexrelid = i.indexrelid
WHERE NOT indisuniqueAND idx_scan < 50AND pg_relation_size(relid) > 5 * 8192
ORDER BY pg_relation_size(i.indexrelid) / nullif(idx_scan, 0) DESC NULLS FIRST,pg_relation_size(i.indexrelid) DESC;

评估表中的数据量

基于内部统计信息返回表中的近似数据量,可以用于替代大表的 SELECT count(*) 查询。

SELECT reltuples::numeric as count
FROM pg_class
WHERE relname='table_name';

非阻塞式的索引创建

创建索引时使用 CONCURRENTLY 选项可以避免获取表上的锁,该选项不能在事务中使用。

CREATE INDEX CONCURRENTLY foobar ON foo (bar);

PSQL 命令

自动记录查询占用的时间

返回每次查询占用的时间,包括网络传输时间。

\timing

可以利用 .psqlrc 文件实现默认配置。

自动格式化查询结果

提高查询结果的可读性:

\x auto

调用文本编辑器

变量 $EDITOR 用于设置一个默认的文本编辑器,输入以下命令可以打开并编辑最后一次执行的查询语句。

\e

保存并关闭编辑器之后,数据库会执行保存的查询语句。

设置空值的显示内容

将空值 null 显示为其它字符,方便区分空值和空字符串。

\pset null ⛔

保存查询历史

为指定数据库设置一个保存查询历史的本地文件:

\set HISTFILE ~/.psql_history-:DBNAME

显示内部命令对应的查询语句

psql 命令行选项 -E(–echo-hidden)可以显示内部命令(例如 \dt mytable)生成的查询语句:

psql -E

只返回结果数据

psql 命令行的 -qtA 选项表示以静默模式运行查询,以非对齐的格式返回结果,并且只返回数据。该选项和 -c 选项结合使用,可以用于脚本文件获取查询结果。

psql -qtA

以 HTML 表格形式返回结果

psql 命令行的 -qtH 选项表示以静默模式运行查询,以 HTML 表格形式返回结果,并且只返回数据。

psql -qtH

清理屏幕

以下命令可以实现清屏:

\! clear

连续运行一个查询语句

以下命令可以每间隔 2 秒自动执行一次最后的查询语句并显示结果:

\watch

回退到上一个语句

在交互模式下,设置以下命令可以在执行出错时自动回退到上一个语句执行之前:

\set ON_ERROR_ROLLBACK interactive

直接导出 CSV 格式

连接数据库时,指定 --csv 选项和查询语句可以运行查询并以 CSV 格式输出查询结果。

psql <connection-string> --csv -c 'select * from test;'

运行脚本文件

以下命令可以在 psql 中执行一个脚本文件:

\i filename

设置清晰的边界

以下命令可以在 psql 中为查询结果设置一个显示边界:

\pset border 2

将 linestyle 设置为 unicode

将 linestyle 设置为 unicode 时,结合上面的配置可以获得更清晰的显示格式:

\pset linestyle unicode

SQL 功能

替换空值

coalesce 函数可以将空值转换为指定的字符串:

SELECT id, coalesce(ip, 'no IP')
FROM logs;

生成序列数据

generate_series 函数可以生成一个指定间隔的数据序列,包括数字和时间戳。

SELECT * FROM
generate_series(now() - '3 month'::interval, now(), '1 day');

截断日期

date_trunc 函数可以将日期数据截断为指定的精度,例如月份、星期、日、小时、分钟。

SELECT date_trunc('day', now());

时间数据的加减运算

时间戳数据可以直接加减一个时间间隔:

SELECT now() - '1 month'::interval;

暂停会话进程

pg_sleep 函数可以将当前会话进程暂停指定的时间:

select pg_sleep(2.5);

实用命令

创建只读用户

系统角色 pg_read_all_data 可以用于读取所有的数据表:

GRANT pg_read_all_data TO username;

终止指定用户的后台进程

使用以下查询终止用户“test”的所有后台进程:

WITH pids AS (SELECT pidFROM pg_stat_activityWHERE usename='test'
)
SELECT pg_terminate_backend(pid)
FROM pids;

取消指定用户正在运行的 SQL 语句

以下查询可以取消用户“test”正在运行的所有 SQL 查询,回滚未提交的事务:

WITH pids AS (SELECT pid FROM pg_stat_activity WHERE username='test'
)
SELECT pg_cancel_backend(pid)
FROM pids;

PostgreSQL实用技巧相关推荐

  1. 深度学习11个实用技巧

    深度学习11个实用技巧 深度学习工程师George Seif发表了一篇博文,总结了7个深度学习的技巧,本文增加了几个技巧,总结了11个深度学习的技巧,主要从提高深度学习模型的准确性和速度两个角度来分析 ...

  2. 【老鸟分享】Linux命令行终端提示符多种实用技巧!

    1.Linux命令行提示符简介 众所周知,Linux命令行是系统管理员管理Linux的重要手段,我们管理Linux,首先要面对的就是Linux命令行提示符. Linux命令行结尾的提示符有" ...

  3. 经典 | 深度学习的7大实用技巧

    编译 | AI科技大本营 参与 | 林椿眄 编辑 | 谷 磊 对于许多具有挑战性的现实问题,深度学习已经成为最有效的解决方法. 例如,对于目标检测,语音识别和语言翻译等问题,深度学习能够表现出最佳的性 ...

  4. 深度学习七个实用技巧

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 深度学习已经成为解决许多具有挑战性的现实世界问题的方法.对目标检测 ...

  5. Python大神用的贼溜,9个实用技巧分享给你

    来源:数据分析1480 本文约3000字,建议阅读6分钟 本文为你介绍一些关于python的实用技巧. 本文会试着介绍一些其它文章没有提到的小技巧,这些小技巧也是我平时会用到的的.让我们一探究竟吧! ...

  6. 5 个针对有经验用户的 Vim 实用技巧

    Vim 编辑器提供了很多的特性,要想全部掌握它们很困难.然而,花费更多的时间在命令行编辑器上总是有帮助的.毫无疑问,和 Vim 用户们进行交流能够让你更快地学习新颖有创造性的东西. 注: 本文中用到的 ...

  7. ES6的几个实用技巧,你了解吗?

    本文给大家分享了es6的几个实用技巧,非常不错,具有参考借鉴价值,感兴趣的朋友一起学习吧 Hack #1 交换元素 利用 数组解构来实现值的互换 let a = 'world', b = 'hello ...

  8. 在此处打开命令窗口_这样操作方便多了!简单DOS命令实用技巧详解

    分享简单DOS命令实用技巧,让我们的工作.生活更加方便快捷.小编致力于分享分享智能数码.弱电组网.电脑软硬件资讯及实用技巧. 先跟着小编一起来了解一下DOS命令是一个什么样子的存在?技术大牛,请忽略, ...

  9. Windows2003实用技巧

    Windows2003实用技巧七则 一.跳过磁盘检修等待时间 一旦计算机因意外原因,例如突然停电或者死机的话,那么计算机下次重新启动的话,系统就会花10秒钟左右的时间,来运行磁盘扫描程序,检查磁盘是否 ...

最新文章

  1. 会计的思考(36):会计--企业运营的数码相机
  2. Android之View和SurfaceView
  3. DYNP_VALUES_READ
  4. 快为网易云官网出谋划策,5步轻松获得网易味央猪肉!
  5. 程序员是向左走,还是向右走!
  6. 带你揭开IP地址的神秘身份
  7. 千图成像_两分钟教你玩转千图成像Part1~
  8. 大数据时代,数据分析师的职业发展规划
  9. day10、2 - 小小综合实验升级
  10. 如何验证白光干涉仪精度丨科普篇
  11. 企业搭建APP怎么正确选择云服务器配置?
  12. 0x80073712_处理win10更新提示错误代码“0x80073712”的方法
  13. appium重启报错:Could not proxy command to the remote server. Original error: socket hang up
  14. 最全ASCII对应码表-键值
  15. 2021年山东大学程序设计精英挑战赛 真题
  16. 了解 HTTPS(二) —— 通信加密
  17. 企业网站自动生成系统的设计和实现
  18. WORM_DOWNAD.AD病毒清除记
  19. linux firefox45,Firefox 45.0.2 发布,修复视频播放崩溃
  20. c语言挖宝游戏,[推荐][传承]挖宝秘籍 铲子在手宝躲我有

热门文章

  1. 利用LWF方法解决灾难性遗忘
  2. 国内应用市场三宗罪 山寨吸费侵隐私
  3. HIEX交易所登陆币圈市场,新版升级模式能否创造神话?
  4. 奔跑吧Linux内核最新目录
  5. cocos植物大战僵尸(四)选择植物卡片:植物卡片类
  6. vs2017 增加平台集
  7. 2030年全球工业物联网总投资将达60万亿美元
  8. Facebook重提“元宇宙”:做游戏,本质还是做社交
  9. java reuse_JAVA reuse
  10. 开源中国社区----我的学习之旅