Mam bardzo dużą tabelę IMO (~ 137 milionów wierszy) z dużą ilością powtarzanych danych, dużą ilością NULL
kolumn i tym podobne.
Rozważam zbadanie tego przy użyciu tabeli z COLUMNSTORE INDEX
i mam IDENTITY
kolumnę w oryginalnej tabeli, która jest moją jedyną kolumną, w której każdy wiersz jest unikalny.
Czy powinienem pominąć tę kolumnę, czy dołączyć ją? Przeczytałem, że chcesz uwzględnić wszystkie wiersze swojej tabeli, COLUMNSTORE INDEX
ale przeczytałem również, że najlepszymi kandydatami są kolumny z dużą ilością nieunikalnych wierszy.
Czy to tylko zły kandydat na COLUMNSTORE INDEX
?
Korzystam z programu SQL Server 2012, więc jest to nieklastrowany magazyn kolumn. Właśnie badam możliwe lepsze sposoby przechowywania tych danych. Aktualizacje nie istnieją, chociaż nowe wiersze będą okresowo dodawane za pomocą procesu ELT, więc zakładam, że pewne prace zostałyby tam wykonane. Niektórzy ludzie wydobywają te dane i generują ogromne raporty, dużo skanowania wierszy, co czasami powoduje, że serwer jest indeksowany, co zmusza nas do codziennego odciążania kopii na serwerze pomocniczym.
137 million rows
jest duży, ale łatwy do opanowania. Czy zastanawiałeś się nad podziałem tabeli i umieszczaniem jej w różnych aplikacjach? Indeks Columnsstore w SQL 2012 nie jest zapisywalny, więc będziesz miał problemy - musisz go upuścić i odtworzyć. Nie mówię, że wola magazynu kolumn jest zła, ale lepiej jest też zbadać inne opcje.Odpowiedzi:
Kolumny tożsamości nie są tak naprawdę kompresowane w Indeksach magazynu kolumn w SQL Server 2012 lub SQL Server 2014. Wszystko to naprawdę będzie zależeć od obciążenia, którego doświadczasz. Jeśli twoje obciążenie obejmie kolumnę tożsamości, możesz bardzo pięknie skorzystać z eliminacji segmentów.
Z punktu widzenia kompresji - sklep Columnstore zapewni lepszą kompresję niż zwykle strona. Zazwyczaj Sprawdź to przed przejściem do produkcji.
Twoim największym problemem w SQL Server 2012 będzie bardzo słaba implementacja trybu wsadowego i nic nie możesz na to poradzić.
źródło
Nie mogłem się oprzeć dołączeniu do Niko z inną odpowiedzią (witaj, Niko!). Ogólnie zgadzam się z Niko, że ograniczenia trybu wsadowego w SQL 2012 (jeśli Niko nie będzie łączył się z własnym blogiem, zrobię to :)) mogą być poważnym problemem. Ale jeśli możesz z nimi żyć i mieć pełną kontrolę nad każdym pisanym zapytaniem w stosunku do tabeli, aby dokładnie go zweryfikować, sklep z kolumnami może działać dla Ciebie w SQL 2012.
Jeśli chodzi o twoje szczegółowe pytania dotyczące kolumny tożsamości, stwierdziłem, że kolumna tożsamości bardzo dobrze się kompresuje i zdecydowanie zalecamy włączenie jej do indeksu magazynu kolumn przy każdym wstępnym testowaniu. (Zauważ, że jeśli kolumna tożsamości jest również indeksem klastrowym twojego b-drzewa, zostanie automatycznie uwzględniona w indeksie magazynu klastrów nieklastrowanych ).
Dla porównania, oto rozmiary, które zaobserwowałem dla ~ 10 MM wierszy danych w kolumnie tożsamości. Magazyn kolumn załadowany w celu optymalnej eliminacji segmentów kompresuje się do 26 MB (w porównaniu do 113 MB w przypadku
PAGE
kompresji tabeli magazynu wierszy), a nawet magazyn kolumn zbudowany na losowo uporządkowanym drzewie b ma tylko 40 MB. To pokazuje ogromną przewagę kompresji, nawet w porównaniu z najlepszą kompresją b-drzewa, którą SQL ma do zaoferowania, a nawet jeśli nie zadajesz sobie trudu, aby wyrównać dane w celu optymalnej eliminacji segmentów (co zrobiłbyś najpierw tworząc b-drzewa, a następnie budowanie magazynu kolumn za pomocąMAXDOP
1).Oto pełny skrypt, którego użyłem na wypadek, gdybyś chciał się pobawić:
źródło