PostgreSql explain 三觀正,挺好用

查看數據庫中執行SQL的執行計劃,及相關信息是每個數據庫都有的功能,PostgreSQL explain 的功能很豐富,下面就看看,這個explain 有什麼過人之處。(以下均已pg 11作爲演示版本)

首先從最簡單的explain  來開始,顯示的方式也是適用縮進的方式,目前四大家 (ORACLE ,SQL SERVER , POSTGRESQL , MYSQL 8.018)都採用了這樣的方式顯示執行計劃(SQL SERVER 可以通過非圖形化的方式來顯示於此相同的執行計劃, MYSQL 8 也是通過 explain format = tree 的方式來顯示於此一樣的執行計劃)到此所有的數據庫在文字顯示執行計劃的方式,算是可以在一個起跑線了。

回到postgresql

上面執行執行計劃中的 cost=0.00 是啓動成本,後面的 14.03 是掃描成本

rows 是掃描的行數是多少,而我們此次的成本中並不包含列的寬度。

在往上面看,聚合操作啓動成本 15.54 行 1 行,列寬度8

這裏順便說一句,有些數據庫早期,select count(*)  與 select count(主鍵) 性能可能不一樣的情況在PG 不存在,可以看下面的列子。

上面只是簡單的東西,explain 會有很多輔助的命令幫助

這裏可能會有人問爲什麼要啓動成本,我們可以想象我們在一輛汽車啓動的時候,什麼時候最費油,那一定是啓動的時候,瞬時油耗可以變成 30 -40升百公里,這裏的意思就是越少的啓動成本,會讓總體成本變得更小,並且如果我在查詢中kill掉他,那啓動成本就是我肯能消耗最大的一塊,所以啓動成本越少越好。

在實際中估算的成本可能是不準確的,因爲很可能估算的成本和你實際運行的成本不一致,所以

explain analyze 可以讓你的運行實際來一次,然後給你一個實際的成本

可以看上圖,下圖中紅色位置

實際運行的時間,與cost 之間的對應關係也都會有,內存的使用率,並且實際上analyze的時間會比實際運行的時間還要長一些。

同時 POSTGRESQL 還可以告訴你實際上你的執行計劃中有多少會讀取到數據,數據從哪裏來,下面有兩張圖,圖1 告訴你 這個SQL 經常運行,數據已經不再從磁盤讀取了。圖二是,語句初次運行,有多少數據是從 share hit 內存中讀取的,有多少是從磁盤上讀取的。read = ?  這一點就已經比一大部分的數據庫在 EXPLAIN 的表現要好的多了。

當然如果想還要更多明確,這個執行計劃使用了那些字段,可以添加verbose,下圖在每一段中都有添加 output 

EXPLAIN 中可以帶的參數很多,個人覺得有用的有以下一些

Analyze 實際上你要實際運行SQL 並給出實際執行的結果

Verbose 將信息更加詳細,括計劃樹中每個節點的輸出列列表、模式限定表和函數名

Buffers 給出語句到底是讀取數據的路徑是 磁盤 還是 內存以及多少塊被涉及

另外timming costs 等都是默認打開的。

當然你也可以將輸出的格式進行變換,然後塞到上次說的那個網站,將執行計劃已更詳細的圖形化的方式給你展現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章