如何改进这个SQL查询?

时间:2012-12-18 17:03:09

标签: sql oracle

我相信这是在Oracle上运行的SQL查询:

SELECT ID, DEVICE_TYPE, S3_KEY, TO_CHAR(CREATION_DATE, 'YYYY-MM-DD HH24:MI:SS') AS CREATION_DAT
FROM KASE_DDL.ARCHIVED_LOG 
WHERE 
    CREATION_DATE >= TO_DATE('{DIST_YYYY/MM/DD HH24:MI:SS_UTC}', 'YYYY/MM/DD HH24:MI:SS') 
    AND CREATION_DATE <= TO_DATE('{DIET_YYYY/MM/DD HH24:MI:SS_UTC}', 'YYYY/MM/DD HH24:MI:SS')

它运行缓慢,我想知道如何重写它以提高效率。例如,如果在CREATION_DATE上构建了索引,此查询是否可以使用索引?我记得读过书时说如果列周围有计算,Oracle可能无法使用任何基于它构建的索引。我的疑问是否属于这种情况?还有其他建议吗?谢谢。

更新:

在我的问题中,CREATION_DATE内置了一个索引。我很好奇这个查询是否允许数据库使用索引。

3 个答案:

答案 0 :(得分:2)

CREATION_DATE上添加索引。

我还会使用BETWEEN运算符作为日期,但我喜欢这样阅读。

答案 1 :(得分:0)

为了获得额外的性能提升,您可以尝试使用覆盖索引。 在你的情况下有

create index ndxCovering on KASE_DDL.ARCHIVED_LOG(CREATION_DATE, ID, DEVICE_TYPE, S3_KEY);

它允许仅从索引页读取数据而无需寻找数据页。

答案 2 :(得分:0)

您可以通过将user_indexes表中的clustering_factor与表的行数和块数进行比较来检查索引的可能有效性。聚类因子将在块数和行数之间,分别代表理论上的最小值和最大值。

如果聚类因子更接近于块的数量(即它相对较小),则更有可能选择索引,并且基于访问索引从表中选择块将需要较少的工作系统。

如果您对使用索引访问表时所看到的性能改进有任何疑问,那么总是值得一试。