【问题标题】:Does an index improve all kinds of queries?索引是否可以改善各种查询?
【发布时间】:2013-07-07 03:49:33
【问题描述】:

假设我有一个如下定义的书桌:

table book(id varchar(50), title varchar(100),type varchar(20),publisher varchar(20), price float)

假设在 ID 上定义了一个索引。现在使用 ID 的查询将得到改进,例如:

select * from book where id='abcd123456'

但是使用其他字段的查询也会得到改进吗?例如,这两个查询:

select * from book where title = 'algorithms'
select * from book where price > 25

【问题讨论】:

    标签: sql database oracle indexing


    【解决方案1】:

    不,不会。但是,如果某一列上有索引,并且查询涉及该列和其他列,则可以使用索引,如果可以的话。

    【讨论】:

    • 不是真的“如果可以的话”,更像是“如果它是有益的”。
    【解决方案2】:

    每个进入 sql 性能调优的人都应该阅读Tuning by cardinality feedback by Wolfgang Breitlingi

    至于您的问题 - oracle 只会选择索引访问路径,前提是它比访问整个表更便宜。它通过估算每个执行计划的成本来做到这一点。

    在您的示例中,如果 id 是唯一的,则 oracle 期望 1 行 - 索引成本是访问索引头 + 到达叶子(通常是 2 个块读取)+ 表块访问(通常是 1 个块) - 总共 ~ 4 铬。 执行 FTS(全表扫描)将导致读取表中的所有块。成本是表中的块数除以db_file_multiblock_read_count。 如果 FTS 开销大于 4 个 oracle 将执行索引唯一扫描。

    关于非唯一谓词的第二个问题 - 如果 oracle 估计 price > 15 会导致更少的行,他会更喜欢索引访问,否则他会更喜欢 FTS 访问。

    这篇文章很好地解释了这一切。

    【讨论】:

      猜你喜欢
      • 2023-03-29
      • 1970-01-01
      • 2016-06-20
      • 1970-01-01
      • 1970-01-01
      • 2015-12-27
      • 1970-01-01
      • 2011-03-20
      • 1970-01-01
      相关资源
      最近更新 更多