我很难在SQL中使用非常大的IN语句查询200k行数据。
select CreatedDate
from ExchangeAccounts
where SamAccountName in ('abc','def','ghi',....., until 200k)
服务器返回错误
查询处理器耗尽了内部资源,无法生成查询计划。这是一种罕见的事件,仅适用于引用大量表或分区的极其复杂的查询或查询。请简化查询。如果您认为自己错误地收到了此消息,请与客户支持服务部门联系以获取更多信息。
我该如何解决这个问题?提前致谢
答案 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)