sql - 查询效率:格式塔不好;零件速度快
问题描述
我的查询结构为针对一个非常大、功能强大的数据库的 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 部分连接,并期望它在不到一秒的时间内运行。为什么引擎不这样做?
编辑:这是查询的存档模式版本的解释计划(除了模式名称外相同,实际表数据不同)。此查询运行大约一分钟,并按预期返回几千行。根据解释计划,它似乎要贵得多——这怎么可能?
解决方案
我将连接的顺序从 1,2,3 更改为 2,1,3。这允许查询运行并完成(第一次)。
我不知道为什么,所以我不会接受这个作为解决方案。
推荐阅读
- c# - How to fix ''Gradle Build Failed'' on Unity?
- python - Django Webmanifest
- python - Nested loop not triggering
- javascript - 在 Rails 中使用 ChartKick 添加网格线
- c - libtool 更改我的链接器标志在 autotools 中的顺序?
- java - 为什么我的代码不起作用?。这是一个用于检查数字是否为正数的回文的代码
- amazon-web-services - 我可以将 AWS 流量镜像与 ECS 一起使用吗?
- redis - 只有当该值尚未在散列中时,才可以增加和使用 Redis 计数器并分配给散列中的另一个值?
- amazon-web-services - 将 AWS 成本和使用情况报告共享给另一个账户的简单方法是什么?
- java - If 语句和返回的编码约定