2017-07-14 73 views
0

我有一个非常大的数据表,有10亿行数据。如果我尝试将该表加入自己进行比较,则估计计划的成本无法运行(成本:226831405289150)。有没有一种方法可以实现与下面的查询相同的结果,而无需连接,也许是一个分区?ORACLE SQL - 无加入日期比较日期

我需要做的是确保在收到Wildcare之前或之后24小时内没有发生其他事件。

非常感谢您的帮助!

select e2.SYSTEM_NO, 
     min(e2.DT) as dt 
from SYSTEM_EVENT e2 
     inner join table1.event el2 
     on el2.event_id = e2.event_id 
     left join (Select se.DT 
        from SYSTEM_EVENT se 
        where 
         --fails 
         ( se.event_id in ('101','102','103','104') 
         --restores 
          or se.event_id in ('106','107','108','109') 
         ) 
       ) e3 
     on e3.dt-e2.dt between .0001 and 1 
     or e3.dt-e2.dt between -1 and .0001 
where el2.descr like '%WILDCARE%' 
and e3.dt is null 
and e2.REC_STS_CD = 'A' 
group by e2.SYSTEM_NO 
+2

样本数据和期望的结果将有所帮助。 –

回答

1

没有任何实验数据,很难确定所要实现的目标,但似乎你可以尝试使用分析功能与一系列窗口:

SELECT system_no, 
     MIN(dt) AS dt 
FROM (
    SELECT system_no, 
     dt, 
     COUNT(
      CASE 
      WHEN ( se.event_id in ('101','102','103','104') --fails 
       OR se.event_id in ('106','107','108','109')) --restores 
      THEN 1 
      END 
     ) OVER (
      ORDER BY dt 
      RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING 
     ) AS num 
    FROM system_event 
) se 
WHERE num = 0 
AND REC_STS_CD = 'A' 
AND EXISTS(
    SELECT 1 
    FROM table1.event te 
    WHERE te.descr like '%WILDCARE%' 
    AND te.event_id = se.event_id 
) 
GROUP BY system_no 
+0

@mtd谢谢你,这是非常接近我想!但我无法抓住se.event_id执行存在检查,因为它不在se – yeahthisisrob

+0

的编辑语句中编辑---我将它包括在内了..成本已经下降到最后成功运行的水平,现在就试用它! – yeahthisisrob

+0

我不得不改变一些东西(因为你们没有示例数据),但是能够将其用于我的最终解决方案。 OVER必须由system_no分区。我还在system_event的where语句中添加了一个包含'%WILDCARE%'的所有event_ids的过滤器(运行时间在15分钟以下) – yeahthisisrob

1

这不是直接回答对于你的问题,但它有点太长的评论。

可以插入多大的数据? 48h窗口意味着如果数据是逐步插入的,则只需检查数据的子集而不是整个1bilion行表。所以如果是这样,请减少一些with条款或temporary table比较的数据。

如果你仍然需要沿整个表进行比较,我会去分区event_id或其他属性,如果有更好的分区。并分别比较各组。

where el2.descr like '%WILDCARE%'是这样巨大的桌子的表现杀手。

+0

谢谢,可悲的是我回到7年的数据:( – yeahthisisrob

+0

仍然可以用'event_id'进行分区,并尝试使用比'LIKE%WILD%'更好的条件' – Kacper