Sql 如何减少此查询';使用索引的操作时间是多少?
我有一个非常简单的查询和一个8718个寄存器池,它的运行时间大约是7秒,我不理解它背后的原因。我尝试使用索引,利用文档类型、状态和引用(基本上是WHERE子句中的变量)。即使使用了索引,也不会降低基数或成本 我看不到任何方法可以单独减少查询大小,所以我猜这一定是索引问题。我将感谢任何帮助Sql 如何减少此查询';使用索引的操作时间是多少?,sql,oracle,indexing,Sql,Oracle,Indexing,我有一个非常简单的查询和一个8718个寄存器池,它的运行时间大约是7秒,我不理解它背后的原因。我尝试使用索引,利用文档类型、状态和引用(基本上是WHERE子句中的变量)。即使使用了索引,也不会降低基数或成本 我看不到任何方法可以单独减少查询大小,所以我猜这一定是索引问题。我将感谢任何帮助 SELECT TELEPHONE AS telephone, GROUP AS group, UPPER(GROUPNAME) AS groupName, RECEIPTI
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
感谢您的时间,如果需要任何其他信息,请告诉我。您查询的最佳索引可能是:
永久表(状态、引用、文档类型)
state
和reference
列应该是前两列,但可以是任意顺序
您可以包括其他列,但就性能而言,这可能不是一个很大的胜利。WHERE子句条件限制最大的是哪一个?如果大多数文档属于列出的三种类型之一,则具有第一个键列DOC_TYPE的索引将没有帮助。如果reference=XXXXX的行很少,则希望该列作为第一个索引键。如果没有完整的表结构,很难说更多,但我的猜测是使用索引(根据where子句条件的特殊性对键进行重新排序)和键(引用、状态、DOC_类型),其中还包括作为非键列的选定列。还要确保WHERE子句中没有发生隐式类型转换。在这种特殊情况下,所有文档类型都是0,因此我想出于测试目的,可以将其从索引中删除,我将尝试,正如您所说,将引用作为第一个子句进行索引。解释计划中显示的基数是将返回的估计行数,因此无论是否有索引,该行数都将保持不变。成本是优化人员对资源使用的估计。最好不要将其作为绩效指标。另外,您真的想要文档类型
'0',01',04'
,还是想要0,1,4
?什么是8718个寄存器的池?谢谢你的解释,我并不知道它们之间的区别,对于这个池,我实际上指的是8718行信息。我需要的文档类型实际上是01和04,因为这是预定义的格式;谢谢你花时间帮助我。谢谢你的回答,正如你说的,我试过了,但是我在让查询使用索引时遇到了一些问题,因为它只是继续进行完整的搜索。通过使用月份和年份作为额外的过滤器,我设法减少了一点时间,但我仍然对索引以及如何使它们在这样的情况下真正起作用表示怀疑