cost 和 actual time 的兩個數字是「啟動..總計」,不是範圍
執行計畫每個節點都帶兩組
a..b。那不是「介於 a 到 b 之間」——很多教學都這樣解釋,是錯的。
Seq Scan on example (cost=0.00..14.30 rows=430 width=159)
(actual time=0.016..0.021 rows=19 loops=1)
| 寫法 | 左邊那個數字 | 右邊那個數字 |
|---|---|---|
cost=0.00..14.30 | 啟動成本:吐出第一列之前要付的成本 | 總成本:拿到最後一列的成本 |
actual time=0.016..0.021 | 拿到第一列的時間 | 拿到最後一列的時間 |
actual time 的單位是毫秒(ms),不是秒。
為什麼這個分別要緊
因為啟動成本高/總成本低的計畫,和啟動成本低/總成本高的計畫,適用的場景完全相反:
排序、雜湊、聚合 → 啟動成本高(要先把資料全部收完才吐得出第一列)
逐列掃描 → 啟動成本低(讀到一列就能吐一列)
所以查詢有 LIMIT 的時候,資料庫會偏好啟動成本低的計畫——它只需要前幾列,沒必要付那個先收完全部的代價。
把兩個數字讀成「範圍」,就完全看不出這件事。
節點之間的層級關係見 執行計畫是一棵樹,從下往上讀;rows 那一組數字的讀法見 估計和實際差很多,代表資料庫對這張表的認識壞了。