유출 레벨 2로 실행하는 동안 운영자가 tempdb를 사용하여 데이터를 유출


17

경고 Operator usedtempdb로 쿼리 계획에서 정렬 작업 비용을 최소화하기 위해 고심하고 있습니다.to spill data during execution with spill level 2

필자는 레벨 1 이 아닌 유출 레벨 1로 실행하는 동안 유출 데이터 와 관련된 여러 게시물을 발견했습니다 . 레벨 1은 오래된 통계로 인해 발생하는 것 같습니다 . 관련 항목을 찾을 수 없습니다 level 2.

이 기사는 정렬 경고와 관련하여 매우 흥미 롭습니다.

SQL Server에서 정렬 경고를 무시하지 마십시오

내 SQL Server?

Microsoft SQL Server 2014 (SP2) (KB3171021)-12.0.5000.0 (X64) 2016 년 6 월 17 일 19:14:09 저작권 (c) Windows NT 6.3 (빌드 9600 :)의 Microsoft Corporation Enterprise Edition (64 비트) (하이퍼 바이저)

내 하드웨어?

하웨어를 찾기 위해 아래 쿼리를 실행하십시오.

-SQL Server 2012의 하드웨어 정보

SELECT cpu_count AS [Logical CPU Count], hyperthread_ratio AS [Hyperthread Ratio],
cpu_count/hyperthread_ratio AS [Physical CPU Count], 
physical_memory_kb/1024 AS [Physical Memory (MB)], affinity_type_desc, 
virtual_machine_type_desc, sqlserver_start_time
FROM sys.dm_os_sys_info WITH (NOLOCK) OPTION (RECOMPILE);

여기에 이미지 설명을 입력하십시오

현재 할당 된 메모리

SELECT
(physical_memory_in_use_kb/1024) AS Memory_usedby_Sqlserver_MB,
(locked_page_allocations_kb/1024) AS Locked_pages_used_Sqlserver_MB,
(total_virtual_address_space_kb/1024) AS Total_VAS_in_MB,
process_physical_memory_low,
process_virtual_memory_low
FROM sys.dm_os_process_memory;

여기에 이미지 설명을 입력하십시오

1 년 범위로 쿼리를 실행할 때 아래 그림에 따라 경고가 표시되지 않습니다.

여기에 이미지 설명을 입력하십시오

그러나 하루 동안 만 실행하면이 경고가 표시됩니다 on the sort operator.

여기에 이미지 설명을 입력하십시오

이것은 쿼리입니다.

    DECLARE @FromDate SMALLDATETIME = '19-OCT-2016 11:00'
    DECLARE @ToDate   SMALLDATETIME = '20-OCT-2016 12:00'




    SELECT      DISTINCT
                a.strAccountCode ,
                a.strAddressLine6 ,
                a.strPostalCode ,
                CASE    WHEN a.strCountryCode IN ('91','92') THEN 'GB-Int'
                        ELSE a.strCountryCode
                        END AS [strCountryCode]
    FROM        Bocss2.dbo.tblBAccountParticipant AS ap
    INNER JOIN  Bocss2.dbo.tblBAccountParticipantAddress AS apa ON ap.lngParticipantID = apa.lngParticipantID
                                                                AND apa.sintAddressTypeID = 2
    INNER JOIN  Bocss2.dbo.tblBAccountHolder AS ah ON ap.lngParticipantID = ah.lngParticipantID
    INNER JOIN  Bocss2.dbo.tblBAddress AS a ON apa.lngAddressID = a.lngAddressID
                                            AND a.blnIsCurrent = 1
    INNER JOIN  Bocss2.dbo.tblBOrder AS o ON ap.lngParticipantID = o.lngAccountParticipantID
                                        AND o.sdtmOrdCreated >= @FromDate
                                        AND o.sdtmOrdCreated < @ToDate

OPTION(RECOMPILE)

쿼리 계획은 여기

