Oracle - SQL 查询需要太多时间

Posted

技术标签:

【中文标题】Oracle - SQL 查询需要太多时间【英文标题】:Oracle - SQL query takes too much time 【发布时间】:2017-09-19 09:15:20 【问题描述】:

我有这张桌子:

自动机 账户 客户 简介 市场

最大的是 accoun,有将近 3000 万行。客户端有2万行,自动机有3万行。

我需要获取自动机中的每一行,其中:

mktcode 匹配来自市场的 mktcode acccode 匹配来自 accoun 的 acccode 来自 accoun 的 ccccode 与来自客户端的 ccccode 匹配 来自客户端的 clicode 与来自 profil 的 clicode 匹配 profil 的编码是“ADMIN”

这是我的查询:

SELECT au.acccode, au.oprcode, au.ctrcode, au.ctrdesc, au.mkcode
FROM automa au
JOIN profil pr ON pr.procode = 'ADMIN'
JOIN client cl ON cl.clicode = pr.clicode
JOIN market mk ON mk.mktcode = au.mkcode
JOIN accoun ac ON ac.ccccode = cl.ccccode AND ac.acccode = au.acccode
GROUP BY au.acccode, au.oprcode, au.ctrcode, au.ctrdesc, au.mkcode

大约需要 60 秒。

我还有 2 个额外的问题:

我看不到执行计划 我无法创建索引。如果这是唯一的方法,我可以要求创建它们,但这需要一些时间才能完成。

有什么想法吗?如果没有索引,我无法弄清楚如何解决它。

【问题讨论】:

请edit您的问题并解释为什么您看不到执行计划。不可以跑EXPLAIN PLAN吗? 我对Oracle没有经验,但是在一个有3000万行加入其他表的表中进行这样的查询不是60秒正常吗? 为什么GROUP BY不涉及聚合函数? SELECT DISTINCT 怎么了? @jarlh 创建合适的索引时(根据 sql 访问顾问),使用 GROUP BY 将比使用 DISTINCT 更快 @BarbarosÖzhan,感谢您提供的信息! (我不是 Oracle 人,所以我对此一无所知。) 【参考方案1】:

automaprofil 之间没有连接条件。 如果你尝试

SELECT au.acccode, au.oprcode, au.ctrcode, au.ctrdesc, au.mkcode
  FROM automa au
  JOIN profil pr ON pr.procode = 'ADMIN'

此查询返回 automa 中的所有行,不进行任何过滤。 首先,添加连接条件。

您也可以尝试重写此查询。因为您只需要来自 automa 的数据,请尝试使用 EXISTS。可能在那之后您将不需要分组/区分。类似的东西:

SELECT au.acccode, au.oprcode, au.ctrcode, au.ctrdesc, au.mkcode
  FROM automa au
 where exists (select null 
                from profil pr 
                JOIN client cl ON cl.clicode = pr.clicode and pr.procode = 'ADMIN'
                JOIN accoun ac ON ac.ccccode = cl.ccccode 
                              AND ac.acccode = au.acccode
                JOIN market mk ON mk.mktcode = au.mkcode
               )

【讨论】:

automa 和 pr 之间没有公共字段。 pr 和 cl 中的“clicode”字段、cl 和 ac 中的“ccccode”字段以及 ac 和 automa 中的“acccode”字段必须匹配。

以上是关于Oracle - SQL 查询需要太多时间的主要内容,如果未能解决你的问题,请参考以下文章

与硬编码值相比,Oracle SQL In Subquery 花费了太多时间

更新查询需要太多时间

ORA-00913: oracle 子查询中的值太多

Oracle sql查询需要根据时区变化

Oracle定时查询结果输出到指定的log文件

Oracle SQL调优记录