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

时间:2020-03-27 17:40:49

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

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

所以,我要寻找的是类似下面的代码一样有效的东西:

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

但是显然,那是行不通的。

您有什么主意可以让我付诸实践吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

由于sysdate是一个易失函数(即其值随着时间的推移不是恒定的),因此您无法可靠地确定Oracle需要在哪个分区中查找。与其为此编写复杂的动态代码,不如您应该信任数据库以首先选择正确的分区。

我将对您的查询表达如下:

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

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

答案 1 :(得分:1)

使用远程比较:

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

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

相关问题