使用 Oracle 提示"FIRST_ROWS"提高 Oracle 数据库性能



我有一个在 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 条记录。

我不明白为什么差异这么大。

似乎为用户 id = 1 的语句选择了不同的执行计划,而对于用户 id = 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

问题:

  1. 当 userid = 2(不使用提示时)时性能不佳的可能原因是什么?
  2. 为什么一个语句与另一个语句的执行计划会有所不同(不使用提示时)?
  3. 在决定将此提示添加到我的查询中时,我应该注意什么吗?

1) 当 userid = 2(不使用提示时)时,性能不佳的可能原因是什么?

因为 Oracle 认为使用 (userid=1) 中的计划的一个临时结果集将非常大 - 可能是不正确的。

2)为什么一个语句与另一个语句的执行计划会不同(不使用提示时)?

基于直方图的索引

3)在决定将此提示添加到我的查询中时,我应该注意什么吗?

只要返回的记录数很少,此提示应该是故障安全的 - 与推动优化程序使用特定索引不同,此方法允许 Oracle 在索引更改时选择不同的计划。

最新更新