“to_timestamp”是否应用于每一行?

问题描述 投票:0回答:2

我需要查询一个大表(我使用的是oracle)

并且查询语句必须通过时间戳数据类型查表

例如

SELECT * 
FROM rec 
WHERE timscolumn between to_timestamp('2023-07-02 00:00:00', 'YY-MM-DD HH24:MI:SS') AND to_timestamp('2023-08-25 23:59:59', 'YY-MM-DD HH24:MI:SS')

我的问题是,

to_timestamp
函数是否应用于每一行?

例如

我的记录表有 100000000000 行 我需要搜索 2023-01-10 ~ 2023-12-10 之间的日期 时间戳类型列名为 timscolumn 。 我在时间列上有索引。

当我询问时,

to_timestamp
函数是否应用于每一行? 我是说

数据库是否对每一行执行转换(字符串 -> 时间戳)以进行比较?

在这种情况下,我认为这可能会导致严重的性能问题。 (我在获取表时已经遇到了严重的性能问题,是否进行了查询调整并解决了问题,但我仍然不确定是否可以使用

to_timestamp

如果这是重复的问题,我很抱歉。我用谷歌搜索但还没有找到 如果您可以链接任何好的参考资料或给我任何解释,这将非常有帮助 谢谢你

oracle timestamp
2个回答
0
投票

您的代码中没有转换。

由于

timscolumn
的数据类型已经是
timestamp
,所以左侧一切正常。不过,右侧应该进行修改。如果年份用 4 位数字表示,请使用
yyyy
格式模型,而不仅仅是
yy


如果 timscolumn 是例如,那么

将会很重要。 
varchar2
 然后您将其转换为时间戳,例如

WHERE to_timestamp(timscolumn, 'yyyy-mm-dd hh24:mi:ss') between ...
在这种情况下,将不会使用 

timscolumn

 上的索引。不过,您可以创建一个
基于函数的索引。


就性能本身而言:如果表包含 100.000.000.000 行,则返回结果需要时间。


0
投票
数据库是否对每一行执行转换(字符串 -> 时间戳)以进行比较?

不。您正在将字符串文字

'2023-07-02 00:00:00'

'2023-08-25 23:59:59'
 转换为 
TIMESTAMP
 而不是列 
timscolumn
 (我假设它已经是 
TIMESTAMP
),所以,不,文字的转换可以完成一次并且应用于所有行。

但是,您可以重写查询以使用

TIMESTAMP

 文字,然后就不需要转换任何内容:

SELECT * FROM rec WHERE timscolumn BETWEEN TIMESTAMP '2023-07-02 00:00:00' AND TIMESTAMP '2023-08-25 23:59:59';
并且您还可以修复查询(假设您没有使用

TIMESTAMP(0)

),以便它不排除
2023-08-25 23:59:59.000000001
2023-08-25 23:59:59.999999999
之间的时间戳:

SELECT * FROM rec WHERE timscolumn BETWEEN TIMESTAMP '2023-07-02 00:00:00.000000000' AND TIMESTAMP '2023-08-25 23:59:59.999999999';
或更简单地说:

SELECT * FROM rec WHERE timscolumn >= TIMESTAMP '2023-07-02 00:00:00' AND timscolumn < TIMESTAMP '2023-08-26 00:00:00';
    
© www.soinside.com 2019 - 2024. All rights reserved.