gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:37:09 29 4
gpt4 key购买 nike

我有一个带有时间的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/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com