2017-07-14 56 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