2017-03-14 82 views
0

我有以下查詢在位置表上進行自我連接。當我在一百萬條記錄上運行這個查詢時,執行時間超過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

你需要什麼?地點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;