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
如果您在 上有一个简单的 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 年的数据,因此即使索引符合使用条件,它似乎也不太可能有益。除非您的表中有数百年的数据,否则表扫描(如果表已分区,则对一个或多个分区进行完整扫描)似乎是更合适的查询计划。