限制WHERE子句SQL查询列表中的项目数

时间:2019-03-15 10:41:14

标签: sql sql-server

请问,使用WHERE条件列表的SQL查询列表中可以包含的项目限制是什么

SELECT field1, field2, field3 from Table WHERE id IN ('val1', 'val2', 'val3', ... 'valN')

N的限制是什么?

2 个答案:

答案 0 :(得分:2)

在IN子句中明确地在括号中包含大量值(用逗号分隔的数千个值)会消耗资源并返回错误8623或8632。要变通解决此问题,请将项目存储在IN中列出表,然后在IN子句中使用SELECT子查询。

  

错误8623:

     

查询处理器的内部资源用完了,无法   产生查询计划。这是罕见的事件,仅预期   极其复杂的查询或引用非常大的查询   表或分区的数量。请简化查询。如果你   认为您错误地收到了此消息,请与客户联系   支持服务以获取更多信息。

     

错误8632:

     

内部错误:已达到表达式服务限制。请   在查询中查找可能复杂的表达式,然后尝试   简化它们。

microsoft docs

答案 1 :(得分:1)

使用IN来获取大于一或两个值的资源可能非常昂贵。正如Zaynul所说,加入效率更高。

从那里提高速度的下一步是使用WHERE EXISTS功能。优点已得到很好的证明,如果您快速浏览一下Google,就会发现很多示例及其更快的原因。在这里,我将不再重复其他人的评论。

作为示例,请看以下快速代码:

DECLARE @SourceTable AS TABLE (ID INT NOT NULL, SomeText NVARCHAR(255));

DECLARE @AllowedTable AS TABLE (ID INT NOT NULL);

INSERT INTO @SourceTable
VALUES (1, 'Apples')
,      (2, 'Oranges')
,      (3, 'Bananas')
,      (4, 'Pears');

INSERT INTO @AllowedTable (ID)
VALUES (1)
,      (3);

SELECT  S.ID
,       S.SomeText
  FROM  @SourceTable S
 WHERE  EXISTS (SELECT  1 FROM  @AllowedTable A WHERE   A.ID = S.ID);

存在的位置查找的是记录的存在,而不是记录的内容,因此会限制读取,并且您也不会遇到重复的问题,这些重复的行会在没有数据的情况下“无处出现”完全符合您的期望。