【问题标题】:Oracle Performance with Index带索引的 Oracle 性能
【发布时间】:2026-01-26 12:10:01
【问题描述】:

假设我有包含数百万条记录的表 TABLE1。 该表有 A、B 和 C 列。 我有一个 A 和 B 的索引。 C 根本没有被索引。

之后我按照以下方式进行查询

  1. 我运行查询Select * from TABLE1 where A='something' and B='something'
  2. 我运行查询Select * from TABLE1 where A='something' and B='something' and C='something'

我了解这两个查询都将使用我指定的索引。根据我的理解,两个查询的性能应该是相同的。但是,查询是否有可能比另一个查询具有更好的性能/运行得更快?为什么?

【问题讨论】:

  • 这听起来像是你可以自己测试的东西。

标签: sql performance oracle


【解决方案1】:

查询不一定会使用索引。 Oracle 根据索引的“选择性”决定使用索引进行查询。因此,如果 90% 的行有 a = 'something' and b = 'something' 为真,那么全表扫描比使用索引更快。

在这两种情况下,索引的选择性是相同的(假设比较值相同)。所以两者应该使用相同的执行计划。

即便如此,第二个查询通常会运行得更快一些,因为它通常具有较小的结果集。结果集的大小是影响查询性能的另一个因素。

顺便说一句,两者都可以利用table1(A, B, C) 上的索引。

此外,在“冷”数据库(一个刚刚启动,没有运行查询)上,第二个应该运行得更快,原因很简单,部分或全部数据已经加载到页面和索引缓存中。

【讨论】:

  • 你的意思是 table1(A,B) 因为 C 根本没有索引?
  • @Rudy。 . .我说过,如果索引包含C 作为第三列,那么两个查询都可以利用索引。
  • 如果表中只有 A、B 和 C 列,则应考虑将表转换为 IOT。此外,如果您总是在查询中引用 A 和 B,则应查看这两列中的哪一列较少选择性,并将其设为前导列,以便您可以更有效地利用压缩.