【问题标题】:How can I reduce this Query's operation time with Indexes?如何使用索引减少此查询的操作时间?
【发布时间】:2020-04-07 01:31:46
【问题描述】:

我有一个非常简单的查询和一个 8718 个寄存器池,它的运行时间大约是 7 秒,我不明白它背后的原因。我尝试使用索引,利用文档类型、状态和引用(基本上是 WHERE 子句中的变量)。即使使用了索引,也不会降低基数或成本。

我看不出有任何方法可以自行减少查询大小,所以我猜这一定是索引问题。我将不胜感激。

    SELECT TELEPHONE AS telephone, 
    GROUP AS group, 
    UPPER(GROUPNAME) AS groupName, 
    RECEIPTID AS receiptId, 
    sum(CHARGED) AS charged, 
    sum(PAID) AS paid, 
    YEAR as year, 
    MONTH as month 

    FROM PERMANENT_TABLE 
    where DOC_TYPE in('0', '01', '04') 
    and state = X 
    and reference = XXXXX
    GROUP BY TELEPHONE, RECEIPTID, GROUP, GROUPNAME, YEAR, 
    MONTH;

基数/成本:

分组方式:8718/7893 索引:30741/6168

感谢您的宝贵时间,如果需要任何其他信息,请告诉我。

【问题讨论】:

  • 哪个 WHERE 子句条件限制最大?如果大多数文档属于列出的三种类型之一,则具有第一个键列 DOC_TYPE 的索引将无济于事。如果引用 = XXXXXX 的行数很少,则您希望该列作为第一个索引键。如果没有完整的表结构,很难说更多,但我的猜测是使用索引(根据 where 子句条件的特殊性对键重新排序)和键(引用、状态、DOC_TYPE),其中还包括选定的列作为非键列.还要确保 WHERE 子句中没有发生隐式类型转换。
  • 在这种特殊情况下,所有文档类型都是 0,所以我想出于测试目的,它可以从索引中删除,我会尝试,正如您所说的将参考索引作为第一个子句。
  • 解释计划中显示的基数是估计将返回的行数,因此无论是否有任何索引或缺少索引,该数字都将保持不变。成本是优化器对资源使用的估计。最好不要依赖它作为性能指标。另外,您真的想要文档类型'0', '01', '04' 还是想要0, 1, 4?什么是 8718 寄存器池?
  • 谢谢你的解释,我真的不知道有什么区别,和池,我的意思是8718行信息。我需要的文档类型确实是 01 和 04,因为这是预定义的格式;感谢您花时间提供帮助。

标签: sql oracle indexing


【解决方案1】:

您的查询的最佳索引可能是:PERMANENT_TABLE(state, reference, DOC_TYPE)

statereference 列应该是前两个,但可以是任意顺序。

您可以包括其他列,但就性能而言,这可能不会是一个很大的胜利。

【讨论】:

  • 感谢您的回答,我按照您说的尝试了这个,但是在查询使用索引时遇到了一些问题,因为它只是继续进行完整搜索。通过使用月份和年份作为附加过滤器,我设法减少了一点时间,但我仍然对索引以及如何真正让它们在这样的情况下工作存在疑问
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 2012-02-26
  • 2019-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多