我们有一些表可以跟踪已处理的事务。这些表有数百万行。很多时候我想查看最近的 X 事务,所以我有一个这样的查询来从几个表中提取我想要的信息:
select a.id, b.field_one, c.field_two
from trans a, table_two b, table_three c
where a.id = b.id
and a.id = c.id
and a.id in
(select id from trans where id > (select max(id) from trans) - 100);
现在查询很慢。解释计划显示了对 B 和 C 的全表扫描。现在,如果我分别评估嵌套查询并将其替换为逗号分隔的 ID 列表,则查询非常快。这对我来说似乎很明显 - 它只有 100 行可以连接在一起,所以它当然会比通过首先将 A 和 B 连接在一起来回答查询要快。
从概念上讲,我理解查询优化器正在尝试找到一个好的执行计划,但在这种情况下,它似乎做得很糟糕。有什么方法可以强制 DBMS 先执行嵌套查询?可能通过使用提示?
谢谢