2017-03-14 21 views
0

Locationsテーブルで自己結合を行う以下のクエリがあります。このクエリを100万レコードで実行すると、実行に2時間以上かかります。実行時間が改善されるように、このクエリでパフォーマンスの改善ができるかどうか本当に感謝します。クエリでのパフォーマンスの向上

SELECT 
    a.Id1, a.Id2, a.LocationStart, a.LocationEnd 
FROM 
    Locations AS a 
JOIN 
    Locations AS b 
ON 
    a.Id1= b.Id1 AND a.Id2 = b.Id2 
WHERE 
    a.DateTime = (
     SELECT 
      MIN(DateTime) 
     FROM 
      Locations 
     WHERE 
      Id1 = a.Id1 
      AND Id2 = a.Id2) 
+0

あなたは実際にここで解決しようとしていますか?たぶん問題は、1e^18の結果に対してクエリを実行するよりも、別のアプローチがあるかもしれません。 – Pentium10

+0

あなたは 'Locations AS b'が必要ですか?未使用です –

答えて

1

私はあなたのクエリが本当に意味がないことを確認します。私はそれが過度に単純化されていると想定しているので、両方のテーブル参照の列を含めます。

私は窓関数を使用して起動します:

SELECT l.Id1, l.Id2, l2.id1, l2.id2, l.LocationStart, l.LocationEnd 
FROM (SELECT l.*, 
      ROW_NUMBER() OVER (PARTITION BY id1, id2 ORDER BY datetime ASC) as seqnum 
     FROM Locations l 
    ) l JOIN 
    Locations l2 
    ON l.Id1 = l2.Id1 AND l.Id2 = l2.Id2 AND l.seqnum = 1; 

これは、あなたが(つまり、何の日付時刻の重複がない)最初のテーブルからユニーク値を探していることを前提としています。

次に、l1フィールドの最初の値を設定するだけです。何だと思う? joinはまったく必要ありません。

select first_value(l.id1) over (partition by id1, id2 order by datetime), 
     first_value(l.id2) over (partition by id1, id2 order by datetime), 
     l.id1, 
     l.id2, 
     first_value(l.locationstart) over (partition by id1, id2 order by datetime), 
     first_value(l.locationend) over (partition by id1, id2 order by datetime)  
from locations l; 
関連する問題