Sắp xếp các sự cố tràn sang tempdb nhưng các hàng ước tính bằng với các hàng thực tế


14

Trên SQL Server 2016 SP2 với bộ nhớ tối đa được đặt thành 25GB, chúng tôi có một truy vấn thực thi khoảng 80 lần trong một phút. Truy vấn tràn khoảng 4000 trang vào tempdb. Điều này gây ra rất nhiều IO trên đĩa tempdb.

Khi bạn xem kế hoạch truy vấn (truy vấn đơn giản) bạn sẽ thấy rằng số lượng hàng ước tính bằng với số lượng hàng thực tế nhưng vẫn xảy ra sự cố tràn. Vì vậy, số liệu thống kê lỗi thời không thể là nguyên nhân của vấn đề.

Tôi đã thực hiện một số thử nghiệm và theo dõi sự cố tràn đến Tempdb:

select id --uniqueidentifier
from SortProblem
where [status] ='A'
order by SequenceNumber asc
option (maxdop 1)

Nhưng nếu tôi chọn một cột khác, sẽ không xảy ra sự cố tràn:

select startdate --datetime
from SortProblem
where [status] ='A'
order by SequenceNumber asc 
option (maxdop 1)

Vì vậy, tôi đã cố gắng 'phóng to' kích thước của cột id:

select CONVERT(nvarchar(512),id)
from SortProblem
where [status] ='A'
order by SequenceNumber asc 
option (maxdop 1)

Sau đó cũng không xảy ra sự cố tràn.

Tại sao bộ định danh duy nhất tràn sang tempdb và cột datatime không? Khi tôi xóa khoảng 20000 bản ghi thì cũng không xảy ra hiện tượng tràn khi tôi chọn cột id.

Với đoạn script sau, bạn có thể tái tạo vấn đề:

CREATE TABLE SortProblem
  (
     id             UNIQUEIDENTIFIER,
     startdate      DATETIME,
     sequencenumber BIGINT,
     status         VARCHAR(50),
     PRIMARY KEY CLUSTERED(id)
  )

SET nocount ON;

WITH nums(num)
     AS (SELECT TOP 103000 ROW_NUMBER()
                             OVER (
                               ORDER BY 1/0)
         FROM   sys.all_objects o1,
                sys.all_objects o2)
INSERT INTO SortProblem
SELECT newid(),
       DATEADD(millisecond, num, GETDATE()),
       num,
       CASE
         WHEN num <= 100000 THEN 'A'
         WHEN num <= 101000 THEN 'B'
         WHEN num <= 102000 THEN 'C'
         WHEN num <= 103000 THEN 'D'
       END
FROM   nums

CREATE NONCLUSTERED INDEX [IX_Status]
  ON [dbo].[SortProblem]([status] ASC)
  INCLUDE ([sequencenumber]) 

Câu trả lời:


14

Kích hoạt cờ theo dõi 7470.

CỐ ĐỊNH: Sắp xếp toán tử tràn sang tempdb trong SQL Server 2012 hoặc SQL Server 2014 khi số lượng hàng và kích thước hàng ước tính là chính xác

Như tôi đã viết trong câu trả lời cho câu hỏi Kế hoạch truy vấn :

Cờ theo dõi này sửa chữa một giám sát trong tính toán. Nó khá an toàn để sử dụng, và theo tôi nên được bật theo mặc định. Thay đổi được bảo vệ bởi cờ theo dõi đơn giản để tránh những thay đổi kế hoạch không mong muốn.

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.