У меня есть две идентичные таблицы, и я хочу выполнить полное внешнее соединение между ними для одного конкретного значения (столбец разделения).План выполнения показывает PARTITION RANGE ALL
вместо PARTITION RANGE SINGLE
.Я ожидал, что предикат фильтра будет применен с идентификаторами 4 и 5 перед объединением.Это как-то не поддерживается или я делаю это неправильно?
select *
from t1 full join t2 using(d)
where d = date '2018-01-03';
-----------------------------------------------------------
| Id | Operation | Name | Pstart| Pstop |
-----------------------------------------------------------
| 0 | SELECT STATEMENT | | | |
| 1 | PARTITION RANGE ALL | | 1 | 3 |
|* 2 | VIEW | VW_FOJ_0 | | |
|* 3 | HASH JOIN FULL OUTER| | | |
| 4 | TABLE ACCESS FULL | T1 | 1 | 3 |
| 5 | TABLE ACCESS FULL | T2 | 1 | 3 |
-----------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - filter("D"=TO_DATE(' 2018-01-03 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
3 - access("T1"."D"="T2"."D")
Я могу получить то, что хочу, вручную нажимая предикаты, например так:
select *
from (select * from t1 where d = date '2018-01-03')
full join (select * from t2 where d = date '2018-01-03') using(d);
-------------------------------------------------------------
| Id | Operation | Name | Pstart| Pstop |
-------------------------------------------------------------
| 0 | SELECT STATEMENT | | | |
| 1 | VIEW | VW_FOJ_0 | | |
|* 2 | HASH JOIN FULL OUTER | | | |
| 3 | PARTITION RANGE SINGLE| | 3 | 3 |
| 4 | VIEW | | | |
|* 5 | TABLE ACCESS FULL | T1 | 3 | 3 |
| 6 | PARTITION RANGE SINGLE| | 3 | 3 |
| 7 | VIEW | | | |
|* 8 | TABLE ACCESS FULL | T2 | 3 | 3 |
-------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("from$_subquery$_001"."D"="from$_subquery$_003"."D")
5 - filter("D"=TO_DATE(' 2018-01-03 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
8 - filter("D"=TO_DATE(' 2018-01-03 00:00:00', 'syyyy-mm-dd hh24:mi:ss'))
Тестовый пример для создания этих таблиц
create table t1(
d date not null
,n number not null
)
partition by range(d)(
partition jan1 values less than(date '2018-01-02')
,partition jan2 values less than(date '2018-01-03')
,partition jan3 values less than(date '2018-01-04')
);
create table t2(
d date not null
,n number not null
)
partition by range(d)(
partition jan1 values less than(date '2018-01-02')
,partition jan2 values less than(date '2018-01-03')
,partition jan3 values less than(date '2018-01-04')
);
insert into t1(d,n) values(date '2018-01-01', 1);
insert into t1(d,n) values(date '2018-01-02', 2);
insert into t2(d,n) values(date '2018-01-02', 2);
insert into t2(d,n) values(date '2018-01-03', 3);
commit;
Яс использованием Oracle Database 12c Enterprise Edition, выпуск 12.1.0.2.0 - 64-разрядная версия