2013-07-16 14 views
8

Jestem bardzo nowy, aby indeksować i wyjaśniać plany, więc proszę o zachowanie mnie! Próbuję dostroić zapytanie, ale mam problemy.Oracle nie używa indeksu przy dołączaniu

Mam dwie tabele:

SKU 
------ 
SKUIDX (Unique index) 
CLRIDX (Index) 
.. 
.. 

IMPCOST_CLR 
----------- 
ICCIDX (Unique index) 
CLRIDX (Index) 
... 
.. 

Kiedy robię select * from SKU where clridx = 122, widzę, że jest to za pomocą indeksu w planie wyjaśnienia (mówi TABELA DOSTĘP .. INDEX, mówi nazwa indeksu pod OBJECT_NAME i opcje to RANGE SCAN).

Teraz, gdy próbuję dołączyć do tego samego pola, wydaje się, że nie korzysta z indeksu (mówi TABLE ACCESS .. HASH JOIN i pod opcjami, mówi FULL).

Czego powinienem szukać, aby sprawdzić, dlaczego nie korzysta z indeksu? Niestety, nie jestem pewien, jakie polecenia wpisać, więc proszę dać mi znać, jeśli potrzebujesz więcej informacji.

Przykłady:
1-ty zapytania:

SELECT 
    * 
    FROM 
    AP21.SKU 
    WHERE 
    CLRIDX = 100 

enter image description here

2-ty zapytania:

SELECT 
    * 
    FROM 
    AP21.IMPCOST_CLR 
    WHERE 
    CLRIDX = 100 

enter image description here

3-ty zapytania:

SELECT 
    * 
    FROM 
    AP21.SKU 
    INNER JOIN 
    AP21.IMPCOST_CLR ON 
    IMPCOST_CLR.CLRIDX = SKU.CLRIDX 

enter image description here

+0

Co to jest kwerenda użyć podczas łączenia? – APC

+0

Hi- zobacz moją edycję. Zapytanie, które próbuję dostroić, jest setki o wiele dłuższe, ale rozbicie go i zrobienie tego krok po kroku! – Lock

+0

Jak rozwiązałeś swój pełny problem ze skanowaniem? – Salman

Odpowiedz

17

Spójrz na tego zapytania:

SELECT 
    * 
FROM 
    AP21.SKU 
INNER JOIN 
    AP21.IMPCOST_CLR ON 
    IMPCOST_CLR.CLRIDX = SKU.CLRIDX 

Nie ma żadnych dodatkowych predykatów. Dlatego dołączasz wszystkie wiersze w SKU do wszystkich wierszy w IMPCOST_CLR. Ponadto wybierasz wszystkie kolumny z obu tabel.

Oznacza to, że Oracle musi przeczytać całość obu tabel. Najskuteczniejszym sposobem na to jest użycie pełnego skanowania tabeli, aby zgarnąć wszystkie wiersze w wieloblokowych odczytach i użyć skrótu do dopasowania wartości łączenia.

Zasadniczo jest to operacja ustawiona, co jest tym, co SQL robi bardzo dobrze, podczas gdy indeksowane odczyty mają wartość większą niż RBAR. Teraz, jeśli zmienione trzecią zapytanie do włączenia dodatkowej orzecznik, takich jak

WHERE SKU.CLRIDX = 100 

ty najprawdopodobniej zobaczyć ścieżkę dostępu przywrócić INDEX zakres skanowania. Ponieważ wybierasz tylko porównywalną garść wierszy, więc indeksowany odczyt jest jeszcze bardziej wydajną ścieżką.


„Zapytanie im próbuje dostroić się setki znacznie dłużej, ale łamanie go i biorąc to krok po kroku!”

Jest to dobra metoda, ale trzeba zrozumieć, jak działa optymalizator Oracle. W Planie wyjaśnień jest mnóstwo informacji.Find out more. Należy zwrócić uwagę na wartość w kolumnie Rows dla każdego kroku. Oznacza to, ile wierszy Optymalizator spodziewa się uzyskać z operacji. Zobaczysz bardzo różne wartości dla dwóch pierwszych zapytań w porównaniu do trzeciego.

+0

Czy istnieje sposób na uniknięcie pełnego skanowania w tym przypadku? – Salman

+0

@alman - w tym przypadku pełne skanowanie tabeli jest najskuteczniejszym sposobem uzyskania dostępu do danych. Dlaczego więc chcesz tego uniknąć? – APC

Powiązane problemy