사용 가능한 여유 메모리가 없으면 수정되지 않은 가장 오래된 페이지가 들어오는 페이지로 바뀝니다.
이는 메모리에 들어갈 수있는 것보다 더 많은 데이터가 필요한 쿼리를 실행하면 많은 페이지가 메모리에서 매우 짧은 수명을 유지하므로 많은 I / O가 발생한다는 것을 의미합니다.
Windows 성능 모니터의 "페이지 수명 예상"카운터를 보면이 효과를 볼 수 있습니다. 봐 https://sqlperformance.com/2014/10/sql-performance/knee-jerk-page-life-expectancy 그 카운터에 대한 몇 가지 좋은 내용은.
주석 에서 쿼리 결과 가 사용 가능한 버퍼 공간보다 클 때 어떤 일이 발생하는지 구체적으로 물었습니다 . 가장 간단한 예를 들어, select * from some_very_big_table;
테이블이 32GB이고 max server memory (MB)
24GB로 구성되어 있다고 가정하십시오 . 테이블 데이터의 모든 32기가바이트은 한 번에 하나의 버퍼 페이지의 페이지로 읽을 수 있습니다 래치네트워크 패킷으로 포맷되어 유선을 통해 전송됩니다. 이것은 페이지 단위로 발생합니다. 300 개의 쿼리를 동시에 실행할 수 있으며 차단이 발생하지 않는다고 가정하면 각 쿼리의 데이터는 한 번에 한 페이지 씩 페이지 버퍼 공간으로 읽혀지고 클라이언트가 할 수있는 한 빨리 와이어에 연결됩니다 데이터를 요청하고 소비합니다. 각 페이지의 모든 데이터가 유선으로 전송되면 페이지가 래칭되지 않고 디스크의 다른 페이지로 매우 빠르게 대체됩니다.
예를 들어 여러 테이블에서 결과를 집계하는 것과 같이보다 복잡한 쿼리의 경우 페이지가 쿼리 프로세서에 필요한대로 정확하게 위와 같이 메모리로 가져옵니다. 쿼리 프로세서가 결과를 계산하기 위해 임시 작업 공간이 필요한 경우 쿼리 계획을 컴파일 할 때이를 미리 알고 SQLOS에 작업 공간 (메모리)을 요청합니다 . SQLOS는 어느 시점에서 ( 시간이 초과 되지 않는다고 가정 ) 쿼리 처리기에 해당 메모리를 부여하면이 시점에서 쿼리 처리가 다시 시작됩니다. 쿼리 프로세서가 SQLOS에 요청해야 할 메모리 용량을 잘못 추정 한 경우 "디스크 유출" 을 수행해야 할 수 있습니다.데이터가 중간 형식으로 tempdb에 임시로 쓰여지는 작업. tempdb에 작성된 페이지는 다른 페이지를 메모리로 읽을 수있는 공간을 만들기 위해 tempdb에 작성된 후에 래치 해제됩니다. 결국 쿼리 프로세스는 tempdb에 저장된 데이터로 돌아가서 래칭을 사용하여 버퍼링 된 페이지를 사용 가능한 것으로 표시된 페이지로 페이징합니다.
위 요약에서 매우 기술적 세부 사항이 많이 누락되었지만 SQL Server가 메모리에 넣을 수있는 것보다 더 많은 데이터를 처리하는 방법의 본질을 포착한다고 생각합니다.