请问,使用WHERE条件列表的SQL查询列表中可以包含的项目限制是什么
SELECT field1, field2, field3 from Table WHERE id IN ('val1', 'val2', 'val3', ... 'valN')
N的限制是什么?
答案 0 :(得分:2)
在IN子句中明确地在括号中包含大量值(用逗号分隔的数千个值)会消耗资源并返回错误8623或8632。要变通解决此问题,请将项目存储在IN中列出表,然后在IN子句中使用SELECT子查询。
错误8623:
查询处理器的内部资源用完了,无法 产生查询计划。这是罕见的事件,仅预期 极其复杂的查询或引用非常大的查询 表或分区的数量。请简化查询。如果你 认为您错误地收到了此消息,请与客户联系 支持服务以获取更多信息。
错误8632:
内部错误:已达到表达式服务限制。请 在查询中查找可能复杂的表达式,然后尝试 简化它们。
答案 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);
存在的位置查找的是记录的存在,而不是记录的内容,因此会限制读取,并且您也不会遇到重复的问题,这些重复的行会在没有数据的情况下“无处出现”完全符合您的期望。