我在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
提前致谢
答案 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?