Oracle Partition修剪没有发生

时间:2017-01-29 03:44:36

标签: oracle

我有一张包含数百万条记录的事实表。该表在日期列上进行了范围分区。

FACT_AUM (ACCOUNT_ID VARCHAR2(30),MARKET_VALUE NUMBER(20,6), POSTING_DATE DATE);

我有另一个临时表

ACCOUNT_TMP (ACCOUNT_ID VARCHAR2(30), POSTING_DATE DATE);

当我通过硬编码日期运行此查询时,我发现分区修剪发生并且结果快速返回

SELECT A.ACCOUNT_ID, SUM(A.MARKET_VALUE) FROM 
FACT_AUM A JOIN ACCOUNT_TMP B ON A.ACCOUNT_ID = B.ACCOUNT_ID 
AND A.POSTING_DATE=TO_DATE('30-DEC-2016',DD-MON-YYYY') GROUP BY 
A.ACCOUNT_ID;

当我运行以下内容时,我看不到分区修剪,并且查询一直在旋转

SELECT A.ACCOUNT_ID, SUM(A.MARKET_VALUE) FROM 
FACT_AUM A JOIN ACCOUNT_TMP B ON A.ACCOUNT_ID = B.ACCOUNT_ID 
AND A.POSTING_DATE = B.POSTING_DATE GROUP BY 
A.ACCOUNT_ID;

对此有任何见解都会有所帮助。

1 个答案:

答案 0 :(得分:0)

Oracle在您对该值进行硬编码时使用了分区修剪,因为Oracle认为在那里进行分区修剪会带来好处。

当您使用临时(我将其重新登录到临时表)加入事实表时,Oracle无法猜测为计算答案而必须尝试的所有分区。请注意,Oracle将评估登台表中可用的值范围。

但除非你提供所涉及的表的统计数据,否则我无法详细讨论表排序和表连接的更重要的主题。要快速修复,请使用Order提示或嵌套循环提示。