0

我相信这是在 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 有一个内置索引。我很好奇这个查询是否使数据库能够利用索引。

4

3 回答 3

2

在 上添加索引CREATION_DATE

我也会使用BETWEEN运算符来表示日期,但我喜欢这样阅读。

于 2012-12-18T17:06:39.220 回答
0

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

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

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

于 2012-12-19T11:38:21.373 回答
0

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

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

它允许只从索引页读取数据,而不需要寻找数据页。

于 2012-12-19T11:33:39.787 回答