【问题标题】:Oracle Index query is not workingOracle 索引查询不起作用
【发布时间】:2017-10-05 08:54:55
【问题描述】:

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

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'

这个语法有什么错误吗?为什么我不能欣赏任何改进?

【问题讨论】:

  • 你检查过执行计划看它是否在使用索引吗? 可能忽略它是有效的。表有多大,索引的选择性如何,您使用的是哪个版本的 Oracle,您是否尝试过收集统计信息以确保优化器拥有认为索引有用(如果确实如此)所需的所有信息?
  • 你好 Alex,这是 oracle v11。它看起来像使用 Index,一个 INDEX RANGE SCAN ,但它获取与 TABLE ACCESS BY INDEX ROWID 相同的原始数据,但不确定它是否正确......表不大,200K 字节
  • 查看执行计划以获取 --+ 规则提示,如果它会显示索引使用情况,则可以。现在,特别是如果创建新表并且有几行 Oracle 会创建优化计划,例如它可以显示 EP 中的表全扫描。
  • 是的,它显示了索引的使用情况,但没有从中受益..

标签: sql oracle performance indexing subquery


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 确实,名称“alex”在一个循环中,表示来自变量的可能值。那么,您认为没有办法提高这种查询的性能?
猜你喜欢
  • 2018-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-03
  • 2020-07-12
相关资源
最近更新 更多