2017-03-07 11 views
0

以下のクエリを改善する方法はありますか?SQLクエリの殺害パフォーマンスでUnionと結合する

以下のクエリでは正しい結果が得られますが、パフォーマンスが低下します。

+0

個々のクエリも低速ですか? ID列にインデックスがありますか?ところで、私はそのようなクエリを書く代わりにPIVOTを使用する必要があると思います。 – FLICKER

+0

IDでインデックスを持つことから始めなければなりません。また、table1とtable2の間にIDが重複しないと思われる場合は、UnionをUnion Allと置き換えることができます。 – NotCaring

+0

@FLICKER:ありがとうございます。私はIDのインデックスを持っています。ピボットを介して可能ですか?親切に –

答えて

2

多分このような何か?あなたが任意の例を提供しているならば容易になるだろう推測

Select 
    ID, 
    max(case when MYDATE = '20160105 10:00:00' then PRICE else 0 end), 
    max(case when MYDATE = '20140805 10:00:00' then PRICE else 0 end), 
    max(case when MYDATE = '20170215 10:00:00' then PRICE else 0 end) 
FROM 
(
    select ID, PRICE FROM TABLE1 WHERE MYDATE in ('20160105 10:00:00', '20140805 10:00:00', '20170215 10:00:00') 
    UNION ALL 
    SELECT ID, PRICE FROM TABLE2 WHERE MYDATE in ('20160105 10:00:00', '20140805 10:00:00', '20170215 10:00:00') 
) A 
group by ID 

...

+2

が重複を避けるために 'union all'に切り替える可能性がありますか? – SqlZim

+0

はい、それは可能かもしれませんが、もちろんデータが –

+0

の場合は真ですが、あなたは集計していて、とにかく 'max()'を使用しているからです... – SqlZim

0
あなたは参加のために()、A.IDを使う避けることができ、これはパフォーマンスのために、いくつかの利益を生み出すことができ

Select A.ID, A.[2016 Price], B.[2014 Price], C.[2017 Price] 
FROM 

    (
    select ID, PRICE [2016 Price] FROM TABLE1 WHERE MYDATE = 2016-01-05 10:00:00 
    UNION 
    SELECT ID, PRICE FROM TABLE2 WHERE MYDATE = 2016-01-05 10:00:00 
) A 

INNER JOIN 

    (
    select ID, PRICE [2014 Price] FROM TABLE1 WHERE MYDATE = 2014-08-05 10:00:00 
    UNION 
    SELECT ID, PRICE FROM TABLE2 WHERE MYDATE = 2014-08-05 10:00:00 
) B ON A.ID =B.ID 

INNER JOIN 

    (
    select ID, PRICE [2017 Price] FROM TABLE1 WHERE MYDATE = 2017-02-15 10:00:00 
    UNION 
    SELECT ID, PRICE FROM TABLE2 WHERE MYDATE = 2017-02-15 10:00:00 
) ON A.ID =C.ID 
関連する問題