PostgreSQL執(zhí)行計(jì)劃的使用與查看教程
pg的執(zhí)行計(jì)劃和MySQL的執(zhí)行計(jì)劃的顯示有一點(diǎn)不一樣,我得補(bǔ)習(xí)一下。
1. 基本命令:EXPLAIN
EXPLAIN 命令會(huì)顯示 PostgreSQL 規(guī)劃器為給定的 SQL 語(yǔ)句生成的執(zhí)行計(jì)劃。它不會(huì)實(shí)際執(zhí)行該語(yǔ)句,只是預(yù)測(cè)其執(zhí)行路徑和成本。
語(yǔ)法:
EXPLAIN your_sql_statement;
示例:
EXPLAIN SELECT * FROM users WHERE email = 'test@example.com';
輸出內(nèi)容解讀:
輸出是一個(gè)樹(shù)形結(jié)構(gòu),一般是從下向上看執(zhí)行步驟,只需要關(guān)注下面幾點(diǎn):
操作類型 (Node Type) :表示執(zhí)行的操作,如 Seq Scan(順序掃描)、Index Scan(索引掃描)、Hash Join(哈希連接)、Sort(排序)等。
關(guān)聯(lián)關(guān)系 (Relationship) :顯示表之間的關(guān)聯(lián)方式,如 INNER 或 LEFT。
成本 (Cost) :包含兩個(gè)數(shù)字,例如 (cost=0.00..15.03 rows=1 width=44)。
0.00:?jiǎn)?dòng)成本,即獲取第一行數(shù)據(jù)的預(yù)估成本。15.03:總成本,即獲取所有行數(shù)據(jù)的預(yù)估成本。rows=1:預(yù)估返回的行數(shù)。width=44:預(yù)估每行數(shù)據(jù)的平均寬度(字節(jié))。
實(shí)際數(shù)據(jù) (Actual) :如果你使用 EXPLAIN ANALYZE,這里會(huì)顯示實(shí)際執(zhí)行的數(shù)據(jù)。
2. 關(guān)鍵命令:EXPLAIN ANALYZE
這是最常用且最強(qiáng)大的組合。EXPLAIN ANALYZE 會(huì)實(shí)際執(zhí)行 SQL 語(yǔ)句,并返回真實(shí)的執(zhí)行計(jì)劃和實(shí)際的執(zhí)行統(tǒng)計(jì)信息(如時(shí)間、返回行數(shù))。
語(yǔ)法:
EXPLAIN ANALYZE your_sql_statement;
示例:
EXPLAIN ANALYZE SELECT * FROM orders WHERE user_id = 123 AND status = 'shipped';
輸出內(nèi)容解讀:
除了 EXPLAIN 的信息外,還會(huì)增加:
實(shí)際時(shí)間 (Actual Time) :例如 (actual time=0.018..0.019 rows=1 loops=1)。
0.018:獲取第一行實(shí)際花費(fèi)的時(shí)間(毫秒)。0.019:獲取所有行實(shí)際花費(fèi)的時(shí)間(毫秒)。rows=1:實(shí)際返回的行數(shù)。loops=1:該節(jié)點(diǎn)執(zhí)行的次數(shù)。
執(zhí)行時(shí)間:計(jì)劃末尾的 Execution Time 顯示了整個(gè)查詢的實(shí)際總耗時(shí)。
?? 重要警告:
對(duì)于 INSERT, UPDATE, DELETE, CREATE TABLE AS 等會(huì)修改數(shù)據(jù)的語(yǔ)句,EXPLAIN ANALYZE 會(huì)真的執(zhí)行這些操作!在生產(chǎn)環(huán)境中使用前,請(qǐng)務(wù)必在測(cè)試環(huán)境確認(rèn),或者將其包裹在一個(gè)事務(wù)中并回滾:
BEGIN; EXPLAIN ANALYZE UPDATE table_name SET column = value WHERE condition; ROLLBACK; -- 分析完成后回滾,不會(huì)真正修改數(shù)據(jù)
3. 如何解讀和分析執(zhí)行計(jì)劃
查看執(zhí)行計(jì)劃的目的是找到性能瓶頸。以下是一些常見(jiàn)的需要關(guān)注的性能紅燈:
全表掃描 (Seq Scan) :
- 對(duì)大數(shù)據(jù)表進(jìn)行全表掃描通常性能很差。檢查是否可以為
WHERE子句中的條件字段創(chuàng)建索引。
昂貴的操作 :
- Sort: 昂貴的排序操作,尤其是在處理大量數(shù)據(jù)時(shí)??紤]是否可以通過(guò)索引來(lái)避免排序。
- Hash Join / Hash Aggregate: 這些操作需要在內(nèi)存中構(gòu)建哈希表,如果數(shù)據(jù)量大,可能會(huì)占用大量?jī)?nèi)存甚至使用磁盤(pán)臨時(shí)文件,導(dǎo)致變慢。
- Nested Loop: 如果內(nèi)循環(huán)的數(shù)據(jù)集很大,性能會(huì)非常差。
總結(jié)步驟
- 找到慢查詢:通過(guò)日志查詢。
- 使用
EXPLAIN ANALYZE:在測(cè)試環(huán)境中運(yùn)行它來(lái)獲取真實(shí)的執(zhí)行計(jì)劃。 - 尋找瓶頸:從上到下閱讀執(zhí)行計(jì)劃,尋找全表掃描、不準(zhǔn)確的預(yù)估、昂貴的排序或哈希操作。
- 提出優(yōu)化方案:
- 增加索引(最常用):為
WHERE,JOIN,ORDER BY,GROUP BY子句中的字段添加索引。 - 優(yōu)化查詢:重寫(xiě)查詢,避免不必要的操作(如
SELECT *,復(fù)雜的子查詢)。
- 增加索引(最常用):為
到此這篇關(guān)于PostgreSQL執(zhí)行計(jì)劃的使用與查看教程的文章就介紹到這了,更多相關(guān)PostgreSQL執(zhí)行計(jì)劃使用與查看內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PostgreSQL三種自增列sequence,serial,identity的用法區(qū)別
這篇文章主要介紹了PostgreSQL三種自增列sequence,serial,identity的用法區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-02-02
初識(shí)PostgreSQL存儲(chǔ)過(guò)程
這篇文章主要介紹了初識(shí)PostgreSQL存儲(chǔ)過(guò)程,本文講解了PostgreSQL中存儲(chǔ)過(guò)程的語(yǔ)法,并給出了一個(gè)操作實(shí)例,需要的朋友可以參考下2015-01-01
postgresql兼容MySQL on update current_timestamp
這篇文章主要介紹了postgresql兼容MySQL on update current_timestamp問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03
PostgreSQL進(jìn)行重置密碼的方法小結(jié)
今天想測(cè)試一個(gè)PostgresSQL語(yǔ)法的 SQL,但是打開(kāi)PostgresSQL之后沉默了,密碼是什么?日長(zhǎng)月久的,漸漸就忘記了,于是開(kāi)始了尋找密碼的道路,所以本文介紹了Postgresql忘記密碼,如何重置密碼,需要的朋友可以參考下2024-05-05
postgresql運(yùn)維之遠(yuǎn)程遷移操作
這篇文章主要介紹了postgresql運(yùn)維之遠(yuǎn)程遷移操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01
windows PostgreSQL 9.1 安裝詳細(xì)步驟
這篇文章主要介紹了windows PostgreSQL 9.1 安裝詳細(xì)步驟,需要的朋友可以參考下2016-11-11
postgresql 中的加密擴(kuò)展插件pgcrypto用法說(shuō)明
這篇文章主要介紹了postgresql 中的加密擴(kuò)展插件pgcrypto用法說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-01-01

