Strony są wczytywane do pamięci zgodnie z wymaganiami, jeśli nie ma dostępnej wolnej pamięci, najstarsza niezmodyfikowana strona jest zastępowana stroną przychodzącą.
Oznacza to, że jeśli wykonasz zapytanie wymagające więcej danych, niż może zmieścić się w pamięci, wiele stron będzie żyło bardzo krótko w pamięci, co spowoduje dużą liczbę operacji we / wy.
Możesz zobaczyć ten efekt, patrząc na licznik „Life Life Expectancy” w Monitorze wydajności systemu Windows. Spójrz na https://sqlperformance.com/2014/10/sql-performance/knee-jerk-page-life-expectancy, aby uzyskać wspaniałe szczegóły na temat tego licznika.
W komentarzach zapytano konkretnie, co dzieje się, gdy wyniki zapytania są większe niż dostępne miejsce w buforze. Weźmy najprostszy przykład, select * from some_very_big_table;
- załóżmy, że tabela ma 32 GB i max server memory (MB)
jest skonfigurowana na 24 GB . Wszystkie 32 GB danych tabeli zostaną wczytane pojedynczo na strony w buforze stron, zatrzaśnięte, sformatowane w pakiety sieciowe i wysłane za pośrednictwem drutu. Dzieje się to strona po stronie; możesz mieć 300 takich zapytań uruchomionych w tym samym czasie, a przy założeniu, że nie nastąpi blokowanie, dane dla każdego zapytania zostaną wczytane do obszaru bufora strony, strony na raz, i przesłane do przewodu tak szybko, jak to możliwe zażądać i zużyć dane. Po przesłaniu wszystkich danych z każdej strony do drutu strona zostaje odblokowana i bardzo szybko zostanie zastąpiona inną stroną z dysku.
W przypadku bardziej złożonego zapytania, powiedzmy na przykład agregującego wyniki z kilku tabel, strony zostaną wciągnięte do pamięci dokładnie tak jak powyżej, ponieważ są one wymagane przez procesor zapytań. Jeśli procesor zapytań potrzebuje tymczasowej przestrzeni roboczej do obliczenia wyników, będzie wiedział o tym z góry, kiedy skompiluje plan zapytania i zażąda przestrzeni roboczej (pamięci) od SQLOS . SQLOS w pewnym momencie (zakładając, że nie przekroczy limitu czasu ), przyzna tę pamięć procesorowi zapytań, w którym to momencie przetwarzanie zapytania zostanie wznowione. Jeśli procesor zapytań popełni błąd w oszacowaniu ilości pamięci wymaganej od SQLOS, może być konieczne wykonanie „przelewu na dysk”operacja polegająca na tymczasowym zapisaniu danych w tempdb w formie pośredniej. Strony, które zostały zapisane w tempdb, zostaną odblokowane, gdy zostaną zapisane w tempdb, aby zrobić miejsce dla innych stron do odczytu w pamięci. Ostatecznie proces zapytania powróci do danych przechowywanych w tempdb, stronicując to przy użyciu zatrzasku, na strony w buforze, które są oznaczone jako wolne.
Niewątpliwie brakuje mi bardzo szczegółowych informacji w powyższym podsumowaniu, ale myślę, że to odzwierciedla istotę tego, w jaki sposób SQL Server może przetwarzać więcej danych niż mieści się w pamięci.