开始学习 PostgreSQL 调优
我第一次实习时需要对PosgreSQL进行调优,所以我会列举一些可能有用的方法。
我们选择了预计在2024年之前仍有广泛使用的PostgreSQL 12作为支持结束的对象。
(仅供参考)
桌子信息
-- テーブル一覧を表示
\dt
-- テーブルの詳細情報を表示
\d /* table_name */
特别是/* table_name */非常重要。它可以显示表的列清单,还可以检查正规化的状态。
由於索引一覽也會顯示出來,所以如果想要建立索引,首先應考慮是否能夠利用現有的索引來解決問題。例如,可以考慮進行列的排序變更等操作。
注意避免過度創建索引對性能造成影響。
实施计划
(仅供参考)
我想专注于执行计划中可能花费时间较长的部分,这对于进行SQL的基本调优非常重要。
获得方式
-- insert,update,deleteの場合は前後のbegin;rollback;を忘れずに実行する
-- BEGIN;
EXPLAIN ANALYZE /* SQL文 */;
-- ROLLBACK;
看法
首先,查看层次结构。
从上层到下层,对每一行进行循环并执行操作。
将每一行的处理内容与实际的SQL进行对照。
-
- time: 処理時間
- rows: 選択されている件数
如果时间很大,可能会出现瓶颈。
如果行数很多,重复次数会增加。
可以像每次都要谷歌一样去了解各种处理的含义。
了解联接处理的嵌套循环、散列和合并的特性可能会更容易上手。
分析,清洁
(仅供参考)
ANALYZE是为了得到关于实际数据存储情况的统计信息,以便获得适当的执行计划。
VACUUM是用于物理上删除不再需要的行,例如在delete和update操作之后。
如果通常执行无法满足要求,可以选择各种强大的执行选项(词汇力),例如使用VACUUM的FULL选项,它会完全复制表格,得到一个全新整齐排列的表格。(但需要排他锁,并且需要较长时间执行。)
执行步骤
-- VACUUM,ANALYZEはそれぞれ単品実行できる
VACUUM ANALYZE /* table_name */ /* column_name */;
系统目录
(仅供参考)
从公式文件中
系统目录是一个存储关系型数据库管理系统的表、列等模式元数据和内部信息的地方。
我将列举以下可能用于调整的项目。
统计数据
(仅供参考)
执行分析后的结果将被保存。
pg_statistics是底层表,pg_stats是供普通用户使用的视图。
一般来说,使用pg_stats应该没有问题。
根据统计信息的名字,通常是指获取相对于表格的统计数据的形象描述。例如,记录列值的分布情况的直方图等。
由于优化器的自动操作,我认为没有太多机会去仔细查看。
当想要进行全力调优时,如果不了解数据的分布,就无法选择适当的索引和执行计划。
pg_locks- PostgreSQL锁
(仅供参考)
可以查看当前的锁状态。
了解表级、行级等锁的类型似乎会更好。
过大的锁可能是事故的原因。
死锁似乎需要重新审视处理的顺序。
统计信息收集器
(仅供参考)
在 pg_stat_database 中,您可以查看数据库上的事务执行次数、缓存命中块数等与表格统计信息不同的统计信息。
定期检查可以确认一周的倾向,例如星期几和时间段。这对于整个数据库的调优是必要的。目前还不确定是否可以用于SQL调优。
以下是OSS-DB Gold考试范围的内容。看一下可能会有好处。
pg_stat_activity、pg_stat_database
pg_stat_all_tables等,就是查询级别的统计信息
pg_statio_all_tables等,就是块级别的统计信息
pg_stat_archiver (归档统计)
pg_stat_bgwriter (后台写入统计)
待机事件 (pg_stat_activity.wait_event)
pg_stat_progress_vacuum (空闲进度统计)
提示句 jù)
(仅供参考)
当优化程序不听话的时候,点燃它时要祈祷的那个东西。请注意它不是官方的,而是外部模块。
插入、更新的开销
(仅供参考)
当数据迁移等操作频繁执行insert和update时,应减少开销。具体而言,开销指的是
-
- インデックスにもinsert(updateも内部的にdelete→insertしている、はず)
- 制約の条件を満たしているか照合(一意制約、外部キー制約)
可以参考以下网址等等。其余内容可以在参考网址查找(委派他人处理)。
其他
SQL相关书籍的目录
如果以目录的级别回忆起来,可能会有好事发生(祈祷)。
如果有时间的话,想要重新阅读书籍。
投影片
我认为有很多不同的选择,但就目前而言,我在路上找到了这个。