Обрезка перегородок с полными внешними соединениями - PullRequest
0 голосов
/ 16 мая 2018

У меня есть две идентичные таблицы, и я хочу выполнить полное внешнее соединение между ними для одного конкретного значения (столбец разделения).План выполнения показывает 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-разрядная версия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...