繁体   English   中英

查询用作视图时不使用索引

[英]Query does not use index when used as a view

我编写了一个查询,该查询对多个值执行时-使用表的索引并快速返回结果。

当我使用相同的语法创建视图时,索引有时保持未使用状态。

例如:查询以下查询时,使用索引DEP_IDX,该查询需要几秒钟才能返回结果:

Select /*+INDEX (s DEP_IDX) */ department, avg(salary) as dep_avg
From salaries s
Where department in (1,4,7,8)
Group by department

当我使用相同的语法创建视图时,如下所示:

Create or replace view Departments_Avg_Salary as
  Select /*+INDEX (s DEP_IDX)*/ department, avg(salary) as dep_avg
  From salaries s
  Group by department

然后在查询中使用视图:

Select e.Employee_Name, e.Employee_Salary, d.dep_avg
From Employees​ e Left join
     Departments_Avg_Salary d
     On d.department = e.Employees_Department
Where e.Employee_Name in ('Michael', 'Nittai', 'Jack')

不使用索引,查询需要一生才能返回!

如您所见,使用INDEX提示没有区别...

事实证明,鉴于表的巨大容量,在任何情况下都不会出现充分使用表访问存储的情况,因此我确实在寻找一种解决方案,以强制DB使用索引。

有任何想法吗?

提前致谢。

您最好是这样编写查询:

Select e.Employee_Name, e.Employee_Salary,
       (select avg(s.salary)
        from salaries s
        where s.department = e.Employees_Department
       ) avg_salary
From Employees​ e 
Where e.Employee_Name in ('Michael', 'Nittai', 'Jack');

然后具有有关employees(Employee_name)salaries(department, salary)索引。

您原始查询中的索引可能用于WHERE子句,而不是GROUP BY 至于视图中的提示,我将从文档中的警告开始:

Oracle不鼓励在视图(或子查询)内部或之上使用提示。 这是因为您可以在一个上下文中定义视图,而在另一个上下文中使用它们。 同样,这样的提示可能导致意外的执行计划。 特别是,根据视图是否可合并到顶级查询中,对视图内部或视图上的提示的处理方式有所不同。

您的独立查询包含以下WHERE子句:

Where department in (1,4,7,8)

因此,使用索引检索几个部门的记录将非常有效。

您的视图不会按部门进行筛选,因此将执行全表扫描。 您希望使用该视图的查询将把department谓词推入该视图的查询中...

From Employees​ e Left join
     Departments_Avg_Salary d
     On d.department = e.Employees_Department

...但是可惜优化器无法那样工作

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM