Po przeczytaniu pytań i odpowiedzi z tej witryny na temat indeksów przyszło mi do głowy pytanie.
Co, jeśli używa się tabeli wymiarów czasowych, przy czym niższy poziom szczegółowości to dzień. Gdzie należy umieścić indeksy?
Randy Melder w pytaniu: Co oznacza „indeks” w RDBMS? powiedział:
Traktuj indeks jako „spis treści” ... czyli uporządkowaną listę wskaźników do pozycji w pliku, czyli przesunięć
W przypadku wymiaru czasu większość badań danych może być przeprowadzona dla określonego dnia, określonego tygodnia, określonego miesiąca lub określonego kwartału, jeśli tabela czasu przechowuje cały dzień dla unikalnego roku .
Moje pytanie brzmi: czy należy umieścić indeksy dla wszystkich tych pól?
Dzień ma być wyjątkowy, dlatego doskonale rozumiem użycie indeksów. Ale identyfikator tygodnia będzie miał 7 wystąpień , identyfikator miesiąca będzie miał 30/31 wystąpień , identyfikator kwartalny będzie miał mniej więcej 120 wystąpień .
- Czy należy nadal umieszczać indeksy dla tych pól?
- Czy nadal będzie przydatny?
Proszę o to, ponieważ w tym samym pytaniu David Spillett powiedział:
Dodanie zbyt wielu indeksów może być złą optymalizacją, ponieważ dodatkowa przestrzeń używana do przechowywania indeksów (i obciążenie IO do ich utrzymania, jeśli twoja baza danych widzi wiele operacji zapisu) może być gorszym problemem niż nieco mniej optymalne zapytania odczytu , więc nie przesadzaj.
Więc jakie byłyby najlepsze rozważania w przypadku wymiaru czasu?
źródło
Ogólna zasada jest taka, że im bardziej selektywny jest indeks (selektywność jest definiowana jako liczba unikalnych wartości w kolumnie podzielona przez liczbę wierszy w tabeli), tym bardziej prawdopodobne jest, że silnik użyje indeksu w przypadku zapytania używa kolumny w klauzuli where.
Jeśli zastanawiasz się nad zaindeksowaniem kolumny, uruchomienie zapytania w kolumnie indeksowanej przed i po oraz sprawdzenie planów wykonania powie ci, czy indeks jest używany, a jeśli tak, to w jakim stopniu indeks pomaga. Najlepiej byłoby, gdyby zapytanie użyte do testu było używane przez aplikację.
źródło
Jak dotąd moją podstawową zasadą było nie umieszczanie żadnych indeksów w moich bazach programistycznych podczas pracy nad nimi. Jako baza produkcyjna robi się coraz większy, używam rejestrowania bazy danych i
EXPLAIN
dowiedzieć się, co potrzebuje indeksowanie, a następnie utworzyć tylko niezbędne indeksów. Działa to dobrze, o ile wykorzystanie bazy danych stopniowo wzrasta, i utrzymuje niski poziom indeksów.Analizując dane w bazie danych, zwykle muszę dodać dodatkowe indeksy, aby przyspieszyć żądania, które nie są powszechne w produkcji. Zawsze robię to na kopiach produkcyjnej bazy danych, więc te indeksy nigdy nie są dodawane do produkcji.
źródło