【问题标题】:Oracle - SQL query takes too much timeOracle - SQL 查询需要太多时间
【发布时间】: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 人,所以我对此一无所知。)

标签: sql oracle performance


【解决方案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”字段必须匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-02
  • 2014-08-15
  • 1970-01-01
相关资源
最近更新 更多