pastetheplan을 사용한 쿼리 계획

질문 : 1) 쿼리 계획에서 다음을 볼 수 있습니다.

StatementOptmEarlyAbortReason="GoodEnoughPlanFound" CardinalityEstimationModelVersion="70" 

왜 70? SQL Server 2014를 사용하고 있습니다.

2) 해당 정렬 연산자를 제거하려면 어떻게해야합니까?

3)이 서버에 더 많은 메모리를 추가하는 것 외에도 페이지 수명이 매우 짧습니다.이 경고를 막을 수 있는지 확인할 수있는 다른 것이 있습니까?

건배

Shanky와 Paul White의 답변 후 업데이트

아래 스크립트에 따라 통계를 확인했으며 모두 올바르게 업데이트 된 것으로 보입니다.

이들은이 쿼리에 사용 된 모든 인덱스와 테이블입니다.

DBCC SHOW_STATISTICS ('dbo.tblBAddress','IDXF_tblBAddress_lngAddressID__INC')
GO
DBCC SHOW_STATISTICS  ('dbo.tblBOrder','IX_tblBOrder_sdtmOrdCreated_INCL')
GO
DBCC SHOW_STATISTICS ('dbo.tblBAccountHolder','PK_tblAccountHolder')
GO
DBCC SHOW_STATISTICS ('dbo.tblBAccountParticipant','PK_tblBAccountParticipants')
GO
DBCC SHOW_STATISTICS ('dbo.tblBAccountParticipantAddress','IDXF_tblBAccountParticipantAddress_lngParticipantID')
GO

이것이 내가 돌려 준 것입니다 :

여기에 이미지 설명을 입력하십시오

여기에 이미지 설명을 입력하십시오

이것은 부분적인 결과이지만 모두 다시 방문했습니다.

통계 업데이트를 위해 현재 Ola Hallengren이 있습니다.

인덱스 최적화 작업-일주일에 한 번 실행-일요일

EXECUTE [dbo].[IndexOptimize] 
@Databases = 'USER_DATABASES,-%Archive', 
@Indexes = 'ALL_INDEXES' , 
@FragmentationLow = NULL,
@FragmentationMedium = NULL,
@FragmentationHigh = NULL,
@PageCountLevel=1000,
@StatisticsSample =100
,@UpdateStatistics = 'Index', 
@OnlyModifiedStatistics = 'Y',
@TimeLimit=10800, 
@LogToTable = 'Y'

통계가 업데이트되는 것처럼 보이지만 다음 스크립트를 실행 한 후 정렬 연산자에 대한 경고가 더 이상 표시되지 않습니다.

UPDATE STATISTICS [Bocss2].[dbo].[tblBOrder]  WITH FULLSCAN
--1 hour  04 min 14 sec

UPDATE STATISTICS [Bocss2].[dbo].tblBAddress  WITH FULLSCAN
-- 45 min 29 sec

UPDATE STATISTICS  [Bocss2].[dbo].tblBAccountHolder WITH FULLSCAN
-- 26 SEC

UPDATE STATISTICS  [Bocss2].[dbo].tblBAccountParticipant WITH FULLSCAN
-- 4 min

UPDATE STATISTICS  [Bocss2].[dbo].tblBAccountParticipantAddress WITH FULLSCAN
-- 7 min 3 sec

쿼리 시간이 얼마나 단축 되었습니까?
유입 유입

그런 큰 테이블에서 통계를 업데이트 할 수있는 솔루션을 구현할 수 없었습니다. 해결책은 테이블을 분할하고 incrementalao 통계를 사용하는 것이지만, 그 고용주를 떠나서 구현하지 않았습니다. 그래도 구현하고 싶었던 것.
Marcello Miorelli

답변:


17

레벨 2는 어떻습니까? 레벨 2와 관련된 것을 찾을 수 없습니다.

