我想提高简单查询的性能,典型结构如下:
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'
此语法中是否有任何错误?为什么我不欣赏任何改进?
答案 0 :(得分:3)
Oracle有一个智能优化器。它并不总是使用索引 - 实际上,您可能会惊讶地发现,有时使用索引正是错误的要做的事情。
在您的情况下,您的数据适合少数几个数据页面(好吧,几十个)。问题是:数据中有多少“Alex”。如果只有一个,那么Oracle应该使用索引,如下所示:
如果有很多行(比如说多于几十行)用于“Alex”,那么优化器就会“思考”。 。 。 “天哪,我需要读取每个数据页 。让我避免使用索引,只扫描所有数据。”
当然,此决定基于可用的统计信息(可能不准确或过时)。但是,即使索引可用,肯定存在全表扫描是正确方法的情况。