2012-08-01 58 views
1

我有查詢在Oracle中,看起來像這樣:甲骨文子查詢消耗了大量的時間

SELECT 
    t1.tid, t1.column1, t1.column2 
    FROM 
    table1 t1 
    JOIN 
    log_table lg ON t1.tid = lg.tid 
    WHERE 
    t1.insert_date > lg.date_of_insert 
    AND lg.log_id = (SELECT MAX(log_for_last.log_id) FROM log_table log_for_last WHERE lg.tid = log_for_last.tid) 
    AND t1.insert_date = (SELECT MAX(t1_last_date.insert_date) FROM table1 t1_last_date WHERE t1_last_date.tid = t1.tid); 

但它消耗了大量的時間來完成。問題是在這一行:

AND t1.insert_date = (SELECT MAX(t1_last_date.insert_date) FROM table1 t1_last_date WHERE t1_last_date.tid = t1.tid); 

t1.tid必須是唯一的。我該如何優化這個查詢?

編輯:

我嘗試以下,但它給了我SQL錯誤:ORA-00904: 「RN」:無效的標識符錯誤:事先

SELECT 
    t1.tid, t1.column1, t1.column2, 
    ROW_NUMBER() OVER (ORDER BY t1.insert_date DESC) rn 
FROM 
    table1 t1 
    JOIN 
    log_table lg ON t1.tid = lg.tid 
WHERE 
    t1.insert_date > lg.date_of_insert 
    AND lg.log_id = (SELECT MAX(log_for_last.log_id) FROM log_table log_for_last WHERE lg.tid = log_for_last.tid) 
    AND rn = 1 

感謝

+1

使用分析函數可能是最好的選擇。但是您需要使用內聯視圖來基於'rn'進行過濾:「分析函數是查詢中執行的最後一組操作,除了最終的ORDER BY子句之外,所有連接以及所有WHERE,GROUP BY和HAVING子句在處理分析函數之前完成,因此分析函數只能出現在選擇列表或ORDER BY子句中。「 http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions004.htm#i81407 – 2012-08-01 06:23:24

回答

4

我解決我的問題,如:

SELECT * 
FROM 
(
    SELECT 
     t1.tid, t1.column1, t1.column2, 
     ROW_NUMBER() OVER (PARTITION BY t1.tid ORDER BY t1.insert_date DESC) rn 
    FROM 
     table1 t1 
    JOIN 
     log_table lg ON t1.tid = lg.tid 
    WHERE 
     t1.insert_date > lg.date_of_insert 
     AND lg.log_id = (SELECT MAX(log_for_last.log_id) FROM log_table log_for_last WHERE lg.tid = log_for_last.tid) 
) 
WHERE rn = 1 

我希望這會有所幫助別人。

0

你能確定爲什麼這一行花了這麼長時間(除了每行評估)。我建議看一下查詢計劃,看看時間在哪裏,可能需要一個新的索引來加速性能,或者一個微妙的重寫可能會訣竅。

如果你需要幫助看執行計劃,那麼我建議從以下開始。

SQL*Plus FAQ - How does one trace (and explain) SQL statements from SQL*Plus?

+0

我無法添加索引,因爲此表位於其他架構。 – 2012-08-01 06:05:18

+0

除了查看查詢的計劃之外,您是否考慮過將其轉換爲一個過程,並分解子查詢? – 2012-08-01 06:20:54

+0

謝謝你的時間@ daz-fuller。我解決了這個問題,現在就會發布 – 2012-08-01 06:23:46