PostgreSQL 查詢優化與維護命令

2021-10-13 14:12:59 字數 1486 閱讀 1569

不同rdbms中提供的不同型別統計功能,查詢優化器和查詢計畫器依賴統計資訊選擇並生成最佳查詢執行計畫,因此它非常重要。

postgresql 資料庫也管理不同型別的統計,查詢優化器依賴它們生成最佳查詢執行計畫。

假設有一張表有100000行記錄,但表統計資料沒有更新,僅顯示1000個元組資訊。

查詢優化器總是檢視統計表,而從不直接檢視實際表檔案。

這是,生成的查詢執行計畫依賴1000行資訊,但實際有100000行。

postgresql 資料庫有兩個統計表:

select *from pg_class;

select *from pg_stats;

我們可以查詢這些表,獲取表、索引、頁等資訊。我們可以查詢pg_class表中的reltuples列,把它和實際表中記錄數進行對比。如何兩者不匹配,那麼統計表資訊沒有更新。

當你發現統計資訊沒有更新,可以在資料庫或表上執行analyze 命令。執行命令之後,統計表會被更新。

analyze table_name;
下面詳細介紹常用的維護命令:vacuum, vacuum full 和 analyze。

vacuum, vacuum full 和 analyze 是postgresql維護相關的命令,因為postgresql是基於mvcc架構,每個更新或刪除會產生刪除記錄碎片。

vacuum **已舊版本記錄的占用空間。

mcvv 機構中刪除的記錄不是物理刪除,它們在執行vacuum命令之前仍儲存在磁碟上。

如果你頻繁在表上執行update/delete操作,則會產生碎片,必須要執行vacuum命令。vacuum命令無需表的排他鎖。

vacuum table_name;
通過vacuum**的任何空間都可能用於下一次儲存。vacuum full 重寫整個表及資料並釋放舊表占用所有碎片空間。

我們應該避免使用vacuum full,因為它收縮整個表並重寫所有表至新磁碟塊,需要更多資源和磁碟空間完成整個操作。

如果你發現大量已刪除記錄,應該在表上執行vacuum full命令。該命令需要表排他鎖,同時需要和原表相同大小的剩餘空間。語法如下:

vacuum full table_name;
執行vacuum 或 vacuum full命令之後, 必須要執行analyze命令更新統計資訊。analyze更新所有必須的統計並儲存統計結果至pg_statistic系統表中。

查詢計畫器使用這些統計資訊準備有效的查詢執行計畫。

我們也可以使用vacuum analyze命令,即首先執行vacuum 命令,然後再analyze,語法如下:

analyze table_name;

vacuum analyze table_name;

本文介紹了postgresql 常用的維護命令vacuum, vacuum full 和 analyze,結合查詢優化如何使用這些命令。

PostgreSQL的查詢優化

postgresql 的查詢優化 資料庫管理系統中的 sql執行,有多種多樣,從 sql語句型別上講,有 ddl dml dql dcl。不同語句,被資料庫引擎執行,其執行方式 複雜程度都不相同。其中,最為複雜的,是 dql,查詢語句。查詢語句的執行,在資料庫中,又可以分為 2個階段,一是查詢計畫的...

PostgreSQL查詢優化器原始碼分析 整體流程

函式間關係的主要邏輯如下 planner 第 11 層結束,build join rel 第 10 層結束,make join rel make rels by clause joins 會呼叫make join re l make rels by clauseless joins 會呼叫make ...

記一次postgresql查詢優化

一 場景介紹 1 需求 根據schema 1中多表聯查結果,對相應schema 2中資料進行刪除操作。2 表結構 模式表名 表結構schema 1 table 1 id varchar 32 pk主鍵 table 2 id varchar 32 pk主鍵 table 1 id varchar 32 ...