Tôi đang đấu tranh để giảm thiểu chi phí của hoạt động sắp xếp trên một kế hoạch truy vấn với Operator used
tempdb cảnh báoto spill data during execution with spill level 2
Tôi đã tìm thấy một số bài viết liên quan đến dữ liệu tràn trong khi thực hiện với mức tràn 1 , nhưng không phải cấp 2. Cấp 1 dường như được gây ra bởi số liệu thống kê lỗi thời , còn cấp 2 thì sao? Tôi không thể tìm thấy bất cứ điều gì liên quan đến level 2
.
Tôi thấy bài viết này rất thú vị liên quan đến Sắp xếp cảnh báo:
Không bao giờ bỏ qua cảnh báo sắp xếp trong SQL Server
Máy chủ Sql của tôi?
Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) 17 tháng 6 năm 2016 19:14:09 Bản quyền (c) Microsoft Corporation Enterprise Edition (64-bit) trên Windows NT 6.3 (Build 9600 :) (Hypervisor)
Phần cứng của tôi?
chạy truy vấn bên dưới để tìm harware:
- Thông tin phần cứng từ 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);
bộ nhớ hiện được phân bổ
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;
Khi tôi chạy truy vấn của mình với phạm vi một năm, tôi không nhận được bất kỳ cảnh báo nào, như trong hình dưới đây:
Nhưng khi tôi chạy nó chỉ trong phạm vi 1 ngày, tôi nhận được cảnh báo này on the sort operator
:
đây là truy vấn:
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)
kế hoạch truy vấn bằng cách sử dụng pastetheplan
Câu hỏi: 1) trong kế hoạch truy vấn tôi thấy điều này:
StatementOptmEarlyAbortReason="GoodEnoughPlanFound" CardinalityEstimationModelVersion="70"
Tại sao 70? Tôi đang sử dụng máy chủ sql 2014
2) làm cách nào để thoát khỏi toán tử sắp xếp đó (nếu có thể)?
3) Tôi đã thấy tuổi thọ trang khá thấp, ngoài việc thêm bộ nhớ vào máy chủ này, còn có điều gì khác tôi có thể xem để xem liệu tôi có thể ngăn cảnh báo này không?
chúc mừng
Cập nhật sau câu trả lời từ Shanky và Paul White
Tôi đã kiểm tra số liệu thống kê của mình theo kịch bản dưới đây và dường như tất cả đều chính xác và cập nhật.
đây là tất cả các chỉ mục và bảng được sử dụng trong truy vấn này.
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
đây là những gì tôi đã trả lại:
Đây là một kết quả một phần, nhưng tôi đã truy cập lại tất cả.
Để cập nhật số liệu thống kê tôi hiện có Ola Hallengren
Chỉ số tối ưu hóa công việc - dự kiến chạy mỗi tuần một lần - Chủ nhật
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'
Mặc dù các số liệu thống kê dường như được cập nhật Sau khi tôi chạy đoạn mã sau, tôi không còn cảnh báo nào nữa về toán tử sắp xếp.
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