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ę?
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? –
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. –
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 –