경고 Operator used
tempdb로 쿼리 계획에서 정렬 작업 비용을 최소화하기 위해 고심하고 있습니다.to spill data during execution with spill level 2
필자는 레벨 1 이 아닌 유출 레벨 1로 실행하는 동안 유출 데이터 와 관련된 여러 게시물을 발견했습니다 . 레벨 1은 오래된 통계로 인해 발생하는 것 같습니다 . 관련 항목을 찾을 수 없습니다 level 2
.
이 기사는 정렬 경고와 관련하여 매우 흥미 롭습니다.
내 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)
질문 : 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