Na podstawie moich książek na temat SQL Server 2008 Wewnętrzne i rozwiązywanie problemów (pożyczone z lokalnej biblioteki w Illinois) przez Christiana Boltona, Brenta Ozara itp. Staram się uzyskać zrozumienie i potwierdzenie na serwerze SQL i wiele wyszukiwań w sieci Byłbym wdzięczny, gdyby ktoś mogę potwierdzić lub poprawić moje zrozumienie.
Każde zapytanie lub operacja, które wymagają przyznania pamięci zapytania, będą wymagały pamięci miejsca do pracy. W ogólnym zapytaniu za pomocą Sortowania, Łączenia mieszającego, Równoległości (nie jestem tego pewien), Wstawiania zbiorczego (nie jestem pewien), Przebudowy indeksu itp. Będzie potrzebować pamięci obszaru roboczego zapytania.
Pamięć obszaru roboczego jest częścią puli buforów programu SQL Server (jest przydzielana jako część puli buforów), a maksymalna pamięć obszaru roboczego wynosi 75% pamięci przydzielonej do puli buforów. Domyślnie pojedyncze zapytanie nie może uzyskać więcej niż 25% pamięci obszaru roboczego (w SQL 2008 / SQL 2012 - kontrolowane przez domyślną grupę obciążenia Resource Governor po wyjęciu z pudełka).
Szukam potwierdzenia mojego zrozumienia
1) Biorąc pod uwagę system z 48 GB pamięci RAM i maksymalną pamięcią serwera skonfigurowaną na 40 GB, oznacza to, że maksymalna pamięć obszaru roboczego jest ograniczona do 30 GB, a pojedyncze zapytanie nie może uzyskać więcej niż 10 GB pamięci obszaru roboczego (pamięci zapytań). Więc jeśli masz złe zapytanie z miliardem wierszy, które wykonuje ogromne sprzężenie mieszające i potrzebujesz więcej niż 10 GB pamięci (pamięci obszaru roboczego), czy w ogóle zechce przejść przez tę kolejkę przyznania pamięci lub od razu rozlewać się na dysk?
2) Jeśli zapytanie wykonujące masową operację sortowania zostało przypisane do pamięci obszaru roboczego o wielkości 5 MB i podczas wykonywania zapytania, jeśli optymalizator zapytań zda sobie sprawę, że z powodu złych statystyk lub brakujących indeksów zapytanie to faktycznie potrzebuje 30 MB pamięci obszaru roboczego natychmiast wyleje się do tempdb. Nawet jeśli system ma dużo dostępnej pamięci obszaru roboczego podczas wykonywania, gdy kwerenda przekroczy przyznaną pamięć obszaru roboczego podczas wykonywania, będzie musiała przelać się na dysk. Czy moje rozumowanie jest prawidłowe?