2011-09-02 11 views

Odpowiedz

8

Nie ma krótkiej odpowiedzi. To całkowicie zależy od twoich danych i tego, jak z niego korzystasz. Oto kilka rzeczy do rozważenia:

Jak wskazano w @ NullUserException, statystyki są gromadzone automatycznie, zwykle co noc. Zazwyczaj jest wystarczająco dobre; w większości środowisk (OLTP), jeśli właśnie dodałeś nowe obiekty, nie będą zawierały dużej ilości danych, zanim statystyki zostaną automatycznie zebrane. Plany nie będą takie złe, a jeśli obiekty są nowe, prawdopodobnie nie będą używane od razu.

  • tworzenia nowego wskaźnika - Nie "Oracle Database now automatically collects statistics during index creation and rebuild".
  • dodanie kolumny - może. Jeśli kolumna będzie używana w połączeniach i predykatach, prawdopodobnie będziesz potrzebował statystyk. Jeśli jest używany tylko do przechowywania i wyświetlania danych, nie wpłynie to na żadne plany. Ale jeśli nowa kolumna zajmuje dużo miejsca, może znacząco zmienić średnią długość wiersza, liczbę bloków, łańcuchy wierszy itp., A optymalizator powinien o tym wiedzieć.
  • Tworzenie nowego stołu - Prawdopodobnie. Oracle jest w stanie zrekompensować brakujące statystyki przez dynamic sampling, choć często nie jest to wystarczająco dobre. Zwłaszcza jeśli nowa tabela zawiera dużo danych; Złe statystyki prawie zawsze prowadzą do niedoceniania liczności, która doprowadzi do zagnieżdżonych pętli, gdy chcesz połączyć krzyżyki. Ponadto, nawet jeśli dane tabeli nie uległy zmianie, być może trzeba jeszcze raz zebrać statystyki, aby włączyć histogramy. Domyślnie Oracle tworzy histogramy dla przekrzywionych danych, ale nie włącza tych histogramów, jeśli te kolumny nie zostały użyte jako predykat. (To samo dotyczy dodawania nowej kolumny). Jeśli upuścisz i ponownie utworzysz tabelę, nawet o tej samej nazwie, Oracle nie będzie utrzymywał żadnych danych dotyczących użycia kolumny i nie będzie wiedział, że potrzebujesz pewnych histogramów w niektórych kolumnach.

Zbieranie statystyk optymalizatora jest o wiele trudniejsze niż większość ludzi zdaje sobie z tego sprawę. W mojej obecnej pracy większość naszych problemów z wydajnością wynika właśnie z nieprawidłowych statystyk. Jeśli próbujesz wymyślić plan dla swojego systemu, powinieneś przeczytać Managing Optimizer Statistics chapter.


Aktualizacja:

Nie ma potrzeby, aby zebrać statystyki dla pustych obiektów; dynamiczne próbkowanie działa tak samo szybko, jak czytanie statystyk ze słownika danych. (Oparte na szybkim teście twardym analizowaniu dużej liczby zapytań z i bez statystyk.) Jeśli wyłączysz próbkowanie dynamiczne, być może istnieją dziwne przypadki, w których wartości domyślne Oracle prowadzą do niedokładnych planów, a Ty korzystasz ze statystyk pusty stolik.

Myślę, że powodem, dla którego Oracle automatycznie gromadzi statystyki dla indeksów w czasie tworzenia, jest to, że nie kosztuje dużo więcej. Podczas tworzenia indeksu należy przeczytać wszystkie bloki w tabeli, aby Oracle mógł równie dobrze obliczyć liczbę poziomów, bloków, kluczy itd. W tym samym czasie.

Statystyki tabeli mogą być bardziej skomplikowane i mogą wymagać wielu przekazów danych. Tworzenie indeksu jest stosunkowo proste w porównaniu do arbitralnego kodu SQL, który może być używany jako część create-table-as-select. Może nie być możliwe lub wydajne, aby wziąć te arbitralne instrukcje SQL i przekształcić je w kwerendę, która również zwraca informacje potrzebne do zbierania statystyk.

Oczywiście zbieranie statystyk dla pustego stołu nie będzie kosztować nic więcej. Ale to też niczego nie zyskuje, a byłoby to mylące dla każdego, kto patrzy na USER_TABLES.LAST_ANALYZED - tabela wydaje się być analizowana, ale nie ma żadnych sensownych danych.

+0

Kiedy mówię o nowych kolumnach i tabelach, mówię o * pustych * obiektach. To dziwne, że Oracle nie gromadzi statystyk automatycznie przy tworzeniu dla nich. Dlaczego robi to dla nowych indeksów? –

Powiązane problemy