2008-09-17 18 views

Odpowiedz

20

To zależy od tego, co masz na myśli przez "dobry" i "zły". Zasadniczo musisz zdać sobie sprawę, że każdy dodany przez ciebie indeks zwiększy wydajność przy każdym wyszukiwaniu w tej kolumnie (więc dodanie indeksu do kolumny "nazwisko" tabeli osoby zwiększy wydajność zapytań, które zawierają "where lastname" w nich), ale zmniejszyć wydajność zapisu w całej tabeli.

Powodem tego jest, że dodajesz lub aktualizujesz wiersz, musisz dodać lub zaktualizować zarówno samą tabelę, jak i każdy indeks, którego jest członkiem. Jeśli więc masz pięć indeksów na stole, każde dodanie musi pisać w sześciu miejscach - pięciu indeksach i tabeli - a aktualizacja może dotykać do sześciu miejsc w najgorszym przypadku.

Tworzenie indeksu to czynność wyważająca między szybkością zapytania a szybkością zapisu. W niektórych przypadkach, takich jak datamart, który jest ładowany tylko raz na tydzień w nocnej pracy, ale przepytany tysiące razy dziennie, rozsądnie jest przeciążać się indeksami i przyspieszać zapytania tak bardzo, jak to tylko możliwe. Jednak w przypadku systemów przetwarzania transakcyjnego online należy spróbować znaleźć równowagę między nimi.

Krótko mówiąc, dodaj indeksy do kolumn, które są często używane w kwerendach wybranych, ale staraj się unikać dodawania zbyt wielu i dodaj najpierw najczęściej używane kolumny.

Po tym jest testowanie obciążenia, aby zobaczyć, jak wydajność reaguje w warunkach produkcyjnych, i wiele poprawek, aby znaleźć wyważony równowagi.

-2

Dobry indeks to coś, na czym można polegać, aby być unikalnym dla określonego wiersza tabeli.

Jednym z powszechnie używanych schematów indeksowych jest użycie liczb, które zwiększają się o 1 dla każdego wiersza w tabeli. Każdy wiersz będzie miał inny indeks liczb.

6

Pola, które są różnorodne, bardzo specyficzne lub niepowtarzalne, tworzą dobre indeksy. Takich jak daty i znaczniki czasu, unikalne numery zwiększające (powszechnie używane jako klucze podstawowe), nazwiska osób, numery tablic rejestracyjnych itp.

Przykład kontrprzykładu byłby płeć - istnieją tylko dwie wspólne wartości, więc indeks nie ma znaczenia. t naprawdę pomaga zmniejszyć liczbę wierszy, które muszą zostać przeskanowane.

Pełnookresowe opisowe ciągi o dowolnej formie generują słabe indeksy, ponieważ każdy, kto wykonuje zapytanie, rzadko zna dokładną wartość ciągu.

Dane uporządkowane liniowo (takie jak znaczniki czasu lub daty) są powszechnie używane jako indeks klastrowy, który wymusza przechowywanie wierszy w kolejności indeksowej i umożliwia dostęp w kolejności, co znacznie przyspiesza zapytania o zakres (np. wszystkie zamówienia sprzedaży od października do grudnia "). W takim przypadku silnik DB może po prostu przeszukać pierwszy rekord określony przez zakres i zacząć odczytywać sekwencyjnie, aż dotrze do ostatniego.

2

@ Niesławna krowa - musisz myśleć o podstawowych kluczach, a nie indeksach.

@Xenph Yan - Coś inni nie poruszył wybiera co rodzaj indeksu utworzyć. Niektóre bazy danych nie dają dużego wyboru, ale niektóre mają wiele różnych indeksów. Drzewa B to domyślnie , ale nie zawsze są najlepszym rodzajem indeksu. Wybór właściwej struktury zależy od rodzaju użytkowania, jakiego oczekujesz. Jakie pytania są najbardziej potrzebne do wsparcia? Czy jesteś w środowisku czytającym głównie lub piszesz? Czy twoje zapisy są zdominowane przez aktualizacje lub dodatki? Itp itd.

Opis różnych typów indeksów oraz ich plusy i minusy dostępny jest tutaj: http://20bits.com/2008/05/13/interview-questions-database-indexes/.

+0

Prosimy o skompilowanie informacji na ten temat i dodanie go do mojego połączonego wpisu dotyczącego indeksowania bazy danych. –

0

Kilka zasad, jeśli próbujesz poprawić konkretne zapytanie.

W przypadku konkretnej tabeli (w przypadku której należy rozpocząć Oracle) spróbuj indeksować każdą z kolumn użytych w klauzuli WHERE. Najpierw wstaw kolumny z równością, a następnie kolumny z zakresem lub podobne.

Na przykład:

WHERE CompanyCode = ? AND Amount BETWEEN 100 AND 200 

Jeśli kolumny są bardzo dużych rozmiarów (np jesteś przechowywania niektóre XML lub coś) może być lepiej pozostawiając je z indeksu. Spowoduje to, że indeks będzie mniejszy do skanowania, zakładając, że musisz mimo to przejść do wiersza tabeli, aby spełnić listę wyboru.

Alternatywnie, jeśli wszystkie wartości w klauzulach SELECT i WHERE znajdują się w indeksie Oracle nie będzie musiał uzyskiwać dostępu do wiersza tabeli. Czasem dobrze jest umieścić wybrane wartości na końcu w indeksie i unikać dostępu do wszystkich razem.

Możesz napisać książkę o najlepszych sposobach indeksowania - poszukaj autora Jonathana Lewisa.

Powiązane problemy