niedziela, 4 grudnia 2011

Metody dostępu do danych - dostęp do tabeli

Oracle w celu pobrania danych może zastosować różne metody. Może wykorzystywać przeszukiwanie tabel w całości, lub korzystać z indeksów w celu odnalezienia danych w tabelach. Poniżej zamieszczam listing różnych metod dostępu dostępnych dla tabel i dla indeksów.




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.


Sample Table Scan





Ten rodzaj dostępu do tabeli wykorzystywany jest do pobierania próbek danych. Zwraca losowe wiersze z tabeli.

1 komentarz:

  1. 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:
    - 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.

    OdpowiedzUsuń