【发布时间】:2017-06-14 12:26:24
【问题描述】:
我有一个包含数百万条记录的事实表。该表在日期列上进行范围分区。
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;
对此的任何见解都会有所帮助。
【问题讨论】:
-
我不确定我是否可以在这个论坛中分享 DDL。我会看看我是否可以得到一个精简版并将相关部分发布在 DDL 上
-
这两个查询的执行计划最好进一步调查。
-
我检查了这两个查询的执行计划。具有硬编码日期的日期在过滤谓词中具有posting_date,partition_start 和partition_stop 具有特定的分区ID。但是有join操作的partition_start为1,partition_end为146(因为表有146个分区)
-
CREATE TABLE FACT_AUM ( SK_PRODUCT NUMBER, ACCOUNT_NUMBER VARCHAR2(30), CURRENCY_CODE VARCHAR2(5), TOTAL_SHARES NUMBER, NAV NUMBER, ..... .... ) -
PARTITION BY RANGE ("POSTING_DT") PARTITION "PART_JAN_2010" VALUES LESS THAN (TO_DATE(' 2010-02-01 21:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN') PARTITION "PART_FEB_2010" VALUES LESS THAN (TO_DATE(' 2010-03-01 21:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) PARTITION "PART_MAR_2010" VALUES LESS THAN (TO_DATE(' 2010-04-01 21:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN')) .... .... PARTITION "PART_DEC_2016" VALUES LESS THAN (TO_DATE(' 2017-01-01 21:00:00', 'SYYYY-MM-DD HH24:MI:SS', 'NLS_CALENDAR=GREGORIAN'))
标签: oracle