2016-11-11 11 views
1

私は、行1345222のセットのために長い実行時間aprox 20分を取っている以下のクエリを持っています。私は、これを調整する方法、特にBetween句の比較?あなたが唯一の最小値と最大値を必要とするので、より長い時間がかかります。チューニング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 disk> = 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句の列部分に修飾子を付けることはできません。しかし、これはうまくいく。 (item、loc、u_country)WHERE sku_exp.bucket_size = item、loc、startdate、bucket_size -MAX(sku_exp.item、sku_exp.loc) 4 –

関連する問題