一、準確理解tuple(元組)的概念
我們經常可以看到tuple這個術語,tuple是指數據行的一個物理版本,可以通過表的隱藏系統列ctid、xmin、 xmax來進行觀察。
tuple = row version
在PG里,update相當于delete + insert,但也有差異,可以參考文章PostgreSQL(update ≈ delete + insert)
二、初始化時打開checksums
數據完整性是任何數據庫必須首要保證的,PG里可以使用-k或者–data-checksums打開數據校驗和。
$ initdb -D pgdata -k
還可以使用pg_checksums工具(12版本引入)進行開關控制:開啟(-e,–enable)和關閉(-d,–disable)
如果備份的數據有損壞,還可以使用pg_verifybackup工具進行檢測。
三、跨庫訪問需重新連接
PG里可以創建多個database,每個連接同一時刻只能連一個database,訪問不同的數據庫需要切換連接。
當我們安裝擴展插件時,如果需要多個database都可以使用,那每個database下都需要創建一遍。
四、xlog不能刪除
xlog不是普通log,不能刪除!
xlog不是普通log,不能刪除!
xlog不是普通log,不能刪除!
總有客戶詢問pg_xlog目錄下的文件是否可以刪除,xlog從版本10開始正式重命名為wal,不需要我們手工干預。
如果該目錄占用磁盤空間較大,需要檢查wal配置參數是否合理或者復制槽狀態是否正常、歸檔是否正常。
五、按需設置日志項并合理輸出
log_destination參數可設置多種輸出源
log_destination='stderr,csvlog,jsonlog'
如果需要對日志內容精簡條目,需要注意log_destination與log_line_prefix同時設置
log_destination='stderr'
log_line_prefix = '%m %u %d %p'
- %m是帶毫秒的時間戳
- %u是用戶名
- %d是數據庫名
- %p是進程ID
日志文件的覆蓋策略以及一些開關項我們也需要平衡觀測性與負載壓力。
六、truncate操作應按DML進行配置
PG里配置log_statement日志參數、觸發器和邏輯復制時都需要按照DML分類進行配置。
七、使用tmux工具高效搭配psql

linux環境下使用tmux工具搭配psql可以方便的進行多窗口及分屏,提高工作效率。
八、autovacuum調優
autovacuum進程在后臺幫我們清理舊數據以便空間重用,還包括更新表的統計信息以及防止事物ID回卷的工作。
當數據庫的負載較高時,可以進行如下調優:
- 使其資源充沛:例如活躍的db較多,則增大autovacuum_max_workers,同時需要注意調小autovacuum_work_mem,不然直接使用maintenance_work_mem,內存可能會占用過大。
- 使其觸發更頻繁:例如大表vacuum觸發參數autovacuum_vacuum_scale_factor,默認值為20%,可以調低為2%
九、定期維護索引
隨著DML操作表數據的不斷變化,索引分裂及檢索低效問題變得突出,查詢性能逐漸變差,此時對索引需要做兩方面的工作:
- 需要重建索引:reindex concurrently
- 移除不用或者很少使用的索引:監控pg_stat_user_indexes視圖的idx_scan以及last_idx_scan(16版本)
十、善用PG關鍵字
using關鍵字
當我們做多張表的join連接時,如果join字段的名稱相同可以使用using關鍵字來簡化語句
select ...
from t1
join t2
on t1.id = t2.id;
可以改寫為:
select ...
from t1
join t2
using (id);
多個字段還可以使用逗號進行分隔:
on t1.a = t2.a and t1.b = t2.b
改寫為
using (a,b);
returning關鍵字
使用returning關鍵字可以改變數據操作的行為。
例如我們可以插入新數據,并在一次會話連接中取回值。
insert into tasks (
status, owner, name
) values (
'open', 'tpetry', 'Create Example'
)
returning *;
當我們更新完數據行后還需要繼續處理這些數據行時,可以使用returning更改工作流程返:在所有數據行更新完成后再返回它們,然后我們可以繼續對返回的數據進行處理。
update tasks
set owner = NULL
where owner = 'tpetry' and status = 'open'
returning *;
大多數應用程序都允許用戶請求刪除數據記錄,但系統也需要對刪除記錄進行一些跟蹤處理。
delete FROM tasks
where status = 'finished'
returning *;
參考鏈接
https://postgres.ai/blog/20230722-10-postgres-tips-for-beginners
http://m.sunline.cc/db/100292
http://m.sunline.cc/db/610845
最后歡迎大家關注本人即將出版的新書:<<快速掌握PostgreSQL版本新特性>>,書稿簡介可以參考我寫的這篇文章:PostgreSQL版本新特性順利完稿
對本書感興趣的朋友,可以加我微信入群,后續一起學習討論。





