2009-09-23 8 views
9

Jaka jest różnica między predykatami dostępu i filtru w planie wykonawczym Oracle? Jeśli dobrze rozumiem, "dostęp" jest używany do określenia, które bloki danych należy odczytać, a "filtr" jest stosowany po odczytaniu bloków. Dlatego filtrowanie jest "złe".Predykaty dostępu i filtrów w planie wykonywania Oracle

W przykładzie z sekcji Predicate Informacyjnym planu wykonania poniżej:

10 - access("DOMAIN_CODE"='BLCOLLSTS' AND "CURRENT_VERSION_IND"='Y') 
    filter("CURRENT_VERSION_IND"='Y') 

dlaczego „CURRENT_VERSION_IND” powtarza się w obu sekcjach dostępu i filtr?

Odpowiednią operacją jest indeks skanowania INDEX RANGE, który jest zdefiniowany w polach (DOMAIN_CODE, CODE_VALUE, CURRENT_VERSION_IND, DECODE_DISPLAY).

Domyślam się, że ponieważ CURRENT_VERSION_IND nie jest drugą kolumną w indeksie, Oracle nie może jej użyć podczas etapu Access. W związku z tym uzyskuje dostęp do indeksu według kolumny DOMAIN_CODE, pobiera wszystkie bloki, a następnie filtruje je według CURRENT_VERSION_IND. Czy mam rację?

Odpowiedz

6

Nie, predykaty dostępu w tym przykładzie wskazują, że indeks jest wykonywany zarówno przez DOMAIN_CODE jak i CURRENT_VERSION_IND.

Nie martwiłbym się o predykat filtra, który wydaje się zbędny - wydaje się być dziwactwem planu wyjaśniającego, prawdopodobnie ma to związek z faktem, że musi wykonać pewien rodzaj pomijania w indeksie (wykonuje skanowanie zakresu w pierwszej kolumnie, a następnie przeskakuje nad CODE_VALUE, wyszukując pasujące do siebie CURRENT_VERSION_IND s).

Niezależnie od tego, czy trzeba zmodyfikować indeks, czy utworzyć inny indeks, to zupełnie inna sprawa.

Ponadto, aby skorygować drobne nieporozumienie: bloki muszą zostać pobrane z indeksu PRZED to może zrobić wszystko, wykonując kroki "dostęp" lub "filtr". Jeśli odnosisz się do pobierania bloków z tabeli, wtedy również odpowiedź brzmi "nie" - powiedziałeś, że predykat filtra "10" był na dostępie do indeksu, a nie do dostępu do tabeli; i tak czy inaczej, nie ma powodu, dla którego Oracle nie może przetestować filtru na indeksie CURRENT_VERSION_IND - nie musi on w ogóle uzyskać dostępu do tabeli, chyba że potrzebuje innych kolumn nieuwzględnionych w indeksie.

+0

Jeśli indeks jest zdefiniowany w 1., 2. i 3. kolumnie w tabeli, czy Oracle 10 będzie mógł korzystać z indeksu, jeśli predykaty w klauzuli WHERE znajdują się w 1. i 3. kolumnie? Na 2 i 3? Myślałem, że odpowiedź brzmi "nie". Poza tym, jaka jest faktycznie różnica między predykatami dostępu i filtru? –

+2

Począwszy od wersji 9i (od momentu wprowadzenia metody dostępu do indeksu pomijania skanu) Oracle może używać indeksu bez względu na to, czy uzyskujesz dostęp do cols 1, 2, 3 lub dowolnej ich kombinacji. –

+1

Predykaty "Dostęp" to te, które są używane do zeskanowania indeksu - te predykaty są używane do wybrania bloków gałęzi i liścia do pobrania z indeksu i są ważniejsze dla wydajności zapytania. Predykaty "Filtruj" to te, które są stosowane do wierszy zwróconych z indeksu; określają, które wiersze są ostatecznie wysyłane do następnego kroku w planie wykonania kwerendy. Zobacz dokumentację ACCESS_PREDICATES i FILTER_PREDICATES tabeli planu: http://download.oracle.com/docs/cd/E11882_01/server.112/e10821/ex_plan.htm#PFGRF94708 –

2

Uważam, że masz rację w swojej ocenie tego, co robi Oracle, ale nie można powiedzieć, że krok filtra (lub jakikolwiek inny wybór optymalizatora) jest zawsze "zły". Nie ma sensu indeksować absolutnie każdej możliwej kombinacji kolumn, o które można pytać, dlatego często wymagane jest filtrowanie.

Jednakże, jeśli w tym przypadku dodanie CURRENT_VERSION_IND w drugiej kolumnie indeksu poprawia wydajność znacząco na często uruchamiania kwerend i nie szkodzi wydajności innych zapytań, to może mieć sens, aby to zrobić.

Powiązane problemy