Toán tử đã sử dụng tempdb để làm đổ dữ liệu trong khi thực hiện với mức tràn 2


16

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 usedtempdb 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);

nhập mô tả hình ảnh ở đây

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;

nhập mô tả hình ảnh ở đây

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ập mô tả hình ảnh ở đâ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:

nhập mô tả hình ảnh ở đây

đâ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 ở đây

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:

nhập mô tả hình ảnh ở đây

nhập mô tả hình ảnh ở đây

Đâ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

Thời gian truy vấn giảm bao nhiêu?
có ảnh hưởng

Tôi không bao giờ có thể thực hiện một giải pháp cho phép tôi giữ các số liệu thống kê được cập nhật trên các bảng lớn như vậy. Giải pháp sẽ là phân vùng các bảng và sử dụng số liệu thống kê gia tăng, nhưng tôi không bao giờ đi xuống để thực hiện nó vì tôi đã rời khỏi nhà tuyển dụng đó. Một cái gì đó mà tôi muốn được thực hiện mặc dù.
Marcello Miorelli

Câu trả lời:


17

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 cấp 2.

Theo MS MS cũ này , số trong tràn tràn Tempdb biểu thị có bao nhiêu lượt đi được yêu cầu trên dữ liệu để sắp xếp dữ liệu. Vì vậy, Spill 1 có nghĩa là nó phải vượt qua 1 lần để sắp xếp dữ liệu và 2 có nghĩa là nó phải vượt qua 2 lần.

Trích dẫn từ blog:

Nếu một truy vấn liên quan đến một hoạt động sắp xếp tạo ra một lớp sự kiện Sắp xếp cảnh báo với giá trị mức tràn là 2, thì hiệu năng của truy vấn có thể bị ảnh hưởng vì cần phải truyền nhiều dữ liệu để sắp xếp dữ liệu. Trong ví dụ dưới đây, chúng ta thấy giá trị mức tràn là 1, có nghĩa là một lần vượt qua dữ liệu là đủ để hoàn thành việc sắp xếp.

Tại sao 70? Tôi đang sử dụng máy chủ sql 2014

Điều này là do mức độ tương thích của cơ sở dữ liệu trong hình KHÔNG phải là 120 (biểu thị mức độ tương thích của cơ sở dữ liệu 2014) vì nó không phải là 120 truy vấn sẽ được xử lý bằng mô hình ước lượng cardinality (CE) cũ được gọi là CardinalityEstimationModelVersion="70". Tôi chắc chắn rằng bạn biết rằng từ SQL Server 2014, chúng tôi có CE mới.

Làm thế nào để tôi thoát khỏi toán tử sắp xếp đó (nếu có thể)?

Lệnh riêng biệt bạn đang sử dụng gây ra thao tác sắp xếp. Dữ liệu đang được sắp xếp không vừa với bộ nhớ nên được đổ vào tempdb và khi điều này xảy ra, một cảnh báo sắp xếp với dấu chấm than màu vàng được đưa ra trong kế hoạch thực hiện. Sắp xếp cảnh báo không phải lúc nào cũng là một vấn đề.

Bạn có thể thấy trong kế hoạch thực hiện rằng số lượng hàng ước tính được sắp xếp là 1, nhưng 16.353 gặp phải trong thời gian chạy. Lượng bộ nhớ dành riêng cho sắp xếp dựa trên kích thước dự kiến (ước tính) của đầu vào và không thể tăng trong khi thực hiện (trong trường hợp này).

Cấp bộ nhớ nhỏ cho truy vấn (1632KB) cũng được chia sẻ giữa các toán tử tiêu thụ bộ nhớ thực thi đồng thời (sắp xếp và tham gia vòng lặp 'tối ưu hóa' ). Trong kế hoạch của bạn, điều đó có nghĩa là 33,33% (544KB) có sẵn để sắp xếp trong khi đọc các hàng (phần bộ nhớ đầu vào). Đây không đủ bộ nhớ để sắp xếp 16.353 hàng, vì vậy nó tràn sang tempdb . Một sự cố tràn một cấp là không đủ để hoàn thành việc sắp xếp, do đó, mức tràn thứ hai là cần thiết (xem phần tham khảo ở cuối để biết thêm chi tiết về các mức tràn).

Sắp xếp các thuộc tính

Sắp xếp các thuộc tính như được xem trong SQL Sentry Plan Explorer

Cập nhật số liệu thống kê có thể sẽ giúp với vấn đề ước tính cardinality. Bạn có thể đang gặp vấn đề chính tăng dần, đặc biệt là trên bàn tblBOrder. Một lựa chọn đơn giản từ bảng đó với ngày theo nghĩa đen từ câu hỏi của bạn có thể sẽ ước tính một hàng ngay bây giờ.

Tôi đã thấy tuổi thọ trang khá thấp, ngoài việc thêm nhiều 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 chặn cảnh báo này không?

PLE là dấu hiệu của lượng hoạt động I / O, nó có tăng không? Vì vậy, điều này xảy ra thường xuyên hoặc chỉ khi bạn chạy một số truy vấn nhất định hoặc điều này xảy ra chỉ hôm nay. Tránh phản ứng giật đầu gối, trước tiên chúng tôi cần đảm bảo rằng bạn thực sự đang phải đối mặt với áp lực bộ nhớ hoặc một số truy vấn giả mạo đang tạo ra quá nhiều I / O đang gây ra điều này. Dù sao bạn đã có bộ nhớ 97 G được gán cho SQL Server.

Để biết thêm thông tin về mức độ tràn và vấn đề chính tăng dần, xem:

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.