首页 > 解决方案 > 查询效率:格式塔不好;零件速度快

问题描述

我的查询结构为针对一个非常大、功能强大的数据库的 3 个连接子查询。数据库将“旧”数据发送到存档模式,而不对数据结构进行任何更改。因此,根据我正在调查的主题的年龄,我的查询可能指向存档模式或生产模式表。当我对归档模式运行查询时,它会在大约一分钟内运行。当我反对生产时,它在一个小时后没有完成。

令人困惑的是,查询的生产版本的解释计划显示它比存档版本更有效。

查询的形式基本上是:

SELECT 
  SUB1.*,
  SUB2.*,
  SUB3.*
FROM ( BLAH BLAH BLAH ) SUB1
JOIN ( BLAH BLAH BLAH ) SUB2 ON SUB1.FIELD_11 = SUB2.FIELD_21
JOIN ( BLAH BLAH BLAH ) SUB3 ON SUB1.FIELD_12 = SUB3.FIELD_31
                           AND  SUB2.FIELD_22 = SUB3.FIELD_32
;

参考生产版本:

当我只运行子查询 SUB1 时,它会在 1.22 秒内返回 468 行。

当我只运行子查询 SUB2 时,它会在 0.44 秒内返回 807 行。

当我只运行子查询 SUB3 时,它会在 27 秒内返回 63,106 行。

SUB3 JOIN 语句中使用的两个字段都是构成 SUB3 子查询的单个表中的索引字段。

该数据库非常强大。

为什么查询部分运行相对较快 - 但全部运行时运行缓慢。如果我拥有数据库权限,我可以将每个子查询写入临时表并运行 3 部分连接,并期望它在不到一秒的时间内运行。为什么引擎不这样做?

编辑:这是解释计划。 问题查询解释计划

编辑:这是查询的存档模式版本的解释计划(除了模式名称外相同,实际表数据不同)。此查询运行大约一分钟,并按预期返回几千行。根据解释计划,它似乎要贵得多——这怎么可能?

解释计划

标签: sqloracleperformance

解决方案


我将连接的顺序从 1,2,3 更改为 2,1,3。这允许查询运行并完成(第一次)。

我不知道为什么,所以我不会接受这个作为解决方案。


推荐阅读