0

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

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;

查询将给出如下输出:

在此处输入图像描述

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

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

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

4

1 回答 1

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>

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

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

于 2020-01-14T12:47:02.583 回答