我在Oracle中有一个DATETIME
列的每月分区表。该表包含> 60亿行。现在,我想使用sysdate
过滤此表。因此,我可以使用相对日期来编写查询,例如昨天,上个工作日,去年等。
所以,我要寻找的是类似下面的代码一样有效的东西:
SELECT *
FROM BIG_PART_TABLE PARTITION FOR (DATE **TODAY**)
WHERE TRUNC(DATETIMECOLUMN) = TRUNC(SYSDATE)
但是显然,那是行不通的。
您有什么主意可以让我付诸实践吗?
谢谢!
答案 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)
这是一种在搜索索引日期值时很有用的模式。