Oracle Index查询无效

时间:2017-05-07 08:13:57

标签: sql oracle performance indexing subquery

我想提高简单查询的性能,典型结构如下:

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'

此语法中是否有任何错误?为什么我不欣赏任何改进?

1 个答案:

答案 0 :(得分:3)

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

在您的情况下,您的数据适合少数几个数据页面(好吧,几十个)。问题是:数据中有多少“Alex”。如果只有一个,那么Oracle应该使用索引,如下所示:

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

如果有很多行(比如说多于几十行)用于“Alex”,那么优化器就会“思考”。 。 。 “天哪,我需要读取每个数据页 。让我避免使用索引,只扫描所有数据。”

当然,此决定基于可用的统计信息(可能不准确或过时)。但是,即使索引可用,肯定存在全表扫描是正确方法的情况。