-3

インスタント検索にこのような状況がありますが、このクエリには NOT IN チェックが多くあります

ALTER PROC [dbo].[DPR_SP_GetEmployeeDetailsByKeyword]
@keyword varchar(10),
@hotelId int
AS
BEGIN
SELECT  EmployeeDetails.EmployeeId,EmployeeDetails.SageEmployeeId,EmployeeDetails.FirstName,EmployeeDetails.LastName
FROM    EmployeeDetails
WHERE   (EmployeeDetails.EmployeeId NOT IN (    SELECT  EmployeeWorksIn.EmployeeId
                                                FROM    EmployeeWorksIn
                                                WHERE   EmployeeWorksIn.HotelId=@hotelId
                                                )
AND
        EmployeeDetails.EmployeeId LIKE @keyword+'%')
        OR
        (EmployeeDetails.EmployeeId NOT IN (    SELECT  EmployeeWorksIn.EmployeeId
                                                FROM    EmployeeWorksIn
                                                WHERE   EmployeeWorksIn.HotelId=@hotelId
                                                )
        AND
OR 
        (EmployeeDetails.EmployeeId NOT IN (    SELECT  EmployeeWorksIn.EmployeeId
                                                FROM    EmployeeWorksIn
                                                WHERE   EmployeeWorksIn.HotelId=@hotelId
                                                )
        AND
        EmployeeDetails.DateOfBirth LIKE @keyword+'%')

このクエリを最適化するにはどうすればよいですか

ありがとう

4

1 に答える 1

1

これを次のように書き換えます。

alter proc dbo.DPR_SP_GetEmployeeDetailsByKeyword 
    @keyword varchar(10),
    @hotelId int
As
Select
    e.EmployeeId,
    e.SageEmployeeId,
    e.FirstName,
    e.LastName
From
    EmployeeDetails e
        Left Outer Join
    EmployeeWorksIn w
        on e.EmployeeId = w.EmployeeId and w.HotelId = @hotelId
Where
    w.EmployeeID Is Null And (
        e.EmployeeId Like @keyword+'%' Or
        e.Something Like @keyword+'%' Or -- appears to be missing from question
        e.DateOfBirth Like @keyword+'%'
    );

その後、速度を上げるためにインデックス作成を検討します。

于 2013-10-28T14:06:18.583 に答える