Oracle:相对日期和日期分区表

Posted

技术标签:

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

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

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

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

但显然,这行不通。

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

谢谢!

【问题讨论】:

【参考方案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)

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

【讨论】:

以上是关于Oracle:相对日期和日期分区表的主要内容,如果未能解决你的问题,请参考以下文章

ORACLE 分区表分区拆分

BigQuery 表设计最佳实践:日期分区和分片的组合?

Oracle 更新非索引和非分区表的有效方法?

在列出的日期范围之外流式传输到分区表 BigQuery

Oracle中日期字段未定义日期类型的案例补充说明

在 oracle 10g 中使用表分区