在Oracle中针对非连续分区范围触发分区修剪的最佳方法

时间:2015-06-05 22:31:03

标签: sql oracle partitioning

我有一些按日划分的大型Oracle表格;删除超过1年的数据,以使每个分区保持最大大小。我们在时间范围上运行了许多不同的查询,这些查询连接在一起。我们必须处理时间范围越过年终边界的情况,导致一年的开始日期大于一年的结束日。

我们尝试了什么:

WHERE table1.doy IN (SELECT column_value FROM TABLE(doy_tbl)) AND
      table1.time BETWEEN time1 AND time2 AND
      table2.doy = table1.doy

其中doy_tbl是我们刚刚创建的具有doy所有可能值的数组(例如365,366,1,2)。

这似乎应该触发分区修剪,但不是。根据执行计划,即使使用了PUSH_SUBQ提示,在完成所有其他连接之后,它最终会根据此IN进行过滤。由于剩余的条件,table被修剪,但table1永远不会。

另一种尝试是这样的:

WHERE (table1.doy BETWEEN doy_min AND doy_max OR
       (doy_min > doy_max AND table1.doy NOT BETWEEN doy_max AND doy_min))

这似乎有点工作(table1在它的执行计划中说了KEY(OR))但是连接中的一些表没有被修剪。有没有办法重新构建它,以便它可以工作,除了将它包装在IF中并将其拆分为2个查询并膨胀所有存储过程?

另一种方法是,当越过年边界时,做2个查询,一个来自365-366,一个来自1-2,然后只是使用:

WHERE table1.doy BETWEEN doy_min AND doy_max

这很有用(所有表都是使用KEY(AP)访问的)但是再一次这会使代码膨胀。在我们有100个这样的存储过程的情况下,它不是很理想。

我有没有办法让前2种方法有效?或者其他一些优雅的方法来处理我不知道的情况?

0 个答案:

没有答案