博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
对PostgreSQL Merge Join 的理解
阅读量:6266 次
发布时间:2019-06-22

本文共 3590 字,大约阅读时间需要 11 分钟。

开始

伪代码:

http://momjian.us/main/writings/pgsql/optimizer.pdfsort(outer);            sort(inner);            i = 0;            j = 0;            save_j = 0;            while (i < length(outer))            {                if (outer[i] == inner[j])                output(outer[i], inner[j]);                                if (outer[i] <= inner[j] && j < length(inner))            {                j++;            if (outer[i] < inner[j])                save_j = j;    }            else            {                i++;            j = save_j;        }        }

上述描述中,可以把两列排序好的数组看成 由大到小排列。

 Merge Join 先要对各表各自排序,然后从各自的排序表中抽取数据,到另一个排序表中做匹配。

通常来讲,能够使用merge join的地方,hash join 更快。

验证:

postgres=# EXPLAIN SELECT relname,nspname FROM pg_class join        pg_namespace ON (pg_class.relnamespace = pg_namespace.oid);                               QUERY PLAN                                ------------------------------------------------------------------------- Hash Join  (cost=1.14..16.02 rows=290 width=128)   Hash Cond: (pg_class.relnamespace = pg_namespace.oid)   ->  Seq Scan on pg_class  (cost=0.00..10.90 rows=290 width=68)   ->  Hash  (cost=1.06..1.06 rows=6 width=68)         ->  Seq Scan on pg_namespace  (cost=0.00..1.06 rows=6 width=68)(5 rows)postgres=# postgres=# set session enable_hashjoin=false;SETpostgres=# EXPLAIN SELECT relname,nspname FROM pg_class join        pg_namespace ON (pg_class.relnamespace = pg_namespace.oid);                               QUERY PLAN                                ------------------------------------------------------------------------- Merge Join  (cost=23.90..28.28 rows=290 width=128)   Merge Cond: (pg_namespace.oid = pg_class.relnamespace)   ->  Sort  (cost=1.14..1.15 rows=6 width=68)         Sort Key: pg_namespace.oid         ->  Seq Scan on pg_namespace  (cost=0.00..1.06 rows=6 width=68)   ->  Sort  (cost=22.76..23.49 rows=290 width=68)         Sort Key: pg_class.relnamespace         ->  Seq Scan on pg_class  (cost=0.00..10.90 rows=290 width=68)(8 rows)postgres=#

[作者:技术者高健@博客园  mail:  ]

改了 join 的顺序 对 结果也没有影响。

postgres=# EXPLAIN SELECT relname,nspname FROM pg_namespace join        pg_class ON (pg_class.relnamespace = pg_namespace.oid);                               QUERY PLAN                                ------------------------------------------------------------------------- Merge Join  (cost=23.90..28.28 rows=290 width=128)   Merge Cond: (pg_namespace.oid = pg_class.relnamespace)   ->  Sort  (cost=1.14..1.15 rows=6 width=68)         Sort Key: pg_namespace.oid         ->  Seq Scan on pg_namespace  (cost=0.00..1.06 rows=6 width=68)   ->  Sort  (cost=22.76..23.49 rows=290 width=68)         Sort Key: pg_class.relnamespace         ->  Seq Scan on pg_class  (cost=0.00..10.90 rows=290 width=68)(8 rows)postgres=#
postgres=# EXPLAIN SELECT relname,nspname FROM pg_namespace,        pg_class where (pg_class.relnamespace = pg_namespace.oid);                               QUERY PLAN                                ------------------------------------------------------------------------- Merge Join  (cost=23.90..28.28 rows=290 width=128)   Merge Cond: (pg_namespace.oid = pg_class.relnamespace)   ->  Sort  (cost=1.14..1.15 rows=6 width=68)         Sort Key: pg_namespace.oid         ->  Seq Scan on pg_namespace  (cost=0.00..1.06 rows=6 width=68)   ->  Sort  (cost=22.76..23.49 rows=290 width=68)         Sort Key: pg_class.relnamespace         ->  Seq Scan on pg_class  (cost=0.00..10.90 rows=290 width=68)(8 rows)postgres=#

结束

本文转自健哥的数据花园博客园博客,原文链接:http://www.cnblogs.com/gaojian/archive/2012/11/08/2760677.html,如需转载请自行联系原作者

你可能感兴趣的文章
数字逻辑的一些基本运算和概念
查看>>
ant重新编译打包hadoop-core-1.2.1.jar时遇到的错
查看>>
【★★★★★】提高PHP代码质量的36个技巧
查看>>
3 weekend110的配置hadoop(格式化) + 一些问题解决 + 未免密码配置
查看>>
JavaScript Creating 对象
查看>>
Java compiler level does not match the version of the installed Java project facet.(转)
查看>>
WPF MediaElement.Position属性
查看>>
sqoop数据迁移(基于Hadoop和关系数据库服务器之间传送数据)
查看>>
spring mysql多数据源配置
查看>>
[React] Override webpack config for create-react-app without ejection
查看>>
检索 COM 类工厂中 CLSID 为{00024500-0000-0000-C000-000000000046} 的组件时失败,原因是出现以下错误: 80070005。...
查看>>
测试java的父子类化
查看>>
HDOJ 1008
查看>>
安装thrift出现的一些问题
查看>>
makefile编写---单个子目录编译模板
查看>>
Oracle DB_LINK如何使用
查看>>
cv resource
查看>>
关于加快INSERT语句执行速度和HINT /*+ append */及/*+ append nologging */的使用
查看>>
JDK源代码学习系列07----Stack
查看>>
firefox
查看>>