ฉันกำลังดิ้นรนเพื่อลดต้นทุนของการดำเนินการเรียงลำดับในแผนแบบสอบถามด้วยOperator used
tempdb คำเตือนto spill data during execution with spill level 2
ฉันพบโพสต์หลายรายการที่เกี่ยวข้องกับข้อมูลการรั่วไหลในระหว่างการดำเนินการกับการรั่วไหลระดับ 1แต่ไม่ใช่ระดับ 2 ดูเหมือนว่าระดับ 1 จะทำให้สถิติล้าสมัยแล้วระดับ 2 เป็นอย่างไร level 2
ฉันไม่สามารถหาอะไรที่เกี่ยวข้องกับ
ฉันพบบทความนี้น่าสนใจมากที่เกี่ยวข้องกับคำเตือนการเรียง:
อย่าเพิกเฉยต่อคำเตือนการเรียงลำดับใน SQL Server
เซิร์ฟเวอร์ SQL ของฉัน
Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) 17 มิถุนายน 2016 19:14:09 ลิขสิทธิ์ (c) Microsoft Corporation รุ่นองค์กรองค์กร (64 บิต) บน Windows NT 6.3 (รุ่น 9600:) (Hypervisor)
ฮาร์ดแวร์ของฉัน
เรียกใช้คิวรีด้านล่างเพื่อค้นหาฮาร์แวร์:
- ข้อมูลฮาร์ดแวร์จาก 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 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อยู่ในขณะนี้
งาน Optimize Index - กำหนดให้ทำงานสัปดาห์ละครั้ง - วันอาทิตย์
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