postgresql执行计划(入门笔记)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31156277/article/details/81814181

一、统计表的大小和记录

可以大致定位到每个表的记录数量和总体大小。

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的值就在一起,这样就只需要对排好序的数据进行一次全扫描,就可以得到聚合的结果了。

猜你喜欢

转载自blog.csdn.net/qq_31156277/article/details/81814181