将 TIMESTAMP(6) 列转换为数字时,它的索引性能是否受到影响

Con*_*tin 5 index oracle oracle-11g cast

如果我有一个TIMESTAMP(6)列上的索引,我是否被迫将此列用作 aTIMESTAMP(6)以获得索引的好处?我可以将此列转换为具有第二个精度 ( YYYYMMDDHHmmss) 的数字并仍然实现索引性能吗?

例如:

 SELECT * FROM MYTABLE
 WHERE TO_NUMBER(TO_CHAR(MYCOLUMN, 'YYYYMMDDHH24MISS'), '99999999999999') > 20110622105738
   AND TO_NUMBER(TO_CHAR(MYCOLUMN, 'YYYYMMDDHH24MISS'), '99999999999999') <= 20150622105738
 ORDER BY MYCOLUMN
Run Code Online (Sandbox Code Playgroud)

这适用于 Oracle 11

Jus*_*ave 6

如果您在 上有一个简单的 b 树索引mycolumn,那么是的,您需要避免在该列上调用函数,以便能够使用索引来过滤行。在这种情况下,将数字文字转换为时间戳似乎比反过来更有意义

 SELECT * FROM MYTABLE
 WHERE my_column > to_timestamp( to_char(20110622105738), 'YYYYMMDDHH24MISS' )
   AND my_column <= to_timestamp( to_char(20150622105738), 'YYYYMMDDHH24MISS' ) 
 ORDER BY MYCOLUMN
Run Code Online (Sandbox Code Playgroud)

现在,您还可以创建基于函数的索引

create index idx_my_fbi
    on mytable( TO_NUMBER(TO_CHAR(MYCOLUMN, 'YYYYMMDDHH24MISS'), '99999999999999') );
Run Code Online (Sandbox Code Playgroud)

您的原始查询可以使用。

当然,无论哪种情况,Oracle 是否实际使用索引都取决于它期望谓词的选择性。由于您要返回 4 年的数据,因此即使索引符合使用条件,它似乎也不太可能有益。除非您的表中有数百年的数据,否则表扫描(如果表已分区,则对一个或多个分区进行完整扫描)似乎是更合适的查询计划。