Ile pamięci jest potrzebne do przechowywania tabeli w pamięci podręcznej?(SQL Server 2008)


5

Prowadzę długie i złożone zapytania, które najczęściej wykorzystują jeden duży stół - 8 GB, 40M wiersze.AFAIK, wszystkie/większość wierszy są używane w każdym zapytaniu.Widzę dużo IO w monitorze aktywności - dla pierwszego zapytania i dla każdego kolejnego.Serwer korzysta obecnie z 6,5 GB pamięci i chcę dokonać aktualizacji.Pytanie brzmi, ile pamięci jest potrzebne, aby uniknąć wszystkich tych odczytów dysku?Czy jest w polu gry o wielkości stołu lub więcej?

Jest to wyjście IO SET STATISTICS.BigTable jest tym, o który pytam, SmallTable ma relację 1 do wielu z BigTable.#entrance przechowuje dane wyjściowe zapytania (kilkaset wierszy wyjścia).

Table 'SmallTable'. Scan count 249005, logical reads 2829948, physical reads 2605, read-ahead reads 10395, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'BigTable'. Scan count 194004, logical reads 13482115, physical reads 33841, read-ahead reads 1181136, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table '#entrance__000000000023'. Scan count 0, logical reads 1568, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Worktable'. Scan count 0, logical reads 0, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
+2

Czy ten serwer/baza danych nie robi nic innego niż uruchamianie zapytań przez 1 tabelę 8 GB danych?Ja też trochę drapię się po głowie nad 1 tabelą, ale złożony aspekt zapytania tego pytania.Jakaś szansa na DDL lub mały wgląd w naturę tej złożoności? 14 wrz. 112011-09-14 22:20:40

  0

Tylko podstawowe sprawdzenie, jakiej wersji serwera SQL używasz?jeśli nie jest przedsiębiorstwem, nie będzie można użyć całej bieżącej pamięci dla serwera sql. 16 wrz. 112011-09-16 15:30:00

  0

Ostatecznie zaktualizowałem pamięć RAM serwera i przeprowadziłem test.Opublikowałem wyniki jako odpowiedź poniżej. 09 lut. 132013-02-09 08:50:11

3

jaka jest natura twoich zapytań?Tylko SELECT?Lub mieszankę DUI (DELETE, UPDATE, INSERTs)?a jaki jest twój model odzyskiwania?czy używasz domyślnego poziomu izolacji transakcji?

Jeśli chcesz umieścić wszystkie te strony w pamięci, musisz zdobyć więcej pamięci (ale już o tym wiedziałeś).Chcesz wiedzieć „ile”, ale prawda jest taka, że ​​w zależności od natury twoich zapytań nadal możesz zobaczyć pewne problemy we/wy, nawet z wystarczającą ilością pamięci, aby pomieścić całą tabelę.

Rozważmy wszystkie powyższe ... tak, ustaw wielkość stołu na dysku jako ilość pamięci.Po prostu nie zdziw się, jeśli okaże się, że nadal masz dyskowe we/wy.

  0

Zmodernizowałem pamięć RAM serwera i „ustawiłem rozmiar tabeli na dysku, ponieważ ilość pamięci” jest absolutnie poprawna.Zobacz moją odpowiedź poniżej. 08 lut. 132013-02-08 11:59:48


8

To jest dwuczęściowa odpowiedź.

Pierwsza część to kupić tyle RAM, ile możesz sobie pozwolić (o ile zmieści się na serwerze).

Druga część polega na tym, że zawsze będziesz czytać dane.Sztuczka polega na sprawdzeniu, czy te odczyty są fizyczne lub logiczne.Odczyty fizyczne spadają na dysk.Odczyty logiczne są odczytywane z puli buforów w pamięci.Widać to, umieszczając „SET STATISTICS IO ON” na górze skryptu SQL, a następnie uruchamiając go w SSMS.Na karcie wiadomości otrzymasz szczegółowe informacje o IO dla każdego uruchamianego zapytania, aw szczególności otrzymasz liczbę operacji logicznych i fizycznych (odczyty w twoim przypadku), które mają miejsce na podstawie tabeli po tabeli.Jeśli liczby odczytu fizycznego są dość wysokie (liczby te są w zasadzie liczbą bloków, które zostały odczytane tak wiele przez 8, to podziel przez 1024, aby uzyskać liczbę w Megs), a następnie potrzebujesz więcej pamięci RAM.Jeśli logiczne liczby odczytu są wysokie, to w rzeczywistości nie przechodzisz na dysk, ale twoje zapytanie może wymagać strojenia, utworzenia indeksów itp.

(Uwaga: Na potrzeby tej odpowiedzi zakładam tylko instrukcje SELECT. Operacje INSERT/UPDATE/DELETE są nieco bardziej złożone, ale obowiązują te same podstawy).

  0

Spróbuję: USTAWIĆ STATYSTYKI IO ON i złożyć raport.Więcej informacji: zapytania są w 100% wybrane.Każde zapytanie trwa kilka minut.Serwer uruchamia również małą aplikację, która wykonuje zapytanie i zrzuca wyniki do programu Excel, ale wątpię, aby miało to wpływ na wydajność serwera. 15 wrz. 112011-09-15 05:00:37

  0

Jeśli potrzebujesz pomocy w odczytaniu danych wyjściowych, możesz opublikować plan wykonania i dane wyjściowe SET STATISTICS IO. 15 wrz. 112011-09-15 05:05:59


