我有一张包含数百万条记录的事实表。该表在日期列上进行了范围分区。
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;
对此有任何见解都会有所帮助。
答案 0 :(得分:0)
Oracle在您对该值进行硬编码时使用了分区修剪,因为Oracle认为在那里进行分区修剪会带来好处。
当您使用临时(我将其重新登录到临时表)加入事实表时,Oracle无法猜测为计算答案而必须尝试的所有分区。请注意,Oracle将评估登台表中可用的值范围。
但除非你提供所涉及的表的统计数据,否则我无法详细讨论表排序和表连接的更重要的主题。要快速修复,请使用Order提示或嵌套循环提示。