使用SQL Server中的IN语句查询200k行数据

时间:2017-02-08 17:37:18

标签: sql-server

我很难在SQL中使用非常大的IN语句查询200k行数据。

select CreatedDate 
from ExchangeAccounts 
where SamAccountName in ('abc','def','ghi',....., until 200k)

服务器返回错误

  

查询处理器耗尽了内部资源,无法生成查询计划。这是一种罕见的事件,仅适用于引用大量表或分区的极其复杂的查询或查询。请简化查询。如果您认为自己错误地收到了此消息,请与客户支持服务部​​门联系以获取更多信息。

我该如何解决这个问题?提前致谢

1 个答案:

答案 0 :(得分:1)

解决此问题的最佳方法是首先将所有200,000个字符串作为行放入表中。与使用IN子句相比,SQL Server可以更有效地搜索第二个表。此外,由于IN子句的长度,您遇到了限制。

如果你不能将200,000个字符串作为一个包含200,000行的表来源,那么这个函数可以提供帮助 - 它将从逗号分隔的列表中生成一个表:

CREATE function [dbo].[uParseCSV2Rows](
  @csv varchar(MAX)
)  
returns @table table(Indexkey int         identity(1, 1) primary key,
                     xValue   varchar(200))
as  
BEGIN
  declare @pos int
  select @csv = nullif(ltrim(rtrim(@csv)), '') + ','
  while 1 = 1 and @csv is not null
  begin
    select @pos = charindex(',', @csv)
    if @pos <= 0 break

    insert @table(xValue)
    select left(@csv, @pos - 1)

    select @csv = substring(@csv, @pos+1, len(@csv))
  end
  return
END

然后,您可以这样搜索:

select CreatedDate 
from ExchangeAccounts a
where exists (select 1 from dbo.uParseCSV2Rows('abc,def,ghi,...,200k') i where i.xValue = a.SamAccountName)