Mam tabelę z około 1 milionem do 5 milionów rekordów. Niewielka część tych rekordów ma jedną z bitowych kolumn ustawioną na „PRAWDA”. Musisz szybko znaleźć te rekordy. Myślę, że ten indeks może przyspieszyć wyszukiwanie w tej kolumnie, ale obawiam się WSTAWIĆ. Stąd moje pytanie.
Baza danych działa jak rodzaj hurtowni danych, więc istnieje wiele WYBORÓW i małe (do 10-20 dziennie), ale dość duże WSTAWKI (do 200 tysięcy rekordów jednocześnie). Obawiam się dłuższego czasu tego importu do bazy danych.
sql-server
sql-server-2005
marioosh
źródło
źródło
Odpowiedzi:
Indeks bitowy dla 1 miliona rekordów jest bezużyteczny. Optymalizator nigdy go nie użyje, zapłacisz tylko za jego utrzymanie. O wiele lepszą alternatywą jest dodanie tego bitu jako lewego klawisza w indeksie klastrowym.
Ale zrobię ślepy strzał w ciemności i odgadnę, że masz wzór kolejek: rekordy są upuszczane w tabeli z bitem ustawionym na „PRAWDA” (tj. „Needsprocessing = true”), a następnie wygląda proces w tle dla tych rekordów wykonuje pewne przetwarzanie i aktualizuje bit do FAŁSZ. Jest to wszechobecny wzorzec, zwany również pieszczotliwie „wzorzecem przepisu na katastrofę wydajności”. Poleciłbym upuścić rekordy do tabeli i upuścić powiadomienie (może być tak proste, jak nowo wstawiony identyfikator rekordu) jednocześnie do kolejki . Zobacz Używanie tabel jako kolejek .
źródło
Jak powiedział @MartinSmith, jeśli kiedykolwiek uaktualnisz do SQL 2008, filtrowany indeks byłby idealnym rozwiązaniem. Jednak w międzyczasie jako ogólny przypadek KAŻDY dodany indeks wydłuży czas ładowania. Małe indeksy mniej niż duże.
Jedną rzeczą, na którą chciałbym spojrzeć, jest posiadanie istniejącego indeksu, który można modyfikować. Zakładając, że twoje istniejące zapytania używają danego indeksu, następnie dodanie kolumny bitów na końcu tego indeksu powinno mieć minimalny wpływ na wstawki i pozytywny efekt, na który patrzysz na swoje zapytania.
Następną rzeczą do obejrzenia jest „Czy mam już wiele indeksów?” Nie ma twardej i szybkiej reguły dotyczącej tego, czym jest „dużo”, ale zwykle stosuję regułę 10 indeksów, która jest limitem, chyba że NAPRAWDĘ potrzebuję nowej.
Ostatnia myśl, przetestuj to na instancji testowej. Skonfiguruj tabelę z kilkoma milionami wierszy, uruchom na niej obciążenie, dodaj indeks, a następnie uruchom ponownie ładunek i sprawdź, czy zauważysz znaczący wzrost czasu ładowania.
Tylko Ty naprawdę możesz zdecydować, co jest „znaczące”. Mam maszyny, w których dodanie 5 minut do czasu ładowania jest „znaczące” i inne, w których mogłem bezpiecznie zaobserwować wzrost o kilka godzin.
EDYTOWAĆ:
Inną opcją jest podzielenie tabeli na partycje. Być może będziesz musiał użyć widoku podzielonego na partycje, jeśli nie korzystasz z wersji Enterprise, ale mimo to powinno to pomóc. Umieszczasz swoje bity 0 w jednej partycji, a bity 1 w innej. Zakładając, że wstawiasz tylko jedną wersję lub drugą, możesz nawet przyspieszyć wstawianie.
źródło