【问题标题】:Avoid implicit conversion from date to timestamp for selects with Oracle using Hibernate避免使用 Hibernate 使用 Oracle 进行选择从日期到时间戳的隐式转换
【发布时间】:2010-03-17 17:40:47
【问题描述】:

我正在使用 Hibernate 3.2.7.GA 条件查询从 Oracle 企业版 10.2.0.4.0 数据库中选择行,并按时间戳字段进行过滤。有问题的字段在 Java 中是 java.util.Date 类型,在 Oracle 中是 DATE

It turns out,该字段被映射到java.sql.Timestamp,Oracle 将所有行转换为TIMESTAMP,然后再与传入的值bypassing the index 进行比较,从而破坏性能。

一种解决方案是使用 Hibernate 的 sqlRestriction() 和 Oracle 的 TO_DATE 函数。这将修复性能,但需要重写应用程序代码(大量查询)。

那么有更优雅的解决方案吗?既然 Hibernate 已经做了类型映射,那么它可以被配置为做正确的事情吗?

更新:问题出现在多种配置中,但这里有一个具体示例:

  • Oracle 企业版 10.2.0.4.0
  • Oracle JDBC 驱动程序 11.1.0.7.0
  • 休眠 3.2.7.GA
  • Hibernate 的 Oracle10gDialect
  • Java 1.6.0_16

【问题讨论】:

标签: java oracle hibernate


【解决方案1】:

这听起来可能很激烈,但是当遇到这个问题时,我们最终将数据库中的所有 DATE 列转换为 TIMESTAMP 类型。我可以看到这没有任何缺点,如果 Hibernate 是您的主要应用程序平台,那么您将避免未来的恶化。

注意事项:

  • 列类型可以用 一个简单的“ALTER tableName MODIFY” 列名 TIMESTAMP(precisionVal)"。

  • 我惊讶地发现索引 在这些列上不必是
    重建。

同样,这只有在您致力于 Hibernate 时才有意义。

【讨论】:

  • 缩小尺寸是您的空间需求增加了一倍以上。日期需要 8 个字节,而时间戳需要 20 个字节。
  • 另一个缺点是 (DATE - DATE) 生成 NUMBER 日期类型,但 (TIMESTAMP - TIMESTAMP) 生成 INTERVAL 数据类型。所以这种“简单”的转换可能会破坏现有的逻辑。
  • 感谢您的建议,但很遗憾,目前无法转换所有 DATE 库。
【解决方案2】:

根据Oracle JDBC FAQ

“11.1 驱动程序在读取数据库时默认将 SQL DATE 转换为时间戳”

所以这是预期的行为。 对我来说,这意味着来自DATE 列的实际值被转换为java.sql.Timestamp,而不是带有java.util.Date 的绑定变量被转换为java.sql.Timestamp

EXPLAIN PLAN 输出将有助于识别问题。此外,Oracle 跟踪可以准确地告诉您在查询中为绑定变量分配了什么类型。

如果真的发生了,那可能是 Oracle 错误。

你可以这样解决它:

  • DATE 列上创建一个 FBI (Function Based Index),将其转换为 TIMESTAMP。例如:

    CREATE INDEX tab_idx ON tab (CAST(date_col AS TIMESTAMP)) COMPUTE STATISTICS;
    
  • 创建一个包含相同CAST 表达式的视图。如果需要,您可以保留相同的列名:

    CREATE VIEW v AS
    SELECT CAST(date_col AS TIMESTAMP) AS date_col, col_1, ... FROM tab;
    
  • 使用视图而不是表(这通常是个好主意,例如,如果您已经在使用视图,则根本不需要更改代码)。当java.sql.Timestamp 变量将在WHERE 条件下与date_col 一起使用时,(如果有足够的选择性)将使用索引。

  • 1234563代码

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多