Chỉ mục trợ giúp cho Truy vấn xấu trên bảng khá lớn (2m)


7

Tôi đang tìm kiếm một số trợ giúp xin vui lòng. Tôi có một truy vấn đang chạy trên một bảng khá lớn (2 triệu bản ghi).

Tôi đã cố gắng để làm cho các chỉ số hoạt động hiệu quả. Có một vài truy vấn khác đối với bảng này, nhưng đây là câu hỏi thường gặp nhất. Tôi thực sự đấu tranh để khiến nó thực thi trong vòng dưới 1 giây và thường thấy nó chạy trong 3 đến 5 giây bằng cách sử dụng profiler.

Nó có thể nhanh như có thể, nhưng tôi sẽ đánh giá cao một số đầu vào để xác nhận / từ chối điều đó.

Chỉ cần một lưu ý: Dev sẽ không thay đổi truy vấn hoặc lược đồ nào cả. Tối ưu hóa chỉ có thể được thực hiện trong cơ sở dữ liệu và không có thay đổi lược đồ.

Cái bàn:

CREATE TABLE [dbo].[Notifications](
[ntID] [int] IDENTITY(1,1) NOT FOR REPLICATION NOT NULL,
[NotificationID] [int] NOT NULL,
[NotificationType] [nvarchar](50) NOT NULL,
[UserName] [nvarchar](50) NULL,
[CreatedBy] [nvarchar](50) NULL,
[CreatedOn] [datetime] NULL,
[Status] [nvarchar](50) NOT NULL,
[Result] [nvarchar](50) NULL,
[Extension] [nvarchar](50) NULL,
[ShiftRate] [nvarchar](255) NULL,
[ResponseMinutes] [int] NULL,
[ResponseWindow] [datetime] NULL,
[caNotificationID] [int] NULL,
[AwardedBy] [nvarchar](50) NULL,
[AwardedOn] [datetime] NULL,
[CancelledBy] [nvarchar](50) NULL,
[CancelledOn] [datetime] NULL,
[CancelledReasonID] [int] NULL,
[CancelledReasonText] [nvarchar](255) NULL,
[AwardingDate] [datetime] NULL,
[ScheduledLaunchDate] [datetime] NULL,
[CustomMessage] [nvarchar](160) NULL,
[SystemName] [nvarchar](4000) NULL,
[AutoClose] [bit] NOT NULL,
 CONSTRAINT [PK_ESP_Notifications_ntID] PRIMARY KEY CLUSTERED 
(
    [ntID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[ESP_Notifications] ADD  DEFAULT ((0)) FOR [AutoClose]
GO

Ảnh chụp nhanh dữ liệu bảng:

ảnh chụp màn hình dữ liệu mẫu

Truy vấn:

Update Notifications 
  set Status = 'Awarding' OUTPUT deleted.* 
where ntID = (
    select top(1) ntID 
    from Notifications 
    where NotificationType = 'Shift' 
      and (Status = 'Done') 
      and ResponseWindow < '2019-02-04 10:40:03' 
    order by ntID)

Chỉ mục đã thử:

CREATE INDEX [IX_Notifications_Status_NotificationType_ResponseWindow_ntID] 
ON [dbo].[Notifications](
   [Status] ASC,[NotificationType] ASC,[ResponseWindow] DESC,[ntID] DESC
)

CREATE INDEX [IX_Notifications_Status_ScheduledLaunchDate_ntID] 
ON [dbo].[Notifications](
    [ScheduledLaunchDate] DESC,[Status] ASC,[ntID] ASC
)

CREATE INDEX [IX_Notifications_NotificationType_caNotificationID_NotificationID_ntID] 
ON [dbo].[Notifications](
   [NotificationType] DESC, [caNotificationID] DESC, [NotificationID] DESC, [ntID] DESC
);

NotificationType chứa 3 loại khác nhau, trong đó 70% là loại 'Shift' Trạng thái có 10 loại, nhưng các bản ghi 'Trong chuyến bay' chỉ khoảng 100 đến 200, được chia thành 4 Trạng thái

Cám ơn sự giúp đỡ của bạn.

Câu trả lời:


15

Nếu truy vấn con trong bản cập nhật đó luôn sử dụng hai giá trị vị ngữ đó, một chỉ mục được lọc sẽ giúp ích rất nhiều. Một cái gì đó như thế này (mà Erik Darling vui lòng cung cấp như một nhận xét):

CREATE INDEX IX_ntID_ResponseWindow_Includes ON dbo.Notifications (ntID, ResponseWindow) 
INCLUDE (NotificationType, Status) 
WHERE (Status = 'Done' AND NotificationType = 'Shift');

Điều này sẽ cho phép truy vấn con tìm nhóm ID có liên quan khớp StatusNotificationType(vì chúng là các hàng duy nhất trong chỉ mục) và tránh sắp xếp dữ liệu (vì nó đã được ntID đặt hàng làm cột hàng đầu trong chỉ mục).

Nó vẫn sẽ phải kiểm tra ResponseWindowgiá trị trên mỗi hàng. Trong trường hợp xấu nhất, nếu không có hàng nào đáp ứng yêu cầu ngày cho truy vấn (hoặc nếu trận đấu đầu tiên có ntID rất cao), hầu hết hoặc tất cả các chỉ mục sẽ được đọc. Điều này làm cho hiệu quả của phương pháp này bị hạn chế tùy thuộc vào phân phối dữ liệu.

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.