Temat: [MSSQL]Duża tabela i sumowanie
Rozumiem, że mamy pola
CreateDate datetime,
WidgetId int,
HostId int,
ProgramId int
Count int
bez żadnego indeksu.
W MS SQLu najwazniejsze jest zbudowanie indeksu klastrowego (clustered index) - to według tego indeksu poukładane są strony danych w bazie danych. Inaczej dane z tabeli są przeważnie strasznie "rozfragmentowane".
Pierwsze pole w indeksie powinno zawierać pole grupowane - hostid. Pozostałe - wedlug uznania, ale z punktu widzenia indeksu klastrowego najlepiej byłoby wybrać minimalną liczbę prostych pól, które utworzą klucz główny, choć nie jest to konieczne i można zbudować indeks wyłącznie z polem hostid.
Jeżeli zapytanie grupujące:
select hostid, sum(count) from tabela group by hostid
wywoływane jest bardzo często, to proponuję dodatkowo utworzyć widok z tym zapytaniem i zrobić na nim indeks. W MS SQLu indeks na takim widoku może być wykorzystany nawet, gdy nie będziemy się odwoływać do widoku, tylko to tabeli źródłowej, na której ten widok jest postawiony. Indeks na widoku będzie aktualizowany przy każdej zmianie w tabeli (schemabinding), więc zmaterializowany indeks na tym widoku będzie zawierał zawsze wszystkie potrzebne informacje. Dostęp do stron danych tabeli nie jest wówczas konieczny.
Tabela nie zajmuje zbyt dużo, dla indeksu klastrowego dane powinny zajmować ok. 7,36 mln * 30+ >= 200 MB (bez indeksu klastrowego dane zajmują więcej!).
Przypuszczam, że różnych hostid może być ze 100 k. Indeks na widoku powinien zajmować ok. 0,1 mln * 8 ~= 1 MB
Krzysztof Gil edytował(a) ten post dnia 02.08.12 o godzinie 11:47