非群集联接比群集

时间:2015-09-26 00:36:31

标签: sql oracle join

我在集群和非集群上运行了以下查询,并观察了跟踪的结果,发现非集群执行比集群更好,当我期望在集群上运行查询时执行得更好,我只是想知道为什么非群集表现优于群集?集群包含两个表,聚集索引位于列cid

非群集联接查询跟踪:

enter image description here

非群集联接查询解释计划:

enter image description here

群集连接查询跟踪:

enter image description here

群集连接查询解释计划:

enter image description here

创建集群sql:

CREATE CLUSTER booking_customer (cid NUMBER(16)) PCTUSED 85 PCTFREE 5 SIZE 5K;

2 个答案:

答案 0 :(得分:2)

通过物理地共同定位要连接的表中的相关行,群集实际上用于优化嵌套循环连接。因此,它非常适合检索少量连接数据,因为OLTP系统可能需要这样做。

当您正在连接两个完整的表时,散列连接是最有效的,因为它的成本通常不会超过两个表的表扫描的总和(只要连接不是' t溢出到磁盘,在这种情况下,equi-partitining可以帮助),完整扫描是读取整个两个表的最有效方式。

散列连接在群集中的表上效率低,因为两个完整的表扫描必须是两个完整的群集扫描,并且群集的大小是两个表一起添加的两倍(由于空间浪费)。

因此,集群中两个表上的散列连接可能效率低于它们之间的嵌套循环连接,并且效率肯定低于将表存储在传统非集群表中的效率。

答案 1 :(得分:1)

DDL - 数据定义语言,它指的是用于创建上述对象的命令。 我在这里不知所措,但我猜这两张桌子都没那么大。在这种情况下,由于非聚集连接可能执行得更快,因为它不使用索引,因此可以读取块中的数据(基于索引的查询根本没有)。 此外,由于您正在完整地读取这两个表,因此非群集连接生成的哈希联接应该比群集联接选择的嵌套循环连接快得多。当父表被严重过滤时,嵌套循环效果最佳。