使用绑定变量进行Oracle分区修剪

cag*_*boy 4 sql oracle performance partitioning

我有一个大的(150米+行)表,使用DATE分区键分区为四分之一.

当我使用类似的东西查询表格时...

SELECT *
FROM   LARGE_TABLE
WHERE  THE_PARTITION_DATE >= TO_DATE('1/1/2009', 'DD/MM/YYYY')
AND    THE_PARTITION_DATE < TO_DATE('1/4/2009', 'DD/MM/YYYY');
Run Code Online (Sandbox Code Playgroud)

...分区修剪工作正常...... optomiser能够意识到它只需要查看单个分区(在本例中为Q1 2009).EXPLAIN PLAN显示"PARTITION RANGE SINGLE"

但是,当我将此查询移动到PL/SQL并传入与变量相同的日期时,该计划显示为"PARTITION RANGE(ITERATOR)"... <optomiser>无法理解它只需要查看单个partiiton(可能是因为它在评估计划时没有实际值).

到目前为止,我发现的唯一解决方法是编写一个EXECUTE IMMEDIATE,包括SQL字符串中的日期,以便分区修剪正常工作.

有没有更好的办法?

dpb*_*ley 7

我认为您不应该看到绑定变量的实际性能差异 - 您应该看到"PARTITION RANGE ITERATOR PARTITION:KEY KEY ..."的执行计划步骤,这意味着Oracle将在执行时确定启动和停止分区.