이 오래된 MS 문서 데이터를 정렬하는 데이터에 필요한 얼마나 많은 패스 Tempdb를 유출 의미의 숫자. 따라서 유출 1은 데이터를 정렬하기 위해 1 회 통과해야하고 2는 2 회 통과해야 함을 의미합니다.

블로그에서 인용 :

정렬 작업이 포함 된 쿼리가 스필 수준 값이 2 인 정렬 경고 이벤트 클래스를 생성하는 경우 데이터를 여러 번 전달해야 데이터를 정렬해야하므로 쿼리 성능에 영향을 줄 수 있습니다. 아래 예제에서 스필 수준 값 1을 볼 수 있습니다. 즉, 데이터를 한 번 통과하면 정렬을 완료하기에 충분합니다.

왜 70? SQL Server 2014를 사용하고 있습니다.

이는 그림에서 데이터베이스의 호환성 수준이 120이 아니기 때문에 (2014 데이터베이스의 호환성 수준을 나타냄) 120이 아니기 때문에 쿼리라고하는 기존 카디널리티 추정 (CE) 모델을 사용하여 쿼리가 처리되기 때문입니다 CardinalityEstimationModelVersion="70". SQL Server 2014에서 새로운 CE가 제공된다는 것을 알고 있습니다.

해당 정렬 연산자를 제거하려면 어떻게해야합니까 (가능한 경우)?

사용중인 구별 명령으로 정렬 작업이 발생했습니다. 정렬중인 데이터는 메모리에 맞지 않으므로 tempdb에 쏟아지며이 경우 노란색 느낌표가있는 정렬 경고가 실행 계획에 제공됩니다. 정렬 경고가 항상 문제가되는 것은 아닙니다.

실행 계획에서 정렬 될 예상 행 수가 1이지만 런타임시 16,353이 발생 함을 알 수 있습니다. 정렬을 위해 예약 된 메모리의 양은 입력 의 예상 (추정 된) 크기를 기반으로하며 실행 (이 경우) 동안 증가 할 수 없습니다.

쿼리에 대한 작은 메모리 부여 (1632KB)는 동시에 실행되는 메모리 소비 연산자 (정렬 및 '최적화 된' 루프 조인) 간에 공유됩니다 . 계획에서 이는 행을 읽는 동안 정렬에 33.33 % (544KB)를 사용할 수 있음을 의미합니다 (입력 메모리 비율). 이것은 16,353 행을 정렬하기에 충분한 메모리가 아니므로 tempdb에 유출됩니다 . 단일 레벨 유출은 분류를 완료하기에 충분하지 않으므로 두 번째 레벨의 유출이 필요합니다 (유출 레벨에 대한 자세한 내용은 끝에있는 참조를 참조하십시오).

속성 정렬

SQL Sentry Plan Explorer에 표시된대로 속성 정렬

통계를 업데이트하면 카디널리티 추정 문제에 도움이 될 수 있습니다. 특히 table에서 오름차순 키 문제가 발생했을 수 있습니다 tblBOrder. 질문의 문자 날짜가있는 표에서 간단한 선택을하면 현재 한 행을 예상 할 수 있습니다.

이 서버에 더 많은 메모리를 추가하는 것 외에도 페이지 수명이 매우 짧습니다.이 경고를 막을 수 있는지 확인할 수있는 다른 것이 있습니까?

PLE은 I / O 활동량을 나타냅니다. 따라서 이것은 종종 또는 특정 쿼리를 실행하거나 오늘 발생한 경우에만 발생합니다. 무릎 저크 반응을 피하십시오. 먼저 메모리 부담이나 너무 많은 I / O를 생성하는 악의적 인 쿼리 가이 문제를 일으키는 지 확인해야합니다. 어쨌든 이미 97 G 메모리가 SQL Server에 할당되어 있습니다.

유출 수준 및 오름차순 주요 문제에 대한 자세한 내용은 다음을 참조하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.