Ustawiać:
- Windows Server 2008 R2
- SQL Server 2008 R2 z dodatkiem SP1
- 240 GB pamięci RAM
- TempDB to pliki danych 8 x 16 GB bez automatycznego wzrostu (łącznie 128 GB)
- Serwer fizyczny / autonomiczny
Ten serwer służy do przetwarzania ETL. Właśnie zainstalowaliśmy więcej pamięci RAM na tym serwerze, co daje w sumie 240 GB pamięci RAM. Usługi SQL Server to jedyne działające rzeczy.
Pamięć pokazuje się dobrze w BIOS, OpenManage i Windows.
Jeśli skonfiguruję program SQL Server do korzystania z pamięci min./maks. 70/100 GB, nie będziemy mieć problemów. Jednak gdy zwiększę to do 120/150 GB, po uruchomieniu jednego z naszych procesów ETL pojawia się następujący błąd:
Nie można przydzielić miejsca dla obiektu „<tymczasowy obiekt systemowy: 422234507706368>” w bazie danych „tempdb”, ponieważ grupa plików „PODSTAWOWA” jest pełna. Utwórz miejsce na dysku, usuwając niepotrzebne pliki, upuszczając obiekty w grupie plików, dodając dodatkowe pliki do grupy plików lub ustawiając autogrowth dla istniejących plików w grupie plików. (Msg 1105, stan 2, procedura nieznana, wiersz 1)
Nigdy nie napotkaliśmy tego problemu przed zmianą konfiguracji pamięci. Po ponownej konfiguracji z powrotem do pierwotnej pojemności 70/100 GB nie pojawia się ten błąd.
Rzeczy, których próbowałem:
- Ustaw pliki danych TempDB na automatyczne powiększanie. Powoduje to po prostu automatyczne powiększanie plików do momentu osiągnięcia pojemności dyskowej, a następnie awarii.
- Dodaj więcej plików danych TempDB. Taki sam błąd, jak pokazano.
- Zwiększ rozmiar TempDB do 8 x 32 GB (łącznie 256 GB)
Nie wiem, co może być przyczyną tego problemu.
źródło
Odpowiedzi:
Dziękujemy wszystkim za pomoc.
Po przejrzeniu niektórych planów wykonania okazuje się, że istnieje JOIN, który jest przetwarzany inaczej w zależności od ilości dostępnej pamięci RAM. Przy mniejszej ilości pamięci RAM ocenia to za pomocą skrótu; z większą ilością pamięci RAM wykorzystuje serię połączeń scalających.
Zasadniczo sprowadza się to do źle napisanego T-SQL, który obecnie refaktoryzuję.
źródło
To nie jest odpowiedź na pytanie, tylko kod, którego nie chciałem publikować w komentarzu. Aby zobaczyć saldo harmonogramów i pamięci między węzłami NUMA (a także sprawdzić, czy jakieś węzły nie są widoczne online):
(W SQL Server 2012 ostatnia
SUM
powinna być,SUM(pages_kb)
ponieważ nie ma już oddzielnych alokatorów jedno- i wielostronicowych).źródło