PostgreSQL 联结方式--排序-合并联结

PostgreSQL 联结方式--排序-合并联结,第1张

概述          排序-合并联结独立地读取需要联结的两张表,对每张表中的数据行(仅是那些满足各自where子句中条件的数据行)按照联结键进行排序,然后对排序后的数据行集进行合并。对这种联结方法来说排序的开销的非常大的。对于不能够放入内存中的大的数据源来说,可能会使用临时磁盘空间来完成排序。这是非常占内存和时间资源的。但是一旦数据行几点排序完成了,合并的过程是非常快的。为了进行合并,数据库轮流 *** 作 排序-合并联结独立地读取需要联结的两张表,对每张表中的数据行(仅是那些满足各自where子句中条件的数据行)按照联结键进行排序,然后对排序后的数据行集进行合并。对这种联结方法来说排序的开销的非常大的。对于不能够放入内存中的大的数据源来说,可能会使用临时磁盘空间来完成排序。这是非常占内存和时间资源的。但是一旦数据行几点排序完成了,合并的过程是非常快的。为了进行合并,数据库轮流 *** 作两个列表,比较最上面的数据行,丢弃在排序对列中比另一列表中的最上面一行出现得早的数据行,并只返回匹配的行。

在计算成本的时候,有的时候执行计划的总成本比两个表单独扫描+排序的成本要小,这是因为当两个表排完序后,可能两个表只有前几行是对应的,比如:a表有10条记录,b表10000条,b表只有前10行与a表匹配,那么单独扫描b表闭并排序的成本是比较大的,但是在合并的时候,当a表合并完,发现b表已经没有与a表匹配的了,也就不继续扫描b表了,那么b表也是只扫描了10行,b表实际的成本的计算应该是:b表总成本*(10/10000),后面会具体说这个问题。


1. 建表和插入测试数据参考:http://www.jb51.cc/article/p-chkofhzn-zc.html
2. select s.*,c.class_name from student s,class c where s.class_ID=c.ID;
这个查询将会向下面的伪代码一样来处理结果:
select c.class_name,c.ID from class c order by ID
select s.ID,s.name,s.class_ID from student s order by s.class_ID
compare the rowsets and return rows where ID/class_ID in both Lists match
for an outer join,compare the rowsets and return all rows from the first List setting column values for the other table to null
3. 执行计划
postgres=# explain(analyze,verbose,buffers) select s.*,class c where s.class_ID=c.ID;                                                        query PLAN                                                         --------------------------------------------------------------------------------------------------------------------------- Merge Join  (cost=24.59..30.40 rows=384 wIDth=44) (actual time=0.169..0.330 rows=384 loops=1)   Output: s.ID,s.class_ID,c.class_name   Merge Cond: (c.ID = s.class_ID)   Buffers: shared hit=4   ->  <span >Sort</span>  (cost=1.27..1.29 rows=10 wIDth=36) (actual time=0.029..0.029 rows=3 loops=1)         Output: c.class_name,c.ID         Sort Key: c.ID         Sort Method: quicksort  Memory: 25kB         Buffers: shared hit=1         ->  Seq Scan on public.class c  (cost=0.00..1.10 rows=10 wIDth=36) (actual time=0.007..0.010 rows=10 loops=1)               Output: c.class_name,c.ID               Buffers: shared hit=1   ->  <span >Sort</span>  (cost=23.32..24.28 rows=384 wIDth=12) (actual time=0.134..0.200 rows=384 loops=1)         Output: s.ID,s.class_ID         Sort Key: s.class_ID         Sort Method: quicksort  Memory: 43kB         Buffers: shared hit=3         ->  Seq Scan on public.student s  (cost=0.00..6.84 rows=384 wIDth=12) (actual time=0.006..0.052 rows=384 loops=1)               Output: s.ID,s.class_ID               Buffers: shared hit=3 Total runtime: 0.407 ms(21 rows)

可以看到两个排序节点 Sort。

总结

以上是内存溢出为你收集整理的PostgreSQL 联结方式--排序-合并联结全部内容,希望文章能够帮你解决PostgreSQL 联结方式--排序-合并联结所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1176231.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-02
下一篇 2022-06-02

发表评论

登录后才能评论

评论列表(0条)

保存