Oracle Subquery消耗大量时间

时间:2012-08-01 05:38:44

标签: sql oracle

我在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

提前致谢

2 个答案:

答案 0 :(得分: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

我希望对其他人有帮助。

答案 1 :(得分:0)

你能确定为什么这条线花了这么长时间(除了每行评估一行)。我建议查看查询计划并查看时间进度,可能需要一个新的索引来加速性能,或者一个微妙的重写可能会起到作用。

如果您需要帮助查看执行计划,那么我建议从以下开始。

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