【问题标题】:Limit to number of Items in list for WHERE clause SQL query限制 WHERE 子句 SQL 查询的列表中的项目数
【发布时间】:2019-03-15 10:41:13
【问题描述】:

请问,使用 WHERE 条件列表的 SQL 查询列表中的项目限制是多少

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

N 的上限是多少?

【问题讨论】:

  • ANSI SQL 没有指定限制。 SQL Server 可能有一个。
  • @AustineLyke 。 . .在 SQL Server 中,可能比您可以键入的更多。我认为它仅限于查询字符串的长度,超过 1 GB。 (请注意,某些数据库确实有这样的限制。)
  • @GordonLinoff:因为 IN 在内部扩展为一系列 OR 子句,您通常会在达到最大文本大小之前达到查询处理器将接受的解析树的限制的查询。
  • 对于参数化查询,每个命令的参数限制为 2100 个。

标签: sql sql-server


【解决方案1】:

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

错误 8623:

查询处理器用尽了内部资源,无法 生成查询计划。这是一个罕见的事件,只预计 极其复杂的查询或引用非常大的查询 表或分区的数量。请简化查询。如果你 相信您错误地收到了此消息,请联系客户 支持服务了解更多信息。

错误 8632:

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

microsoft docs

【讨论】:

    【解决方案2】:

    将 IN 用于一个或两个以上的值可能会耗费大量资源。正如 Zaynul 所说,连接效率更高。

    从那里提高速度的下一步是使用WHERE EXISTS 功能。优点是有据可查的,如果你有一个快速的谷歌,你会发现很多例子以及它更快的原因。这里就不重复大家的cmets了。

    作为一个例子,看看这个快速代码:

    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);
    

    where exists 查找记录的存在而不是记录的内容,因此限制了读取,并且您也不会遇到重复行的问题,当数据不存在时,这些重复行可能“不知从何而来”完全符合您的预期。

    【讨论】:

    • INEXISTS 在 SQL Server 中获得完全相同的执行计划(与 NOT INNOT EXISTS 不同)。以下的执行计划将是相同的。 SELECT S.ID , S.SomeText FROM @SourceTable S WHERE S.ID in (SELECT A.ID FROM @AllowedTable A);
    猜你喜欢
    • 2021-10-20
    • 2019-08-03
    • 2011-12-03
    • 2013-07-14
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    相关资源
    最近更新 更多