Oracle FIRST_ROWS优化器提示

时间:2015-05-22 19:31:26

标签: sql oracle plsql

我正在针对目前开发中的小表编写查询。在生产中,我们预计它会在表的生命周期中变得非常大(主键是数字(10))。

我的查询选择了我的表格的前N行,按特定条件筛选并按日期升序排序。从本质上讲,我们会将批量记录分配给特定用户进行处理。就我而言,N只会是10,20或30。

我目前在子选择中选择我的主键,使用rownum来限制我的结果,如下所示:

SELECT log_number FROM (
  SELECT
    il2.log_number,
    il2.final_date
  FROM log il2
  INNER JOIN agent A ON A.agent_id = il2.agent_id
  INNER JOIN activity lat ON il2.activity_id = lat.activity_id
  WHERE (p_criteria1 IS NULL OR A.criteria1 = p_criteria1)
  WHERE lat.criteria2 = p_criteria2
  AND lat.criteria3 = p_criteria3
  AND il2.criteria3 = p_criteria4
  AND il2.current_user IS NULL
  GROUP BY il2.log_number, il2.final_date
  ORDER BY il2.final_date ASC)
WHERE ROWNUM <= p_how_many;

虽然由于rownum我有一个停止密钥,但我想知道在内部选择上使用Oracle提示(/*+ FIRST_ROWS(p_how_many) */)是否会影响将来的查询计划。我想知道更多关于指定此提示时数据库的作用;如果你要订购桌子,它真的会有所作为吗? (看起来好像不会。)或者在访问和加入部分后它是否只影响选择部分?

现在看一下解释计划并没有让我感觉太多,因为桌子还没有增长。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

即使使用ORDER BY,当您限制返回的行数时,也可以选择不同的执行计划。通过某个顺序键选择前n行可以更容易,然后对这些行进行排序,而不是对整个表进行排序,然后选择前n行。

然而,GROUP BY可能会限制这种优化的好处。分组(或DISTINCT操作)通常会阻止优化器使用可以将单个行传递到STOPKEY操作的计划。