where条件中的SQL IN子句导致大数据的性能问题

where条件中的SQL IN子句导致大数据的性能问题,sql,sql-server-2008,sql-server-2012,query-performance,Sql,Sql Server 2008,Sql Server 2012,Query Performance,下面的查询在我的数据库中运行良好,但在客户数据库中会产生巨大的性能问题。我知道我在where条件中使用IN子句,这给了我这个问题。但我不知道如何解决这个问题 declare @AccountId int set @AccountId = 1200 declare @IsLinkedAccountsNotes bit set @IsLinkedAccountsNotes =1 declare @EventType varchar(100) set @EventType = '' SELECT

下面的查询在我的数据库中运行良好,但在客户数据库中会产生巨大的性能问题。我知道我在where条件中使用IN子句,这给了我这个问题。但我不知道如何解决这个问题

declare @AccountId int
set @AccountId =  1200
declare @IsLinkedAccountsNotes bit
set @IsLinkedAccountsNotes =1
declare @EventType varchar(100)
set @EventType = ''

SELECT
        u.loginName as InteractionLoginName,
        u.userName as InteractionUserName,
        e.*
    FROM
        lat.events e
        INNER JOIN dbo.MasterEvents me ON me.EventId = e.EventId    
        LEFT JOIN dbo.Users u ON e.UserId = u.ID 
    WHERE
        (me.AccountId = @AccountId OR
        (@IsLinkedAccountsNotes = 1 AND me.AccountId IN (SELECT DISTINCT [number] FROM dbo.Linking_LinkedAccounts WHERE linked_number = @AccountId) AND e.EventType = 'AccountNoteAdded'))
我知道where子句中的第二个条件导致了问题。我在不同的帖子中看到,使用连接可以解决这个问题。但我不知道在哪里条件下如何使用连接。 或者有没有其他方法可以达到同样的效果


请帮忙。

可以试试类似的方法

JOIN (SELECT DISTINCT [number] FROM dbo.Linking_LinkedAccounts WHERE linked_number = @AccountId) lla ON lla.number = me.AccountId
在where条件中左连接并过滤掉空值


存在而不是在中。

您的问题可能是这是一个全面的查询。您可以尝试按如下方式将案例拆分

SELECT u.loginName AS InteractionLoginName,
       u.userName  AS InteractionUserName,
       e.*
FROM   lat.events e
       INNER JOIN dbo.MasterEvents me
               ON me.EventId = e.EventId
       LEFT JOIN dbo.Users u
              ON e.UserId = u.ID
WHERE  me.AccountId = @AccountId
UNION ALL
SELECT u.loginName AS InteractionLoginName,
       u.userName  AS InteractionUserName,
       e.*
FROM   lat.events e
       INNER JOIN dbo.MasterEvents me
               ON me.EventId = e.EventId
       LEFT JOIN dbo.Users u
              ON e.UserId = u.ID
WHERE  @IsLinkedAccountsNotes = 1
       AND e.EventType = 'AccountNoteAdded'
       AND me.AccountId IN (SELECT [number]
                            FROM   dbo.Linking_LinkedAccounts
                            WHERE  linked_number = @AccountId
                                   AND [number] <> @AccountId) 

请提供带有一些数据的表结构。当然,导致两个完全不同的选择标准的OR条件会对性能产生很大影响。子查询中的DISTINCT是多余的,可能会迫使DBMS执行额外的不必要的工作。由于数据访问取决于变量@IsLinkedAccountsNotes,如果@IsLinkedAccountsNotes=1,则最好的解决方案可能是两个不同的查询开始选择。。。我的帐户ID在哪里。。。结束否则选择。。。其中me.AccountId=@AccountId-END。