【问题标题】:Oracle use a hint index to a view and force it to base tableOracle 对视图使用提示索引并将其强制为基表
【发布时间】:2020-05-27 21:53:04
【问题描述】:

如何在针对视图的查询中使用提示来强制 Oracle 使用基表上的索引?

例如

查看

select emp_id 
from v_employees 

基表

select emp_id /*+ INDEX(employees IDX_emp_id) */ 
from employees

我想从视图中读取,但使用基表中的索引,而不更改视图查询。像这样的:

select emp_id /*+ INDEX(v_employees employees IDX_emp_id) */
from v_employees

【问题讨论】:

  • 我想从视图中选择,但使用基表中的索引。
  • 我在问如何从视图中选择但使用基表中的索引
  • 我在问如何在不改变视图查询的情况下做到这一点

标签: sql oracle performance indexing query-optimization


【解决方案1】:

根据Oracle documentation

您可以将 SQL 语句的提示发送到优化器,方法是包含 他们在声明中的评论中。

语句中的块只能有一个包含提示的注释 在 SELECT、UPDATE、MERGE 或 DELETE 关键字之后。

SELECT /*+ hint [text] [hint[text]]... */ COLUMNS... FROM TABLE....

因此,在您的情况下,请使用 SELECT 关键字后面的提示。

select /*+ INDEX(employees IDX_emp_id) */ emp_id  from employees

干杯!!

【讨论】:

  • 问题并不完全清楚,但似乎 Seeker 在查询 视图而不是视图下的表时想要使用索引提示。
  • 没错,我想知道在查询视图而不是基础表时如何使用索引提示
  • 这确实引出了为什么的问题?为什么需要使用提示?
【解决方案2】:

我们可以使用全局提示来引用视图中的表。视图名称使用. 与表名或别名(如果我们想访问子查询中的表的索引)嵌套。

所以在你的例子中应该是:

select /*+ INDEX(v_employees.employees IDX_emp_id) */ emp_id 
from v_employees 

请注意,提示出现在投影之前。

【讨论】:

    猜你喜欢
    • 2012-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多