【问题标题】:Seaching for two columns in three-column composite index - Oracle在三列复合索引中搜索两列 - Oracle
【发布时间】:2010-11-21 12:09:39
【问题描述】:

我的一张表的三列上有一个复合索引。如果我在查询的 where close 中有三列,它可以找到。当我的搜索查询只有三分之二时,事情似乎不再那么快了!

你知道如何解决这个问题吗?

谢谢,

附: 表

APPL_PERF_STATS

在 (current_appl_id, event_name & generic_method_name) 上有复合索引 这个耗时 2 分钟(使用复合索引中的所有列):

SELECT * FROM APPL_PERF_STATS WHERE (GENERIC_METHOD_NAME != 'NULL' AND CURRENT_APPL_ID != 'NULL' AND EVENT_NAME != 'NULL') AND ROWNUM = to_date('20-07-2008 14:36','dd-mm-yyyy HH24:mi') AND cover_period_start_ts

这个运行了 12 分钟(仅使用综合索引中的三分之二):

SELECT * FROM APPL_PERF_STATS WHERE (GENERIC_METHOD_NAME != 'NULL' AND CURRENT_APPL_ID != 'NULL' AND EVENT_NAME != 'NULL') AND ROWNUM = to_date('20-07-2008 14:36','dd-mm-yyyy HH24:mi') AND cover_period_start_ts

【问题讨论】:

  • - 每个语句的查询计划是什么? - 每个查询返回多少行?如果后一个查询返回更多的行,自然需要更长的时间才能完成。 - 你如何衡量“2分钟”和“12分钟”?那是获取第一行的时间吗?获取最后一行的时间?还是别的什么?
  • 请原谅我对数据库术语缺乏经验。不太确定查询计划是什么意思..我正在使用 TOAD 运行查询,它会立即带来结果,所以我不太确定它是第一行还是所有行。我从 TOAD 获得时间,因为它显示了查询花费了多长时间,所以我猜它是获取所有结果的时间。

标签: sql oracle


【解决方案1】:
  • 您知道要搜索三个术语中的哪两个吗?为获得最大效率,Oracle 将仅在您查询索引的前导列时使用索引。也就是说,(column_1column_2column_3) 上的索引可用于对 column_1column_2 的查询与对所有三个的查询一样有效。但是,如果您在 column_2column_3 上进行搜索,则(至少)效率会大幅下降,因为它们不是前导列。
  • 您使用的是什么版本的 Oracle?根据 Oracle 版本和前导列的选择性,如果您的查询不包括索引的前导列,Oracle 可能能够使用所谓的“索引跳过扫描”来利用索引。这将比常规索引范围扫描效率低,但可能比表扫描更有效。
  • 对于没有您希望的那么快的查询的查询计划是什么?我们可以猜测优化器可能会做什么,但查看实际的查询计划会更有用。

【讨论】:

  • 第一个tip对Mysql也有效。
  • 谢谢贾斯汀..好建议..我在我的问题中发布了查询,如果这有助于提供更多见解
  • 我拥有的索引按照我上面提到的顺序(current_appl_id、event_name 和 generic_method_name),我正在按(current_appl_id、event_name)搜索,但仍然看到性能下降
【解决方案2】:

“当我的搜索查询只有三分之二时,事情似乎不再那么快了!” 你还期待别的吗?

如果您必须拨打电话簿中的所有“Smith, John”,您可能有 50 个条目,这需要 5 个小时。如果您拨打电话簿中的所有“Smith”条目,您可能有 500 个条目,并且需要十倍的时间。

真正的问题是,对于您期望处理的数据量,性能是否合理/可接受。

查看查询,一种选择可能是考虑单独或与其他列组合索引cover_period_start_ts 和/或appl_perf_interval_typ_id。我怀疑很多时间都浪费在查找与索引条件匹配的行、转到表然后拒绝该行,因为时间戳或间隔类型不符合指定条件。

PS。如果您查看查询,您会发现所有三列都在 where 子句的 != 'NULL' 部分中指定,因此从技术上讲,它使用索引的所有三列,但其中两列作为 access_predicate,一列作为一个filter_predicate

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 2013-11-05
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    • 2015-12-29
    • 2018-02-02
    • 1970-01-01
    相关资源
    最近更新 更多