Czy kompresja danych programu SQL Server jest kategorycznie dobra w przypadku baz danych tylko do odczytu?

11

Część literatury na temat kompresji danych SQL Server, którą czytam, stwierdza, że ​​koszt zapisu wzrasta około czterokrotnie, co byłoby normalnie wymagane. Wydaje się również sugerować, że jest to główny minus kompresji danych, silnie sugerując, że w przypadku bazy danych archiwum tylko do odczytu wydajność (z kilkoma wyjątkami) poprawi się dzięki kompresji danych w 100% wypełnionych stronach.

  1. Czy powyższe stwierdzenia są prawdziwe?
  2. Jakie są podstawowe „różnice” między kompresją danych a innymi metodami (do odczytu)

    • „CPU + x%”?
    • „IO -y%”?
    • wystąpienie podziału strony?
    • użycie tempdb?
    • Wykorzystanie pamięci RAM?
  3. A do pisania?

Na potrzeby tego pytania możesz ograniczyć kontekst do kompresji na poziomie PAGE dużej bazy danych (> 1 TB) , ale dodatkowe komentarze są zawsze mile widziane.


Bibliografia:

Blog SQL Server Storage Engine (scenariusz DW pokazuje, że kompresja jest bardzo korzystna)
Kompresja danych: strategia, planowanie pojemności i najlepsze praktyki

Bardziej szczegółowe podejście do decyzji o tym, co należy skompresować, obejmuje analizę charakterystyki obciążenia dla każdej tabeli i indeksu. Opiera się na następujących dwóch metrykach:

U: Procent operacji aktualizacji na określonej tabeli, indeksie lub partycji w stosunku do łącznej liczby operacji na tym obiekcie. Im niższa wartość U (to znaczy tabela, indeks lub partycja jest rzadko aktualizowana), tym lepszy jest kandydat do kompresji strony.
S: Procent operacji skanowania tabeli, indeksu lub partycji w stosunku do łącznej liczby operacji na tym obiekcie. Im wyższa wartość S (tzn. Najczęściej skanowana jest tabela, indeks lub partycja), tym lepszy jest kandydat do kompresji strony.

Oba powyższe są wyraźnie tendencyjne do zalecania kompresji stron dla baz danych w stylu DW (operacje wymagające intensywnego odczytu / wyłączne, operacje na dużych danych).

孔夫子
źródło
Jaka literatura konkretnie? Zawsze będzie obciążenie procesora zarówno dla kompresji / dekompresji, ale podobnie jak w przypadku odczytów, piszesz również na mniejszej liczbie stron. W rzeczywistości sądzę, że strona zapisująca skorzystałaby nawet bardziej niż strona odczytu, ponieważ strona odczytu często zapisuje skompresowane strony w pamięci (nie zawsze, ale najlepszy przypadek zależy od wielkości przydzielonych danych i pamięci).
Aaron Bertrand
3
Podanie któregoś z wymaganych danych będzie bardzo trudne, ponieważ całkowicie zależy to od charakteru danych i możliwości ich skompresowania (i będzie się to różnić w zależności od wiersza i strony, a także ). Niektóre osoby zgłosiły współczynnik kompresji do 90%, co będzie miało wpływ zarówno na zużycie pamięci (w pozytywny sposób), jak i na procesor, aby przeprowadzić tak dużą kompresję. Ten papierowy ballpark narzuta na poziomie 10% dla kompresji wierszy i wyższym dla strony . To, co obserwujesz, może być zupełnie inne.
Aaron Bertrand
1
W przypadku archiwalnej bazy danych tylko do odczytu, wydaje mi się, że pytanie brzmi, czy może zmieścić się w pamięci. Jeśli wszystko zmieści się w pamięci, to po załadowaniu do puli buforów nie ma realnej korzyści z kompresji. Jeśli jednak nie wszystko zmieści się w pamięci, nadal możesz zauważyć korzyść z zamiany mniejszej liczby stron do i z pamięci podręcznej, nawet jeśli praca zostanie wykonana przy rozpakowaniu.
Aaron Bertrand
Wydaje się, że żaden z dodanych linków nie wspomina o 4x karie za pisanie. Czy pamiętasz, gdzie to odebrałeś? Chciałbym zobaczyć kontekst.
Aaron Bertrand
1
Cóż, jeśli nie możesz zmieścić danych w pamięci, to taki scenariusz jest trochę dyskusyjny, prawda? :-)
Aaron Bertrand

