postgresql執行計劃(入門筆記)
阿新 • • 發佈:2019-01-01
一、統計表的大小和記錄
可以大致定位到每個表的記錄數量和總體大小。
SELECT
table_schema || '.' || TABLE_NAME AS table_full_name,
pg_size_pretty (
pg_total_relation_size (
'"' || table_schema || '"."' || TABLE_NAME || '"'
)
) AS SIZE
FROM
information_schema.tables
ORDER BY
pg_total_relation_size (
'"' || table_schema || '"."' || TABLE_NAME || '"'
) DESC
二、執行計劃
主題 | 描述 |
---|---|
Seq Scan | 掃描表 |
Index Scan | 索引掃描。無啟動時間 |
Sort | 排序,ORDER BY操作。有啟動時間 |
Subquery Scan | 子查詢 無啟動時間 |
Function Scan 函式掃描 | 無啟動時間 |
Bitmap Index Scan | 索引掃描 有啟動時間 |
Bitmap Heap Scan | 索引掃描 有啟動時間 |
Subquery Scan | 子查詢 無啟動時間 |
Nested Loop | 迴圈結合。無啟動時間 |
Merge Join | 合併結合。有啟動時間。 |
Hash Join | 雜湊結合。有啟動時間 |
Hash | 雜湊運算 有啟動時間 |
Tid Scan | ctid = …條件 無啟動時間 |
Unique | DISTINCT,UNION操作 有啟動時間 |
Limit | LIMIT,OFFSET操作 有啟動時間 |
Aggregate | count, sum,avg, stddev集約函式 有啟動時間 |
Group | GROUP BY分組操作 有啟動時間 |
Append | UNION操作 無啟動時間 |
Materialize | 子查詢 有啟動時間 |
2.1 Parallel Seq Scan
只有順序掃描可以被修改為並行查詢。因此,一個表掃描進入並行查詢,通常使用的是Parallel Seq Scan
(並行順序掃描)。
關係表的塊被分配給合作程序的每一個程序。塊被一次分發出去,所以訪問關係表依然是順序的。每一個程序在請求一個新頁之前,必須訪問被分配頁的每一個元組
2.2 HashAggregate與GroupAggregate
在Postgresql資料庫中,聚合函式有兩種實現方式:HashAggregate
與GroupAggregate
HashAggregate
對於hash聚合來說,資料庫會根據group by欄位後面的值算出hash值,並根據前面使用的聚合函式在記憶體中維護對應的列表。如果select後面有兩個聚合函式,那麼在記憶體中就會維護兩個對應的資料。同樣的,有n個聚合函式就會維護n個同樣的陣列。對於hash演算法來說,陣列的長度肯定是大於group by的欄位的distinct值的個數的,且跟這個值應該呈線性關係,group by後面的值越唯一,使用的記憶體也就越大
GroupAggregate
對於普通聚合函式,使用group聚合,其原理是先將表中的資料按照group by的欄位排序,這樣子同一個group by的值就在一起,這樣就只需要對排好序的資料進行一次全掃描,就可以得到聚合的結果了。