Gdy brakuje (niektórych) statystyk dla optymalizatora

W jaki sposób kosztowy optymalizator zapytań estymuje koszt planu wykonania zapytania jeśli administrator/programista nie zadbał o zgromadzenie statystyk dla optymalizatora? Wcześniejsze wersje serwerów Oracle Database przełączały się wtedy w tryb optymalizacji regułowej. Serwer Oracle Database 11g skorzysta w tej sytuacji z tzw. dynamicznego próbkowania (dynamic sampling), polegającego na pobraniu losowej próbki bloków tabel uczestniczących w zapytaniu (i wykorzystaniu tych bloków do obliczeń selektywności). Ogólnie rzecz biorąc, dynamiczne próbkowanie pogarsza efektywność pracy optymalizatora zapytań, ponieważ powoduje dodatkowe operacje dyskowe w fazie Parse. Istnieją jednak sytuacje, w których chętnie wymusimy użycie dynamicznego próbkowania nawet wtedy, gdy statystyki posiadamy.

Dynamiczne próbkowanie może być zbawienne gdy borykamy się z problemami niewłaściwie wyznaczanej selektywności funkcji i wyrażeń lub selektywności wielu skorelowanych predykatów połączonych operatorami OR/AND. W jaki sposób skorzystać z dynamicznego próbkowania? Posłużyć się parametrem serwera/sesji OPTIMIZER_DYNAMIC_SAMPLING (lub hintem DYNAMIC_SAMPLING). Parametr ten przyjmuje wartości 0-10, gdzie np. 0 oznacza wyłączenie dynamicznego próbkowania, 2 (domyślnie) oznacza włączenie dynamicznego próbkowania gdy co najmniej jedna tabela w zapytaniu nie posiada statystyk, 3 oznacza włączenie dynamicznego próbkowania gdy w klauzuli WHERE występują funkcje/wyrażenia oparte na kolumnach, 4 oznacza włączenie dynamicznego próbkowania gdy w klauzuli WHERE występują predykaty połączone AND/OR.

Dodaj komentarz

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