1

Nie masz pewności, że więcej RAM pomoże.Szybkie obliczenia sugerują, że zapytanie przetwarzane jest w obszarze 125 GB danych, co jest imponujące w przypadku tabeli zawierającej 8 GB.

(2829948 + 13482115 + 1568) x 8/1048576 = 125 GB

270 MB fizycznych odczytów będzie stanowić część powolnego działania, ale nie będzie tak bardzo jak narzuty w pamięci.

Otrzymasz lepsze wyniki w wyniku ponownego przetworzenia zapytania niż dodanie dodatkowej pamięci.Opublikuj DDL/plan zapytania/wykonania w nowym pytaniu, a ktoś na pewno będzie w stanie pomóc.


3

Zawsze jestem spóźniony na imprezę.:) To zapytanie najprawdopodobniej może być dostrojone do świetnego efektu.Ale na pytanie, ile pamięci RAM do buforowania tabeli 8 GB ... wstępnym pytaniem jest, ile węzłów pamięci raportuje serwer SQL Server?Każdy węzeł pamięci (logiczny odpowiednik fizycznych węzłów NUMA) ma niezależnie zarządzaną pamięć podręczną puli buforów.Zadania uruchamiane na procesorach w tym węźle wstawiają się do puli buforów w tym węźle.

Jeśli więc istnieje szansa, że ​​zadania, które przeczytają całą tabelę 8 GB, zostaną uruchomione na jednym węźle NUMA, pula buforów tego węzła musi zawierać tabelę 8 GB.Zacznij więc od 8 GB maksymalnej pamięci serwera na węzeł NUMA.Następnie zacznijmy go zwiększać.Pamięć zapytań może zajmować do 70% puli buforów, pozostawiając tylko 30% na zawartość bloku bazy danych.Tak więc tabela 8 GB nie może być większa niż 30% maksymalnej pamięci serwera na jednym węźle NUMA dla serwera.26 2/3 GB dla maksymalnej pamięci serwera.Na węzeł NUMA.Jeśli jego SQL Server 2012, rzeczy, które SQL Server 2008 R2 i poprzednio używane wielostronicowy alokator dla (który był więc poza zasięgiem maksymalnej pamięci serwera) jest teraz w zakresie maksymalnej pamięci serwera i musi być rozliczony.Musi być ona uwzględniona w całkowitej pamięci serwera w obu przypadkach, niezależnie od tego, czy jest to część maksymalnego limitu pamięci serwera SQL Server, czy nie.

O tak ... wszelkie użycie tabel tymczasowych lub innych zastosowań tempdb powinno być uwzględnione również w pamięci serwera max, aby nie pozwolić eksmitować tabeli z pamięci podręcznej.

Dodaj wystarczającą ilość pamięci dla systemu operacyjnego Windows (co najmniej 4 GB).Dodaj wystarczającą ilość wątków roboczych SQL Server, podstawowego procesu SQL Server, zadań agenta SQL, wszelkich innych potrzeb pamięci aplikacji.

Na pojedynczym serwerze węzłów NUMA zatrzymałbym około 36 GB pamięci RAM z maksymalną pamięcią serwera co najmniej 27 GB, aby niezawodnie buforować tabelę 8 GB.A jeśli istnieje wiele węzłów NUMA, wzrośnie on o co najmniej 26 2/3 GB maksymalnej pamięci serwera na węzeł NUMA, a także o dodatkowe wątki robocze, które będą towarzyszyć dodatkowym rdzeniom w dodatkowych węzłach NUMA.

Choć może się to wydawać przesadne, wynika to częściowo z tego, jak SQL Server obsługuje NUMA.Ale możesz mieć szczęście!Jeśli wystarczy jeden leniwy pisarz, możesz użyć flagi śledzenia startowego 8015, aby zignorować NUMA i zarządzać pojedynczą pulą buforów.W ten sposób około 36 - 40 GB powinno wystarczyć na utrzymanie pamięci o pojemności 8 GB bez względu na liczbę węzłów NUMA na serwerze.omówić to nieco więcej w następnym wpisie na blogu.Jeśli zdecydujesz się na użycie flagi śledzenia 8015, polecam ocenę flagi śledzenia 8048 wraz z nią, aby zapobiec eskalacji rywalizacji spinlock i CMEMTHREAD czeka na skojarzenie z pamięcią.http://sqlsasquatch.blogspot.com/2013/02/sql-server-cache-database-working-set.html


2

Zaktualizowałem pamięć RAM serwera z 8 GB do 64 GB i przeprowadziłem test.Rozmiar tabeli wynosi obecnie 16,05 GB, a przestrzeń indeksu to 187 MB (1 klastrowany i 1 unikalny indeks bez klastrów).Sprawdziłem całkowite użycie pamięci RAM serwera przed i po uruchomieniu zapytania, które uśrednia każde ze 137 pól w tabeli.Całkowita pamięć wzrosła z 4,22 GB do 20,4 GB = 16,18 GB, co stanowi 100,8% wielkości stołu.SQLRockstar miał całkowitą rację przewidując, że ilość pamięci RAM jest wielkością stołu.

Więcej informacji:

  • Pełność strony indeksu klastrowego wynosi 98,1%
  • Dalsze zapytania w tabeli nie spowodowały IO dysku.
  • SQL Server 2008R2 Developer
  • Plan wykonania pokazuje, że użyto indeksu klastrowego