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】:
automa 和 profil 之间没有连接条件。 如果你尝试
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 查询需要太多时间的主要内容,如果未能解决你的问题,请参考以下文章