Sql Oracle性能与索引

Sql Oracle性能与索引,sql,performance,oracle,Sql,Performance,Oracle,比如说,如果我有表1,它包含数百万条记录。 该表有A、B和C列。 我有一个A和B的索引。 C完全没有索引 之后,我按照下面的步骤进行查询 我从表1运行querySelect*,其中A='something'和 B='something' 我从表1中运行querySelect*,其中 A='something'和B='something'以及C='something' 我知道这两个查询都将使用我指定的索引。根据我的理解,两个查询的性能应该是相同的。但是,是否有可能一个查询比另一个查询具有更好的性能

比如说,如果我有表1,它包含数百万条记录。 该表有A、B和C列。 我有一个A和B的索引。 C完全没有索引

之后,我按照下面的步骤进行查询

  • 我从表1运行query
    Select*,其中A='something'和
    B='something'
  • 我从表1中运行query
    Select*,其中
    A='something'和B='something'以及C='something'

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

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

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

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

    顺便说一下,两者都可以利用
    表1(A、B、C)
    上的索引


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

    这听起来像是你可以自己测试的东西。你是说表1(a,B),因为C根本没有索引?@Rudy。我说如果索引包含“代码>C<代码”作为第三列,则两个查询都可以利用索引。如果A、B和C是表中的唯一列,则应该考虑将表转换为IoT。此外,如果您总是在查询中引用A和B,那么您应该查看这两列中的哪一列选择性较低,并将其设置为前导列,以便更有效地利用压缩。