Tabele | Full Table Scan Rowid Scan Sample Table Scan |
Indeksy | Unique Scan Range Scan Full Scan Fast Full Scan Skip Scan Index Join |
Dane mogą zostać pobrane przy użyciu wymienionych wyżej metod, w zależności oczywiście od tego jakie możliwości mu damy (przypominamy sobie historię z trasą z Gdyni do Krakowa). W pierwszej kolejności omówię każdą z tych metod dostępu do danych. W żadnym wypadku nie pomijaj tego rozdziału! Znajomość tych metod i ich dobre zrozumienie jest bardzo ważne!
Full Table Scan
To przeglądanie całej tabeli wiersz po wierszu w celu znalezienia informacji które nas interesują. Tego typu przeglądanie tabeli jest naprawdę mało wydajne. Wyobraź sobie że szukasz jednego wiersza. Pracownika o numerze 100, który znajduje się „gdzieś” w tabeli zawierającej ogólne milion wierszy. Aby go znaleźć tą metodą musisz przejrzeć całe te milion wierszy jeden po drugim aż nie znajdziesz właściwego. Czy to nie jest marnotrawstwo czasu i zasobów? Optymalizator kosztowy wybiera tą metodę dostępu do danych kiedy nie ma indeksów z których mógłby skorzystać, kiedy żądamy od bazy całej zawartości tabeli , lub gdy zapytanie jest skonstruowane tak że uniemożliwia skorzystanie z indeksu (na razie tym się nie przejmuj, wyjaśni się nieco później).
Rowid Scan
Przede wszystkim muszę Ci przybliżyć pojęcie rowid. Każdy wiersz w tabeli zawiera rowid, który reprezentuje fizyczną lokalizację danego wiersza na dysku. Możesz wyświetlić te wartości:
Jeśli taki adres jest znany, Oracle może pominąć przeszukiwanie tabeli wiersz po wierszu i od razu dostać się do poszukiwanego wiersza korzystając z ROWID:
Oczywiście rzadko kiedy stosuje się takie wyszukiwanie jak na powyższym obrazku. Taki adres (rowid) pobierany jest z indeksu najczęściej z indeksu i dopiero w kolejnym etapie następuje dostęp do tabeli z wykorzystaniem rowid.
Ten rodzaj dostępu do tabeli wykorzystywany jest do pobierania próbek danych. Zwraca losowe wiersze z tabeli.
Wszystko zależy od tego co chcesz zrobić. Jeśli szukasz konkretnego wiersza w tabeli to wiadomka - index. Ale jeśli Twoje zapytanie potrzebuje do wykręcenia się połowy danych z jakiejś dużej tabeli, to dostać się do nich najlepiej jest za pomocą FTS'a. Dlaczego:
OdpowiedzUsuń- czytanie indexu a potem wiersza w tabeli to dwie operacje IO,
- oracle nie czyta pojedynczych wierszy, czyta całe bloki, tak więc dostając się do 100 wierszy znalezionych za pomocą indeksu może się okazać, że przeczytał 100 bloków,
- przy FTS'ie czyatny jest blok + kilka/kilkadziesiąt/kilkaset bloków następnych (ile dokładnie? - SHOW PARAMETER db_file_multiblock_read_count;) - drastycznie zmniejsza to ilość operacji dyskowych.
Poza tym jak masz odpowiednio duży DB_BLOCK_SIZE, oraz kilka/naście wolnych rdzeni to wierz mi że FTS w PARALLEL'u zabiera, zaprawdę, mało czasu.