where条件中的SQL IN子句导致大数据的性能问题
下面的查询在我的数据库中运行良好,但在客户数据库中会产生巨大的性能问题。我知道我在where条件中使用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
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。