我需要查询一个大表(我使用的是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
)
如果这是重复的问题,我很抱歉。我用谷歌搜索但还没有找到 如果您可以链接任何好的参考资料或给我任何解释,这将非常有帮助 谢谢你
您的代码中没有转换。
由于
timscolumn
的数据类型已经是timestamp
,所以左侧一切正常。不过,右侧应该进行修改。如果年份用 4 位数字表示,请使用 yyyy
格式模型,而不仅仅是 yy
。
如果 timscolumn
是例如,那么
将会很重要。
varchar2
然后您将其转换为时间戳,例如
WHERE to_timestamp(timscolumn, 'yyyy-mm-dd hh24:mi:ss') between ...
在这种情况下,将不会使用 timscolumn
上的索引。不过,您可以创建一个基于函数的索引。
数据库是否对每一行执行转换(字符串 -> 时间戳)以进行比较?不。您正在将字符串文字
'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';