2009-12-28 17 views
5

Utworzono skrypt, aby znaleźć selektywność każdej kolumny dla wszystkich tabel. W niektórych tabelach z mniej niż 100 wierszy selektywność kolumny wynosi więcej niż 50%. Gdzie Selektywność = Wyraźne wartości/Całkowita liczba wierszy. Czy te kolumny kwalifikują się do indeksu? Czy możesz mi podać minimalne wymaganie dotyczące liczby wierszy do utworzenia indeksu?Jaka jest minimalna liczba wierszy wymaganych do utworzenia indeksu?

Odpowiedz

5

Można indeks na dowolnej kolumny - pytanie brzmi, czy to ma jakiś sens i czy wskaźnik zostaną wykorzystane ....

Zwykle selektywność mniej niż 1-5% może działać - mniejszy ten procent, tym lepiej. Najlepsze są pojedyncze wartości z dużej populacji, np. jeden identyfikator klienta na setki tysięcy - z pewnością te wskaźniki zostaną wykorzystane.

Rzeczy takie jak płeć (tylko 2 wartości) lub inne rzeczy, które mają tylko ograniczoną liczbę możliwych wartości, zazwyczaj nie działają dobrze w indeksie. Przynajmniej na własną rękę - te kolumny mogą być w porządku do włączenia do innego indeksu jako druga lub trzecia kolumna.

Ale naprawdę, jedynym sposobem, aby dowiedzieć się, czy indeks ma sens jest

  • mierzyć zapytań przed
  • utworzyć indeks
  • prowadzony zapytania ponownie sprawdzić swoje plany wykonania , zmierz ich czasy:

Nie ma złotej reguły określającej, kiedy indeks zostanie użyty (lub zignorowany) - zbyt wiele zmiennych wpływa na tę decyzję.

jakiegoś eksperta porady, jak radzić sobie z indeksów i jak dowiedzieć się, jakie indeksy nie może przyzwyczaić, a kiedy ma to sens, aby utworzyć indeks, patrz Kimberly Tripp blogu posty:

+0

Mam tabelę z 3 wartościami intergerów i wszystkie są dostinct. Selektywność tego jest większa niż 95%. A ta tabela jest najczęściej używana tylko z instrukcją select. Czy możliwe jest stworzenie indeksu na ten temat? – Paresh

+0

95% selektywne znaczenie? Zazwyczaj potrzebujesz bardzo niskiej selektywności - chcesz, aby pojedyncza wartość (ID = 55) tylko wybierała minimalną liczbę wierszy. Jeśli twoja selektywność w tym scenariuszu (procent, ile wierszy z sumy zostanie wybranych dla danej wartości twojego pola) jest mniejsza niż 5% lub nawet niższa niż 1%, to z pewnością ma sens indeksowanie. –

+0

"Rzeczy takie jak płeć (tylko 2 wartości)" teraz, gdy jest 2018, ta część twojej odpowiedzi jest nieaktualna. Płeć powinna być od teraz VARCHAR (255). Osobiście identyfikuję się jako śmigłowiec szturmowy Apache. –

0

nie jestem pewien o sQL-serwer, ale większość DBMS nie używać indeksu dla pobierania i f może pobrać wszystkie wiersze tabeli w jednym we/wy. Zobaczysz to na objaśnieniach PLANU, niektóre tabele są zawsze skanowane w tabelach.

IMHO, każda tabela z mniej niż 5000 wierszy nie jest warta analizowania pod względem liczności, jeśli DBMS działa na serwerze.

2

Większość DBMS korzysta z pamięci podręcznej dla danych i kodu (procedura składowana, plan wykonania itp.). W SQL Server myślę, że to nazywa dane i Procedura cache i Oracle, nazywa cache i SGA. Dane tabeli i/lub indeks mogą znajdować się w pamięci podręcznej.

Mały stolik, do którego często wchodzimy, najprawdopodobniej zmieści się w pamięci podręcznej. Ale tabelę można wyeksmitować z pamięci podręcznej, powiedzmy, jeśli zapytanie ładuje nowe dane z dysku. Istnieją opcje wskazujące, że tabela ma być na stałe w pamięci podręcznej (Zobacz PINTABLE).To może lepsza strategia, która używa indeksu, jeśli twój stół jest bardzo mały (co jest twoim przypadkiem). Dodanie indeksu (który zawsze byłby zawsze w pamięci podręcznej) mogłoby pomóc w dalszej pracy, ale nie wiem, jaki byłby zysk.

Dużą różnicą w wydajności jest dostęp do dysku w porównaniu do dostępu do pamięci. Celem indeksu jest zmniejszenie ilości danych do odczytania z dysku, ale jeśli jest już w pamięci, zysk jest prawdopodobnie niewielki.

Powiązane problemy