2016-11-11 87 views
1

我有下面的查询,这是花了很长的执行时间aprox一组行1345222 20分钟。我有一种方法来调整这一点,特别是之间的条款比较?需要较长的时间。调整SQL查询

<code> 
SELECT /*+ PARALLEL(32) */ upexp.item, 
        upexp.loc, 
        startdate, 
        sku_exp.bucket_size, 
        MAX(upexp.sku_multiplier) OVER (PARTITION BY upexp.item,upexp.loc) max_sm 
         FROM 
           (SELECT bucket bkt, 
             MIN(dates) OVER (PARTITION BY bucket) minbk, 
             MAX(dates) OVER (PARTITION BY bucket) maxbk 
           FROM (
             SELECT LEVEL AS sl, 
             NEXT_DAY (TRUNC (SYSDATE, 'YEAR') + 7 * LEVEL - 8,'SATURDAY') AS dates, 
             CEIL (LEVEL/4) AS bucket 
             FROM DUAL 
             CONNECT BY LEVEL <= ((4 - MOD (78, 4) + 78) + 78)) yy 
           -- GROUP BY bucket 
           ) minmaxdate , 
         stsc.u_promo_sku_expand sku_exp, 
         stsc.u_promo_upload_expand upexp 
         WHERE sku_exp.bucket_size = 4 
         AND sku_exp.startdate BETWEEN minmaxdate.minbk AND minmaxdate.maxbk 
         AND upexp.item = sku_exp.item 
         AND upexp.loc = sku_exp.loc 
         AND upexp.u_country = sku_exp.u_country 
         AND ((eff BETWEEN minmaxdate.minbk AND minmaxdate.maxbk+6) 
         OR (disc BETWEEN minmaxdate.minbk AND minmaxdate.maxbk+6) 
         OR (eff <= minmaxdate.minbk AND disc >= minmaxdate.maxbk+6)) 

</code> 
+1

哪里是计划? '(eff BETWEEN minmaxdate.minbk AND minmaxdate.maxbk + 6)或eff <= minmaxdate.minbk AND disc> = minmaxdate.maxbk + 6)'在任何情况下都为真 –

+0

您是否有任何为实际表格?另外,我不太明白为什么在整个查询中有'SELECT ... FROM DUAL'。你不能移动它吗? – FDavidov

+0

用两个组来尝试组,而不是MIN/MAX OVER。并且将查询连接移出到WITH – Thomas

回答

0

此块

(SELECT bucket bkt, 
    MIN(dates) OVER (PARTITION BY bucket) minbk, 
    MAX(dates) OVER (PARTITION BY bucket) maxbk 
FROM (
    SELECT LEVEL AS sl, 
     NEXT_DAY (TRUNC (SYSDATE, 'YEAR') + 7 * LEVEL - 8,'SATURDAY') AS dates, 
     CEIL (LEVEL/4) AS bucket 
    FROM DUAL 
    CONNECT BY LEVEL <= ((4 - MOD (78, 4) + 78) + 78)) yy 
    -- GROUP BY bucket 
    ) 

似乎因为你只需要最小和最大价值是无用的。

试试这个:

WITH minmaxdate AS 
    (SELECT 
     NEXT_DAY (TRUNC (SYSDATE, 'YEAR') + 7 * 1 - 8,'SATURDAY') AS minbk, 
     NEXT_DAY (TRUNC (SYSDATE, 'YEAR') + 7 * ((4 - MOD (78, 4) + 78) + 78) - 8,'SATURDAY') AS maxbk 
    FROM dual) 
SELECT item, loc, startdate, sku_exp.bucket_size, 
    MAX(upexp.sku_multiplier) OVER (PARTITION BY item, loc) max_sm 
FROM stsc.u_promo_sku_expand sku_exp 
    JOIN stsc.u_promo_upload_expand upexp USING (item, loc, u_country) 
    CROSS JOIN minmaxdate 
WHERE sku_exp.bucket_size = 4 
    AND sku_exp.startdate BETWEEN minmaxdate.minbk AND minmaxdate.maxbk 
    AND (
     eff BETWEEN minmaxdate.minbk AND minmaxdate.maxbk+6 
     OR (eff <= minmaxdate.minbk AND disc >= minmaxdate.maxbk+6) 
     OR disc BETWEEN minmaxdate.minbk AND minmaxdate.maxbk+6 
    ); 
+0

我得到这个:ORA-25154:USING子句的列部分不能有限定符。但这工作很好。 SELECT item,loc,startdate,bucket_size --MAX(sku_multiplier)OVER(PARTITION BY sku_exp.item,sku_exp.loc)max_sm FROM stsc.u_promo_sku_expand sku_exp JOIN stsc.u_promo_upload_expand upexp USING(item,loc,u_country)WHERE sku_exp.bucket_size = 4 –