Wyłączanie użycia ścieżki bezpośredniej przy pełnym odczycie tabeli (Oracle Database 11g)

Jednym z ciekawszych mechanizmów prowadzenia dyskowego wejścia/wyjścia w Oracle Database 11g jest realizacja pełnego odczytu tabeli (full table scan) metodą ścieżki bezpośredniej (direct path). Idea ścieżki bezpośredniej polega na pomijaniu bufora Buffer Cache i odczytywaniu bloków tabeli z dysku bezpośrednio do PGA. Dzięki temu możliwa jest poprawa wydajności operacji pełnego odczytu tabeli (brak narzutów związanych z zarządzaniem Buffer Cache). Czy programista/administrator ma możliwość decydowania, które operacje pełnego odczytu tabeli mają korzystać ze ścieżki bezpośredniej (np. na potrzeby testowania)? W zasadzie nie… W oparciu o rozmiar tabeli serwer sam decyduje, czy użyć ścieżki bezpośredniej (_small_table_threshold). Istnieje jednak niejawna metoda wyłączenia tej funkcjonalności: zdarzenie 10949.

Poniższy przykład ilustruje działanie mechanizmu ścieżki bezpośredniej w Oracle Database 11g. W celu oceny, którą metodę odczytu danych wykorzystał serwer, należy porównać statystykę skumulowaną „physical read direct” przed i po wykonaniu zapytania dokonującego pełnego odczytu tabeli (zmiana->ścieżka bezpośrednia, brak zmiany->odczyt przez Buffer Cache). Tabela „DUŻA” liczyła około 9000 bloków.

SQL> select name, value from v$mystat natural join v$statname
where name in ('physical reads direct', 'physical reads');
NAME                                                             VALUE
---------------------------------------------------------------- ----------
physical reads                                                   36386
physical reads direct                                            18784

SQL> select count(*) from duza;
...
SQL> select name, value from v$mystat natural join v$statname
where name in ('physical reads direct', 'physical reads');
NAME                                                             VALUE
---------------------------------------------------------------- ----------
physical reads                                                   45751
physical reads direct                                            28149

SQL> alter session set events '10949 trace name context forever, level 1';
SQL> select count(*) from duza;
...
SQL> select name, value from v$mystat natural join v$statname
where name in ('physical reads direct', 'physical reads');
NAME                                                             VALUE
---------------------------------------------------------------- ----------
physical reads                                                   55034
physical reads direct                                            28149

 

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *