&引用;在;Sql Server中的子句限制

&引用;在;Sql Server中的子句限制,sql,sql-server,Sql,Sql Server,有人知道in子句的表达式列表(用于测试是否匹配)中可以包含的值的数量限制吗?根据您使用的数据库引擎,指令的长度可能有限制 SQL Server有一个很大的限制: 因此,对于大型IN子句,最好创建一个临时表,插入值并进行连接。它的工作速度也更快 这是有限制的,但您可以将值拆分为单独的in()块 在2008年使用表值参数,或使用此处描述的某种方法 是的,有限制,但是: 在in子句中包含大量的值(数千个)会消耗资源并返回错误8623或8632。要解决此问题,请将in列表中的项存储在表中 详细查看这些

有人知道in子句的表达式列表(用于测试是否匹配)中可以包含的值的数量限制吗?

根据您使用的数据库引擎,指令的长度可能有限制

SQL Server有一个很大的限制:

因此,对于大型IN子句,最好创建一个临时表,插入值并进行连接。它的工作速度也更快

这是有限制的,但您可以将值拆分为单独的in()块

在2008年使用表值参数,或使用此处描述的某种方法


是的,有限制,但是:

在in子句中包含大量的值(数千个)会消耗资源并返回错误8623或8632。要解决此问题,请将in列表中的项存储在表中

详细查看这些错误,我们发现这一限制并不特定于中的
,但通常适用于查询复杂性:

错误8623:

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

错误8632:

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


它不是特定的,但与超出内存限制的查询计划生成器相关。我可以确认,有几千个查询经常出错,但可以通过先将值插入表中并将查询重新表述为

select * from b where z in (select z from c) 

其中,in子句中所需的值在表c中。我们成功地将其用于包含100万个值的in子句。

这取决于您执行查询的方式(JDBC、Hibernate、某种SQL-GUI)以及使用文本值而不是子查询时(其中X在(1、2、3…)
),您还可能会遇到以下错误:

此RPC请求中提供的参数太多。最大值为2100


因此,在这些情况下,限制将为2100(或者在存在其他参数的情况下甚至更小)。

您永远不应该编写接近限制的代码,因为使用in(aa,a2,…,an)会随着n变大而变得非常低效——您应该尽可能通过更好的机制控制查询选择,这只是一个面试问题吗。。。因为我不认为在现实世界中,您会遇到任何查找匹配组接近大小的情况。是否可能获得运行此查询所需时间的大致数字?对于PostgreSQL数据库v9.6.16?
select * from b where z in (select z from c)