2017-03-07 1 views
0

Existe-t-il un moyen d'améliorer la requête ci-dessous?Se joindre à Union dans sql performance de suppression de requête

La requête ci-dessous donne un résultat correct, mais la performance est en train de disparaître.

+0

Chaque requête individuelle est-elle également lente? avez-vous un index sur la colonne ID? BTW, je pense que vous devez utiliser PIVOT au lieu d'écrire une telle requête. – FLICKER

+0

Vous devriez commencer par avoir des index sur l'ID et si vous ne vous attendez pas à ce que les ID dupliqués entre table1 et table2, vous puissiez remplacer Union par Union All – NotCaring

+0

@FLICKER: Merci. J'ai un index sur ID. Est-ce possible grâce à Pivot. veuillez suggérer –

Répondre

2

Peut-être que quelque chose comme ça?

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 

Deviner serait plus facile si vous avez fourni des exemples ...

+2

peut-être passer à «union tout» pour éviter la déduplication? – SqlZim

+0

Oui, cela pourrait être possible, dépend bien sûr de ce que les données sont –

+0

vrai, mais puisque vous êtes en train d'agréger et en utilisant 'max()' de toute façon ... – SqlZim

0

Vous pouvez éviter(), utilisez la A.ID pour rejoindre et cela pourrait produire un certain avantage pour la performance

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