Odpowiedzi:

6

Tylko moje 2 centy z własnych eksperymentów na 1-2-letnim sprzęcie:

Operacje tylko do odczytu (skanowanie w stylu DW, sortowanie itp.) W tabelach skompresowanych na stronie (~ 80 rzędów / strona) Stwierdziłem, że osiągają próg rentowności przy zmniejszeniu wielkości kompresji ~ 3x.

To znaczy, jeśli tabele i tak mieszczą się w pamięci, kompresja strony wpływa na wydajność tylko wtedy, gdy rozmiar danych zmniejszył się ponad 3-krotnie. Skanujesz mniej stron w pamięci, ale skanowanie każdej strony trwa dłużej.

Myślę, że twój przebieg może się różnić, jeśli twoje plany są zagnieżdżone i ciężkie do poszukiwania. Byłoby to między innymi zależne od sprzętu (kary za dostęp do obcego węzła NUMA, szybkość pamięci itp.).

Powyższe jest tylko ogólną zasadą, którą stosuję, opartą na własnych testach z wykorzystaniem własnych zapytań na własnym sprzęcie (Dell Poweredge 910 i nowsze). To nie jest ewangelia!

Edycja: Wczoraj doskonała prezentacja Thomasa Kejsera w SQLBits XI została udostępniona jako wideo. Dość istotne w tej dyskusji, pokazuje „brzydką” stronę obliczeniową procesora do kompresji stron - aktualizacje spowolnione 4x, blokady utrzymywane przez nieco dłuższy czas.

Jednak Thomas używa pamięci FusionIO i wybrał tabelę, która „tylko” kwalifikuje się do kompresji strony. Jeśli pamięć była przechowywana w typowej sieci SAN, a użyte dane były skompresowane 3x-4x, wówczas obraz mógłby być mniej dramatyczny.

John Alan
źródło
1
Czy to może być stary sprzęt? Na nowym sprzęcie, czysty dysk SSD W przypadku przechowywania rdzeni nie mogę łatwo nadążyć za płytami. Zwykle myślę, że korzyść zacznie się dużo łatwiej - 50% redukcja IO jest tego warta, gdy nie robi się tak wielu zmian.
TomTom
TomTom, Storage nie wchodzi w grę dla tych figurek. Porównanie dotyczy nieskompresowanych tabel w pamięci i skompresowanych tabel w pamięci.
John Alan
Nigdy nie widziałem DWH, który byłby wystarczająco dobry dla pamięci. Poważnie. Wrócisz do płyty.
TomTom
1
Tak, oczywiście, że czasami wracasz na dysk - podczas odczytu z dysku kompresja strony prawie zawsze ma przewagę (zakładając, że dane są wystarczająco kompresowalne!). Ale jeśli obciążenie zostanie załadowane z dysku raz, a następnie zmanipuluje wszystko w pamięci do końca dnia - ile byś przyłożył do odczytu dysku i ile do operacji w pamięci?
John Alan
1
Właśnie natknąłem się na odpowiednią prezentację slajdów z SQLBits 2013 autorstwa Thomasa Kejsera
John Alan
0

Mogę dodać kilka słów ze środowiska Data Warehouse.

Implementacja kompresji (w moim przypadku PAGE) na stole testowym z 30 milionami wierszy (18 GB) zmniejsza rozmiar stołu z 18 GB do 3 GB! (wydajność przechowywania na pewno), ale zwiększ czas ładowania (zapisu) z 22 do 36 minut.

W przypadku odczytu lub odczytu i umieszczenia danych w pamięci może to być dobre rozwiązanie, ale w przypadku codziennego ładowania danych może to spowodować obniżenie wydajności.

Tomasz Wieczorkowski
źródło