2017-05-07 65 views
1

我想提高一个简单的查询性能,典型的结构类似:Oracle索引查询不工作

SELECT title,datetime 
FROM LICENSE_MOVIES 
WHERE client='Alex' 

正如你可以在不同的网站阅读,喜欢this,你应该作出这样的指标:

CREATE INDEX INDEX_LICENSE_MOVIES 
ON LICENSE_MOVIES(client); 

但是在查询中有任何性能,就像它在哪里“忽略”索引。 我尝试使用提示,如this webpage says。 而像这样的查询结果:

SELECT /*+ INDEX(LICENSE_MOVIES INDEX_LICENSE_MOVIES) */ title, datetime 
FROM LICENSE_MOVIES 
WHERE client='Alex' 

是否有任何错误在此语法?为什么我不明白有什么改进?

+2

您是否检查过执行计划以查看它是否正在使用索引?它*可能*是有效的忽略它。表格有多大,索引的选择性如何,您使用的是哪种版本的Oracle,并且您是否尝试收集统计信息以确保优化器具有所需的所有信息,以便认为索引是有用的(如果它实际存在)? –

+0

你好Alex,它是oracle v11。它看起来像使用索引,一个索引范围扫描,但它获取相同的原始比TABLE ACCESS BY INDEX ROWID,但不知道它是否正确...表不大,200K字节 – Sergiohernandez

+0

请参阅执行计划 - +规则提示,如果它会显示你的索引使用情况,那么没关系。现在,特别是如果创建新表并且有几行Oracle创建优化计划,例如它可以向您显示EP中的表全扫描。 – Seyran

回答

2

Oracle拥有智能优化器。它并不总是使用索引 - 事实上,您可能会惊讶地发现,有时使用索引正好是错误要做的事情。

就你而言,你的数据适合于少数数据页(好几十个)。问题是:数据中有多少“Alex”。如果只有一个,那么Oracle应该使用索引,如下所示:

  • Oracle在索引中查找包含“Alex”的行。
  • Oracle标识行所在的数据页面。
  • Oracle加载数据页面。
  • Oracle处理查询并返回结果。

如果很多行(比如几十个)都是“Alex”,那么优化器会“思考”。 。 。 “天哪,我需要阅读每个数据页面,无论如何。让我避免使用索引,只是扫描所有的数据。”

当然,这个决定是基于可用的统计数据(可能不准确或过时)。但是,即使索引可用,全表扫描仍然是正确的方法。

+0

的确,名称“alex”在代表变量可能值的循环中。那么,你认为没有办法改进这种查询的性能? – Sergiohernandez