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

提前致谢

4

2 回答 2

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

我希望它对其他人有帮助。

于 2012-08-01T06:28:40.977 回答
0

您能否确定为什么该行需要这么长时间(除了对每一行进行评估)。我建议查看查询计划并查看时间在哪里,可能需要一个新索引来提高性能,或者一个微妙的重写可能会奏效。

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

SQL*Plus 常见问题解答 - 如何跟踪(和解释)来自 SQL*Plus 的 SQL 语句?

于 2012-08-01T05:52:13.327 回答