【问题标题】:Querying 200k rows of data using IN statement in SQL Server在 SQL Server 中使用 IN 语句查询 200k 行数据
【发布时间】:2017-06-26 11:23:49
【问题描述】:

我正在努力使用 SQL 中的一个非常大的 IN 语句查询 200k 行数据。

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

服务器返回错误

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

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

【问题讨论】:

  • 通过不在IN 中列出 200k 值。您可以先将它们插入到表中并查询它们
  • 如何获取内容中的...?
  • MySQL 还是 SQL Server?它们是非常不同的产品。
  • 没有人说你需要修改表,但是你可以将这200k的值插入另一个表(或临时表)并查询它
  • 我不确定为什么这些规则会阻止您使用临时表。你可以使用变量吗?创建一个表变量。

标签: sql-server


【解决方案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)

【讨论】:

  • 我收到一条消息错误,其中显示“消息 156,级别 15,状态 1,第 3 行关键字‘来自’附近的语法不正确。”
  • 如果我只使用 select CreatedDate from ExchangeAccounts,它运行完美。
  • Ismael,我测试了代码,它工作正常。您运行的是什么版本的 SQL Server?
  • sql server management studio 2016.版本不同算吗?
  • @IsmaelBinAzman SQL 的语法依赖于服务器,而不是客户端。
猜你喜欢
  • 2017-01-12
  • 2011-02-14
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2011-10-21
  • 2011-08-27
  • 1970-01-01
相关资源
最近更新 更多