Есть рабочая база (проектировал не я, что имеем, то имеем), которая впрочем дорабатывается и оптимизируется (чем я пытаюсь заняться время от времени).
Запросы соответственно обращаются ко вьюшкам,
Проблема в том, что в базе на некоторые таблицы присутствуют составные ключи
обнаружил недавно большое количество молотилок, я поясню,
+ |
create table f0(id number, f1_id1 number, f1_id2 number, f2_id number);
alter table f0 add constraint f0_pk primary key (ID);
insert into f0(id,f1_id1,f1_id2,f2_id)
select 1,10,10,null from dual union all
select 2,null,null,100 from dual union all
select 3,30,30,200 from dual;
create table f1(id1 number, id2 number);
alter table F1 add constraint f1_pk primary key (ID1, ID2);
insert into f1
values(10,10);
insert into f1
values(30,30);
create table f2(id number);
alter table f2 add constraint f2_pk primary key (ID);
insert into f2
values(100);
insert into f2
values(200);
alter table f0 add constraint f0_fk1 foreign key (f1_id1, f1_id2) references f1 (ID1, ID2);
alter table f0 add constraint f0_fk2 foreign key (f2_id) references f2 (ID);
|
Oracle 11
select f0.id from f0, f1, f2
where f0.f2_id = f2.id(+)
and f0.f1_id1 = f1.id1(+)
and f0.f1_id2 = f1.id2(+)
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 195 | 3 (0)| 00:00:01 |
| 1 | NESTED LOOPS OUTER| | 3 | 195 | 3 (0)| 00:00:01 |
| 2 | TABLE ACCESS FULL| F0 | 3 | 117 | 3 (0)| 00:00:01 |
|* 3 | INDEX UNIQUE SCAN| F1_PK | 1 | 26 | 0 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("F0"."F1_ID1"="F1"."ID1"(+) AND
"F0"."F1_ID2"="F1"."ID2"(+))
Видим, F2 в плане нету, а F1 он молотит в холостую зачем-то (потому что PK составной), таких вещей во вьюшках понаписано довольно много.
Вещи очевидные, но oracle их до настоящего момента не поддерживает?
Или с этим можно как-нибудь побороться?
P.S. что-то нагуглить не получилось :(