Przede wszystkim są to dwa różne modele danych odpowiednie do różnych celów.
Mając na uwadze powyższe, będę oczekiwać drugi model będzie szybciej do agregacji, po prostu dlatego, że dane są pakowane bardziej zwarty, dlatego potrzebuje mniej I/O:
- w grupie przez pierwszy model może być spełniony przez skanowanie pełne na indeksie
{size, price}
. Alternatywa dla indeksu jest zbyt wolna, gdy dane są zbyt duże, aby zmieścić się w pamięci RAM.
- Zapytanie w drugim modelu może zostać spełnione przez pełne skanowanie tabeli. Nie jest wymagany indeks .
Ponieważ pierwsze podejście wymaga tabeli + indeksu, a drugie tylko samej tabeli, wykorzystanie pamięci podręcznej jest lepsze w drugim przypadku.Nawet jeśli pominiemy buforowanie i porównać indeks (bez stołu) w pierwszym modelu z tabelą w drugim modelu, podejrzewam indeks będzie większa niż w tabeli, po prostu dlatego, że fizycznie rejestruje size
i ma nieużywane „dziury” typowy dla drzew typu B (chociaż to samo dotyczy tabeli, jeśli jest to clustered).
I wreszcie, drugi model nie posiada narzut konserwacji indeksu, które mogłyby wpłynąć na INSERT/UPDATE/DELETE wydajność.
Poza tym, można rozważyć buforowanie SUM i COUNT w osobnej tabeli zawierającej tylko jeden wiersz. Zaktualizuj oba wyzwalacze SUM i COUNT za każdym razem, gdy wiersz jest wstawiany, aktualizowany lub usuwany w głównej tabeli. Następnie można łatwo pobrać bieżący system AVG, dzieląc SUMA i COUNT.
Ale trzeba naprawdę miarą na reprezentatywnych ilości danych, aby mieć pewność.
Ponieważ w zapytaniu nie ma klauzuli WHERE, wszystkie wiersze zostaną przeskanowane. Indeksy są przydatne tylko przy pobieraniu stosunkowo niewielkiego podzbioru wierszy tabeli (a czasami dla index-only scans). Jako szorstki zasada, jeśli więcej niż 10% wierszy w tabeli są potrzebne, indeksy nie pomoże, a DBMS często zdecydować się na pełne skanowanie tabeli, nawet gdy indeksy są dostępne.
dziękuję za wielką wyjaśnienia! Twoje dodatkowe komentarze na końcu są bardzo przydatne, moje pytanie to tylko zwięzłe podsumowanie większego problemu, z jakim się borykam i na pewno będę je uważnie rozważać. – sashkello