【问题标题】:Oracle WITH clause optimizationOracle WITH 子句优化
【发布时间】:2020-05-01 03:58:48
【问题描述】:

我需要帮助来优化查询。并建议是否有任何其他方法可以通过使用任何其他查询来完成同样的任务。

WITH 
q1 as 
(select eid, data_used||'-'||status as value1 
 from T1 inner join T2 ON (t1.eid = t2.eid) 
 where <conditions>),
q2 as
(select eid, data_used||'-'||status as value2 
 from T1 inner join T2 ON (t1.eid = t2.eid) 
 where <conditions different from q1 >),
q3 as
(select eid, data_used||'-'||status as value3  
 from T1 inner join T2 ON (t1.eid = t2.eid) 
 where <conditions different from q2>)
select q1.eid, q1.value1, q2.value2, q3.value3 
from q1, q2, q3 
where q1.eid = q2.eid 
and q2.eid=q3.eid;

查询将给出如下输出:

我的意思是说 value1, value 2, value 3 可以根据 q1, q2 和 q3 中的条件对于相同的 eid 不同。

表 T1 和 T2 都是审计表,因此 eid 在两者中重复多次。

我真的厌倦了优化和缩短这个查询。我是新手。因此,我想知道是否有其他方法可以完成它。 我在这些表上创建了索引,但它在 77 秒内返回数据。我需要将时间至少减少 10 - 15 秒。目前的数据量是 100k 条记录,并且会以数十亿的速度增长。

【问题讨论】:

  • 这里没有足够的信息供任何人提供明智的答案。 (显然人们可以随意猜测,但这可能会浪费大家的时间。)请阅读this post on asking Oracle tuning questions。然后编辑您的问题以包括数据量和偏差、索引、解释计划等详细信息。
  • 如果您仍在寻找解决方案并且可以提供示例原始数据,我认为很有可能找到解决方案

标签: oracle oracle11g query-optimization common-table-expression


【解决方案1】:

如果我正确理解了您的查询,那么您只是将“与”查询过度复杂化了。因此,您的查询可以简化为:

select
  eid || status as value1,
  eid || status as value2,
  eid || status as value3
from
  T1
  join T2 on t1.eid = td.eid
where
  <Q1 conditions> and
  <Q2 conditions> and
  <Q3 conditions>

我可能会在您的子查询中添加“EID”。我认为您的示例不会按原样编译。

而且我意识到这没有什么意义 - 在三列中列出相同的值,但我相信这就是您的查询所做的,因为所有 CTE 之后的内部连接(假设您将 EID 添加到输出中)。

我完全是在猜测,但我认为这实际上可能是你想要做的:

select
  case when <Q1 conditions> then eid || status end as value1,
  case when <Q2 conditions> then eid || status end as value2,
  case when <Q3 conditions> then eid || status end as value3
from
  T1
  join T2 on t1.eid = td.eid
where
  <Q1 conditions> or
  <Q2 conditions> or
  <Q3 conditions>

应该运行得更快,因为它最多会进行一次完整扫描。

再次,我在推测,但如果您可以添加一些示例数据以及您希望查询输出的内容,那将有助于澄清。

【讨论】:

  • 不,我不认为第一个查询会给你你需要的东西。但根据我的最佳猜测,这就是您列出的查询由于内部连接而实际执行的操作。
  • 我添加了示例输出,并对查询进行了一些更改。你能看看吗?
  • 这有帮助......它澄清了。我想我认为 EID 是一个 PK,但这是一个糟糕的假设。还有一件很有帮助的事情,您能否展示在 T1 和 T2 中会产生此结果的原始数据是什么样的?
  • 表 T1 和 T2 都是审计表,因此 eid 在两者中都重复。将存在具有相同 eid 的多行。
  • 我不知所措,因为我不知道会产生该输出的原始输入是什么...您也可以提供吗?如果我们知道输入、逻辑和预期输出,这将大大有助于获得答案。您的问题仍然只列出所需的输出。
猜你喜欢
  • 1970-01-01
  • 2017-01-14
  • 2011-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2012-11-09
  • 1970-01-01
相关资源
最近更新 更多