11

mam takiej sytuacji:Czy ograniczenia klucza obcego wpływają na przekształcanie zapytań w Oracle?

create table a(
    a_id number(38) not null, 
    constraint pk_a primary key (id) 
); 

create table b(
    a_id number(38) not null 
); 

create index b_a_id_index on b(a_id); 

Teraz b.a_id jest w rzeczywistości ma być klucz obcy odwołujący a.a_id, ale to nie jest oficjalnie uznany jako taki. Oczywiście, powinno to być ze względu na uczciwość. Ale czy ograniczenie klucza obcego również poprawia wydajność łączenia w ogóle lub w konkretnych przypadkach? Jeśli tak, dla jakich typów przekształceń zapytania?

Czy istnieje odpowiednia dokumentacja dotycząca tego tematu?

Używam Oracle 11g (11.2.0.2.0)

Odpowiedz

13

Tak, mający ograniczeń klucza obcego w miejscu może poprawić wydajność kwerendy. Istnieją różne przekształcenia, które są otwarte dla optymalizatora, gdy istnieją odpowiednie ograniczenia klucza obcego, które nie są ogólnie dostępne. Na przykład, jeśli chcesz dołączyć do A i B, ale wybierzesz tylko dane z B, optymalizator może całkowicie wyeliminować A z planu kwerend, jeśli istniało ograniczenie klucza obcego (ten rodzaj rzeczy jest bardzo przydatny, gdy masz uzyskały przydatne widoki, które łączą się w więcej tabel niż obecne zapytanie, ponieważ nie trzeba wymieniać kosztów wydajności dodatkowych połączeń z ponownym użyciem kodu z istniejącego widoku). Przydają się również, gdy robisz takie rzeczy, jak używanie przepisywania zapytania w celu przepisywania zapytania w celu wykorzystania zmaterializowanego widoku w systemie typu data storage/DSS.

Tom Kyte ma prezentację Metadata Matters, która mówi o tym, jak różne rodzaje ograniczeń, wraz z innymi fragmentami metadanych, mogą wpływać na optymalizator.

+0

Byłem pewien, że przeczytałem coś takiego wcześniej. W każdym razie wydaje się to oczywiste. Dzięki za wspaniałą odpowiedź i link! –

+1

Zepsuty link, domyślam się, że ta prezentacja: http://docslide.us/documents/metadata-matters-by-tom-kyte-oracle.html – gaps96

1

Jak już wskazano, Justin, eliminacja JOIN jest niezbędną transformacją SQL opartą na niedrogowych metodach, która może być stosowana wyłącznie w oparciu o obecność metadanych. Mam blogu o tym niedawno:

Jak pierwotnie zakładano, istnieje wiele przemian SQL, które są uzależnione od danych meta, więc dodawanie kluczy obcych (i inne ograniczenia) zdecydowanie może wpływać na wydajność w pozytywny sposób.

Powiązane problemy