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:相对日期和日期分区表的主要内容,如果未能解决你的问题,请参考以下文章