Sql-Server

將列與值列表匹配的性能緩慢

  • January 14, 2019

我製作了一個儲存過程來獲得與特定學生和目標相匹配的所有結果。

CREATE PROCEDURE [dbo].[GetResults] @students [IdList] READONLY, @objectives [IdList] READONLY
AS
SELECT Id, UserId, ObjectiveId, DateUploaded, TrafficLight
FROM [Results]
WHERE
 [UserId] IN (SELECT [Id] FROM @students)
 AND [ObjectiveId] IN (SELECT [Id] FROM @objectives)
 AND [TrafficLight] IS NOT NULL
ORDER BY [UserId] ASC, [ObjectiveId] ASC, [DateUploaded] DESC

它使用使用者定義的表類型來傳遞學生和目標數組:

CREATE TYPE [dbo].[IdList] AS TABLE(
   [Id] [int] NULL
)

通常@students包含約 30 個 ID 和約@objectives100 個 ID。該Results表有大約 500,000 行和一個非聚集索引UserId, ObjectiveId, TrafficLight

目前,搜尋 500,000 行需要很長時間(最多 5 秒)。我是儲存過程的新手,我認為我一定做錯了什麼。如何提高性能?

基於ORDER BY您只關心非空紅綠燈的事實,我會考慮:

...ON dbo.Results(UserId, ObjectiveId, DateUploaded DESC, TrafficLight)

甚至在該索引上添加過濾器:

...WHERE TrafficLight IS NOT NULL

過濾器是否有意義取決於表中 NULL 與 NOT NULL 的百分比,以及與未過濾的查詢相比,您執行此精確查詢的頻率。在索引中可能不直覺TrafficLight,但這是由於某些優化器的盲目性。

引用自:https://dba.stackexchange.com/questions/227036