版权声明:本文为博主原创文章,未经博主允许不得转载。 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数据库中,聚合函数有两种实现方式:HashAggregate
与GroupAggregate
HashAggregate
对于hash聚合来说,数据库会根据group by字段后面的值算出hash值,并根据前面使用的聚合函数在内存中维护对应的列表。如果select后面有两个聚合函数,那么在内存中就会维护两个对应的数据。同样的,有n个聚合函数就会维护n个同样的数组。对于hash算法来说,数组的长度肯定是大于group by的字段的distinct值的个数的,且跟这个值应该呈线性关系,group by后面的值越唯一,使用的内存也就越大
GroupAggregate
对于普通聚合函数,使用group聚合,其原理是先将表中的数据按照group by的字段排序,这样子同一个group by的值就在一起,这样就只需要对排好序的数据进行一次全扫描,就可以得到聚合的结果了。