【问题标题】:Oracle: Relative dates and date partitioned tableOracle:相对日期和日期分区表
【发布时间】:2020-03-27 17:40:49
【问题描述】:

我在 Oracle 中有一个按 DATETIME 列划分的每月分区表。该表包含 > 60 亿行。现在我想使用sysdate 过滤这个表。因此,我可以使用相对日期编写查询,例如昨天、上一个工作日、去年等...

所以,我正在寻找类似下面的代码:

SELECT *
FROM BIG_PART_TABLE PARTITION FOR (DATE **TODAY**)
WHERE TRUNC(DATETIMECOLUMN) = TRUNC(SYSDATE)

但显然,这行不通。

你有什么想法让我可以让它工作吗?

谢谢!

【问题讨论】:

    标签: sql oracle date query-optimization database-partitioning


    【解决方案1】:

    您无法可靠地判断 Oracle 需要查看哪个分区,因为sysdate 是一个易失函数(即,它的值不会随时间变化)。与其为此编写复杂的动态代码,您可能应该首先相信数据库会选择正确的分区。

    我将您的查询表述如下:

    select *
    from big_part_table partition 
    where datetimecolumn >= trunc(sysdate) and datetimecolumn < trunc(sysdate) + 1
    

    where 条件在功能上等同于您的原始条件,它为数据库提供了一个合理的机会来评估应该使用哪个分区。

    【讨论】:

    • 很好!!此外,我通过执行where TRUNC(datetimecolumn) 正在失去性能,因为它需要为每条记录运行TRUNC 函数,可能会绕过分区优势。因此,按照您所说的进行查询,我将运行时间从 98 秒减少到 35 秒 :)
    【解决方案2】:

    使用范围比较:

    SELECT *
      FROM BIG_PART_TABLE
      WHERE DATETIMECOLUMN BETWEEN TRUNC(SYSDATE)
                               AND TRUNC(SYSDATE+1)
    

    这是一种在搜索索引日期值时很有用的模式。

    【讨论】:

      猜你喜欢
      • 2019-10-31
      • 1970-01-01
      • 2016-02-21
      • 1970-01-01
      • 2012-11-07
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 2020-04-29
      相关资源
      最近更新 更多