Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle中为非连续分区范围触发分区修剪的最佳方法_Sql_Oracle_Partitioning - Fatal编程技术网

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

Sql 在Oracle中为非连续分区范围触发分区修剪的最佳方法,sql,oracle,partitioning,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 = table

我有许多按日期划分的大型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\u SUBQ
提示,它最终也会基于此进行过滤<代码>表由于其余条件而被删减,但
表1
从未被删减

另一次尝试是这样的:

WHERE (table1.doy BETWEEN doy_min AND doy_max OR
       (doy_min > doy_max AND table1.doy NOT BETWEEN doy_max AND doy_min))
这似乎是一种工作(表1在它的exec计划中说了KEY(OR)),但连接中的一些表没有被删减。除了将其包装在IF中并将其拆分为两个查询并使所有存储过程膨胀之外,是否有其他方法可以对其进行重新构造以使其工作

另一种方法是,当跨越年份边界时,执行两个查询,一个来自365-366,一个来自1-2,然后仅使用:

WHERE table1.doy BETWEEN doy_min AND doy_max
这是可行的(所有表都是通过键(AP)访问的),但这又一次使代码膨胀。在我们有100个这样的存储过程的情况下,这不是很理想


有没有什么方法可以让前两种方法发挥作用?或者其他一些我不知道的处理这种情况的优雅方法?

表是否仅在
doy
上分区,一个介于1和366之间的数字列?您选择这样做而不是在实际的
date
列上进行分区有什么原因吗?Oracle对数组的基数估计是多少(我猜它实际上是一个嵌套表或关联数组,而不是varray)?您是否尝试过向针对集合的查询添加基数提示?当您将“SELECT column_value FROM TABLE(doy_tbl)”替换为“365、366、1、2”时会发生什么情况?只是为了看看这是否有效。如果是这样,我们或许可以进一步探索这条途径。