gpt4 book ai didi

sql - 在三列复合索引中搜索两列 - Oracle

转载 作者:行者123 更新时间:2023-12-05 00:08:29 27 4
gpt4 key购买 nike

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

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

谢谢,



附言
table

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 < 502 AND current_appl_id = 'OMS' AND event_name = 'OMS-CeaseProduct' AND generic_method_name = 'CE CallForwardFixedCOProduct' AND appl_perf_interval_typ_id = 1440 AND cover_period_start_ts >= to_date('20-07-2008 14:36','dd-mm-yyyy HH24:mi') AND cover_period_start_ts <= to_date('19-08-2009 14:36','dd-mm-yyyy HH24:mi') ORDER BY CURRENT_APPL_ID, EVENT_NAME, GENERIC_METHOD_NAME, CREATE_TS



这个运行了 12 分钟(在复合索引中只使用了三分之二):

SELECT * FROM APPL_PERF_STATS WHERE (GENERIC_METHOD_NAME != 'NULL' AND CURRENT_APPL_ID != 'NULL' AND EVENT_NAME != 'NULL') AND ROWNUM < 502 AND current_appl_id = 'OMS' AND event_name = 'OMS-CeaseProduct' AND appl_perf_interval_typ_id = 1440 AND cover_period_start_ts >= to_date('20-07-2008 14:36','dd-mm-yyyy HH24:mi') AND cover_period_start_ts <= to_date('19-08-2009 14:36','dd-mm-yyyy HH24:mi') ORDER BY CURRENT_APPL_ID, EVENT_NAME, GENERIC_METHOD_NAME, CREATE_TS

最佳答案

  • 您知道要根据三个术语中的哪两个进行搜索吗?为了获得最大效率,Oracle 将仅在您查询索引的前导列时使用索引。也就是说,( column_1 , column_2 , column_3 ) 上的索引可以同样有效地用于 column_1 上的查询和 column_2因为它可以查询所有三个。如果您在 column_2 上搜索,(至少)效率会大幅下降。和 column_3 ,但是,因为那些不是前导列。
  • 您使用的是哪个版本的 Oracle?根据 Oracle 版本和前导列的选择性,如果您的查询不包含索引的前导列,则 Oracle 可能能够使用所谓的“索引跳过扫描”来利用索引。这将比常规索引范围扫描效率低,但可能比表扫描效率更高。
  • 对于没有您希望的那么快的查询,查询计划是什么?我们可以猜测优化器可能会做什么,但查看实际的查询计划更有用。
  • 关于sql - 在三列复合索引中搜索两列 - Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1309210/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com