Sql-Server
將列與值列表匹配的性能緩慢
我製作了一個儲存過程來獲得與特定學生和目標相匹配的所有結果。
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 和約@objectives
100 個 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
,但這是由於某些優化器的盲目性。