내가 가진 4의 vCPU VM에서 Microsoft SQL 서버 2016 SP2 - CU6 (13.0.5292.0)를 실행 해요 max degree of parallelism
로 설정 2
하고 cost threshold for parallelism
로 설정 50
.
아침에 SELECT TOP 100 쿼리에 대한 예상 실행 계획 을 표시하려고 할 때 대기 시간이 길어지고 예상 계획을 렌더링하는 데 5 분-7 분 범위의 시간이 소요됩니다. 다시 한 번, 이것은 실제 쿼리 실행이 아니라 예상 실행 계획 을 표시하는 프로세스 일뿐 입니다.
sp_WhoIsActive
PAGEIOLATCH_SH
대기 또는 LATCH_EX [ACCESS_METHODS_DATASET_PARENT]
대기 를 표시 하고 작업 중에 Paul Randal의 WaitingTasks.sql 스크립트를 실행하면 대기자를CXPACKET
표시하는 작업자 스레드와 함께 대기를 표시합니다 PAGEIOLATCH_SH
.
* 자원 설명 필드 = exchangeEvent id=Port5f6069e600 WaitType=e_waitPortOpen waiterType=Coordinator nodeId=1 tid=0 ownerActivity=notYetOpened waiterActivity=waitForAllOwnersToOpen
작업자 스레드는 전체 stats
테이블을 메모리로 가져 오는 것으로 보입니다 (Paul Randal의 쿼리 지점에서 표시되는 후속 페이지 번호 및 해당 페이지 번호는 stats
테이블의 클러스터 된 키로 다시 표시됨). 일단 계획이 돌아 오면, 기본적으로 stats
여러 레코드 만 남은 캐시에서 대부분의 테이블 삭제 를 본 후에도 기본적으로 즉각적인 순간입니다 (유사한 쿼리에서 작업을 찾기 위해 풀려 났다고 가정).
쿼리가 실제로 SCAN 연산자를 사용하는 계획으로 실행 된 경우이 초기 동작이 예상되지만 위의 계획에 표시된 것처럼 SEEK 연산자에만 도달하도록 실행 계획을 평가할 때 왜 그렇게합니까? 여기서 성능 향상을 위해 근무 시간 전에이 명령문을 실행하는 것 외에 데이터를 적절히 캐시 할 수있는 방법은 무엇입니까? 커버링 인덱스 쌍이 도움이 될 것이라고 가정하지만 실제로 동작의 변경을 보장합니까? 여기에서는 일부 스토리지 및 유지 관리 기간 제한 내에서 작업해야하며 쿼리 자체는 공급 업체 솔루션에서 생성 되므로이 시점에서 다른 제안 (더 나은 인덱싱 제외)을 환영합니다.