1. 程式人生 > >postgresql執行計劃(入門筆記)

postgresql執行計劃(入門筆記)

一、統計表的大小和記錄

可以大致定位到每個表的記錄數量和總體大小。

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資料庫中,聚合函式有兩種實現方式:HashAggregateGroupAggregate

HashAggregate

對於hash聚合來說,資料庫會根據group by欄位後面的值算出hash值,並根據前面使用的聚合函式在記憶體中維護對應的列表。如果select後面有兩個聚合函式,那麼在記憶體中就會維護兩個對應的資料。同樣的,有n個聚合函式就會維護n個同樣的陣列。對於hash演算法來說,陣列的長度肯定是大於group by的欄位的distinct值的個數的,且跟這個值應該呈線性關係,group by後面的值越唯一,使用的記憶體也就越大

GroupAggregate
對於普通聚合函式,使用group聚合,其原理是先將表中的資料按照group by的欄位排序,這樣子同一個group by的值就在一起,這樣就只需要對排好序的資料進行一次全掃描,就可以得到聚合的結果了。