performance - 当我为DATE列传递java.sql.Timestamp时,为什么Oracle这么慢?

标签 performance oracle date jdbc timestamp

我有一个带有时间的DATE列的表(与Oracle中的正常情况一样,因为没有TIME类型)。当我从JDBC查询该列时,有两个选择:

  • 使用Oracle的to_date()手动转换值
  • 使用java.sql.Timestamp

  • 两种方法都有效,并且具有唯一的丑陋区域。我的问题是在对数据进行SELECT编码时。这是两个示例查询:
    select *
    from TABLE
    where TS between {ts '2009-12-08 00:00:00.000'} and {ts '2009-12-09 00:00:00.000'}
    
    select *
    from TABLE
    where TS between trunc({ts '2009-12-08 00:00:00.000'}) and trunc({ts '2009-12-09 00:00:00.000'})
    

    这两个查询都有效,返回相同的结果,并在EXPLAIN PLAN中产生完全相同的输出。使用此正确的索引。

    仅一次查询运行15分钟,而第二次查询则需要0.031秒。这是为什么?是否有一个中心位置可以解决此问题,或者我必须检查所有针对此列的查询并完全确定trunc()在其中?当我需要选择秒数时如何解决此问题?

    [编辑]表已分区,我在Oracle 10.2.0上。

    最佳答案

    我不明白{ts'2009-12-08 00:00:00.000'}的实际含义,因为据我所知这不是Oracle SQL。您能确切显示您正在运行的查询吗?

    一个可能的问题是您以毫秒为单位指定范围。 Oracle的DATE类型仅下降到几秒钟。 (如果需要存储几分之一秒,请使用TIMESTAMP类型)。但是可能发生的情况是,在第一个查询中,Oracle将每个DATE值转换为一个TIMESTAMP,以便与您指定的TIMESTAMP进行比较。
    在第二种情况下,它知道TRUNC()将有效地将您的值四舍五入为可以表示为DATE的值,因此不需要进行转换。

    如果要避免此类隐式转换,请确保始终将“喜欢”与“喜欢”进行比较。
    例如

    select * 
    from my_table t
    where t.ts between to_date('2009-12-08','YYYY-MM-DD') and to_date('2009-12-09','YYYY-MM-DD')
    

    关于performance - 当我为DATE列传递java.sql.Timestamp时,为什么Oracle这么慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1945603/

    相关文章:

    algorithm - 在 Perl 中,非常快速地检查许多字符串之一是否存在于许多其他字符串之一中

    c# - jQuery 验证 dd/mm/yyyy 格式的日期

    Mysql 将 double 或 int 转换为日期或月份

    java - 通过 HashMap 对多项式求导。如何迭代 HashMap<Degree,Coeff>?

    python - 匹配长字符串时 finditer 挂起

    oracle - ORA-06550 : wrong number or types of arguments

    sql - ORA-06532 : Subscript outside of limit

    sql - 是否可以从子查询中获取多个值?

    date - 如何在 apache thrift 中表示日期类型

    java - 如何统计给定长度的所有可能的二进制子串的数量?