如何避免在存储过程中使用的 sql 查询中使用 IN 子句

Sar*_*nan 8 sql-server stored-procedures

除了在下面给定的 SP 中使用 IN 子句之外,还有没有更好的方法来编写 SQL。当我使用这个 IN 子句时,由于 User 和 Member 表中涉及大量或记录,我的性能下降。

CREATE PROCEDURE [dbo].[sp_MemberIdsFromUserIds] @dtUserIds UNIQUETABLE readonly
AS
  BEGIN
      SELECT userID,
             Memberid
      FROM   Member
             INNER JOIN USER
               ON UserMemberID = MemberiD
      WHERE  userID IN (SELECT UniqueId
                        FROM   @dtUserIds)
  END 
Run Code Online (Sandbox Code Playgroud)

请提出替代方案,因为我对写作 SP 没有完整的了解

HLG*_*GEM 5

Whereexists通常比IN快

SELECT userID,
             Memberid
      FROM   Member
             INNER JOIN [USER]
               ON UserMemberID = MemberiD
      WHERE  EXISTS  (SELECT *
                        FROM   @dtUserIds a where [user].userId = a.Uniqueid)
Run Code Online (Sandbox Code Playgroud)


Roi*_*ish 3

尝试这个选项,SQL Server 有一半的机会会表现不同......

CREATE PROCEDURE [dbo].[sp_MemberIdsFromUserIds] @dtUserIds UNIQUETABLE readonly
AS
BEGIN
    SELECT  userID,
        Memberid
    FROM  Member
    INNER JOIN USER
        ON UserMemberID = MemberiD
    INNER JOIN @dtUserIds
        ON UniqueId = userID
END
Run Code Online (Sandbox Code Playgroud)

如果这没有帮助,请发布所有 3 个表的结构
(user、memeber 和 @dtUserIds) - 包括索引和键。

祝你好运 :)