文章摘自: http://pgguide.lxneng.com/performance/explain.html
什麼執行計劃?
Postgres 有一個強大的功能可以想你展示數據庫內容怎樣執行一個查詢. 這裏所謂的 執行計劃 是 通過 explain 展示出來的, 瞭解這個將讓你知道怎樣通過索引來優化數據庫的性能, 對於大多數 人來說困難難點就是讀懂這些輸出, 雖然大部分開發者瞭解其中的一些關鍵點.
關於解釋 (Explain)
每一個查詢執行的時候都有一個執行計劃, 有三種形式通過 explain 來輸出這些信息:
- 常規形式 (只顯示可能發生了什麼)
- Analyze (分析實際查詢中會發生什麼)
- Verbose (顯示完整的內部執行計劃樹, 適用與高級用戶)
大多數情況下, explain 是用來分析 SELECT 語句, 但是你可以用在:
- INSERT
- UPDATE
- DELETE
- EXECUTE
- DECLARE
使用Explain
例如這個查詢:
SELECT last_name FROM employees where salary >= 50000;
我們可以查看Postgres將要怎麼執行:
EXPLAIN SELECT last_name FROM employees where salary >= 50000;
QUERY PLAN
--------------------------------------------------------------
Seq Scan on employees (cost=0.00..16.50 rows=173 width=118)
Filter: (salary >= 50000)
我們同時可以查看執行路徑和執行時間:
EXPLAIN ANALYZE SELECT last_name FROM employees where salary >= 50000;
QUERY PLAN
--------------------------------------------------------------------------------------------------------
Seq Scan on employees (cost=0.00..16.50 rows=173 width=118) (actual time=0.018..0.018 rows=0 loops=1)
Filter: (salary >= 50000)
Total runtime: 0.053 ms
理解執行計劃
也許執行計劃最難的就是理解它們的意思. 首先這是一個簡短的描述, 不是一個完整的參考, 但是我們把它作爲理解查詢和優化數據庫的出發點.
如果你在有200萬行數據的數據表上執行 EXPLAIN ANALYZE 分析, 那麼你將看到如下輸出:
但是我們來看一下到底是什麼意思
這裏有兩組數值, 通常你所查看出現的序列掃描, 但是更重要的是上面這三個數值是什麼意思, 啓動花了多少時間、最長時間和返回的行數. 在這種情況下, 因爲我們跑的是解釋分析(EXPLAIN ANALYZE), 我們不僅要看第一組的估算數值,但是時間運行的數值在第二組.
在這裏我們看到在序列掃描上花了很多的時間, 因此我們可以添加索引來試試看:
CREATE INDEX idx_emps on employees (salary);
通過這樣做我們的查詢時間從295毫秒減少到了1.7毫秒