我有一个在 Oracle 数据库服务器上运行的语句。该语句有大约 5 个连接,那里没有什么异常。它看起来很像下面:
SELECT field1, field2, field3, ...
FROM table1, table2, table3, table4, table5
WHERE table1.id = table2.id AND table2.id = table3.id AND ...
table5.userid = 1
问题(有趣的是)是 userid = 1 的语句需要 1 秒才能返回 590 条记录。userid = 2 的语句需要大约 30 秒才能返回 70 条记录。
我不明白为什么差异如此之大。
似乎为 userid = 1 的语句选择了不同的执行计划,而为 userid = 2 选择了不同的执行计划。
在我实施 Oracle Hint FIRST_ROW 后,性能明显提高。两个语句(对于 id 1 和 2)都在 1 秒内产生返回。
SELECT /*+ FIRST_ROWS */
field1, field2, field3, ...
FROM table1, table2, table3, table4, table5
WHERE table1.id = table2.id AND table2.id = table3.id AND ...
table5.userid = 1
问题:
- 当 userid = 2(不使用提示时)时性能不佳的可能原因是什么?
- 为什么一个语句和另一个语句的执行计划会不同(不使用提示时)?
- 在决定将此提示添加到我的查询时,我应该注意什么?