我相信这是在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内置了一个索引。我很好奇这个查询是否允许数据库使用索引。
答案 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与表的行数和块数进行比较来检查索引的可能有效性。聚类因子将在块数和行数之间,分别代表理论上的最小值和最大值。
如果聚类因子更接近于块的数量(即它相对较小),则更有可能选择索引,并且基于访问索引从表中选择块将需要较少的工作系统。
如果您对使用索引访问表时所看到的性能改进有任何疑问,那么总是值得一试。