Informix:IN 子句中的项目数量限制?

Posted

技术标签:

【中文标题】Informix:IN 子句中的项目数量限制?【英文标题】:Informix: Limitation on Number of Items in IN Clause? 【发布时间】:2011-06-13 19:59:19 【问题描述】:

在 Informix 查询中可以进入 IN 子句的项目数量是否有限制(如 Oracle 中的 1000 项目限制)?

我们有一个“大”(可能是 2000 年)项目编号列表,正在通过网络服务进行选择,因此除了项目列表之外实际上没有任何可用的上下文。

【问题讨论】:

我不知道“IN”语句的值数量有限制!.. 我有一个应用程序执行 SELECT * FROM table_1 WHERE col_1 IN (SELECT col_2 FROM table_2 ).. table_2 有超过 500K 行具有唯一 col_2 值,因此“IN”正在评估超过 500K 不同的值!..它有效!..另外,为什么要将 1,000 的值硬编码到“IN”中声明?.. 'IN (1,2,3,4...)' 翻译成 'OR x = 1 OR x = 2... ??? @Frank:在以逗号分隔的值列表中写入时,IN 语句中值的数量限制是 SQL 语句的长度。如果处理正整数(开销字符最少),则可以有 10 个单位数(20 个字节)、90 个两位数(270 个字节)、900 个三位数(3,600 个字节)、9000 个四位数(45,000 字节),以及大约 2750 个五位数字,为 SELECT 的其余部分留出一点空间,用于列表中大约 12,750 个不同的整数值。如果您使用占位符,您可以获得大约 32,000 个值。 @Frank:在 SELECT ... WHERE x IN(SELECT ...) 构造中,您不会在 SELECT 语句中创建列表,并且没有具体的数量上限条目。但是,优化器可能会尝试将 IN 子查询视为连接条件。 @Jonathan:好的,这是今天学到的新东西,虽然我会尝试找到一种方法来避免手动将一长串值输入到“IN”语句中。所以一个“IN” ' 子查询相当于一个 JOIN?.. 我认为它翻译成 'OR, OR, OR...' 对于类似的相关问题,请参阅:***.com/questions/6338516/… @Frank:如果您认为 x IN (y) 等效于与包含 y 值的单列表的联接,您将意识到“多列表”表中的行(如果 s) 与其中一行匹配,或者 '(x = y1 OR x = y2 OR ... x = yN)',它将被连接。我以前没有这样想过,但我相信它是准确的。 【参考方案1】:

上限由创建 IN 列表所占用的空间和语句的 64 KiB 限制强加。您可以通常在句法级别上得到几千个较小的(6-7 位)整数而没有太大问题。

但是,您可能会发现性能不如创建一个临时表,将数千个值插入其中,然后编写主查询以连接该临时表。

【讨论】:

谢谢 - 我已经多次看到这一点。但是,我还没有看到创建和填充表的示例。只用蛮力?如果是这样,创建加上 2000 次插入似乎至少与单个查询一样低效。 几乎所有拥有 2000 项列表的东西都会变得有点笨拙,无论是 IN 子句还是一个插入语句的连续执行 2000 次。您从哪里收集 2000 个值?如果有一个 SELECT 语句来生成列表,那么运行 SELECT ... INTO TEMP WhatEver 会加载列表。如果某些糟糕的草皮必须输入 2000 个值,那么您在输入时不会注意到插入的开销。在输入最终值后,您可能(或可能不会)注意到性能优势。与以往一样,YMMV 和测量是关键(无日志也是如此)。 如果列表在磁盘上的文件中,请考虑是否有 EXTERNAL 表可用和一个合理的选项 - 这取决于您拥有的 IDS 版本。 不幸的是,该列表只是作为参数传递给 Web 服务。 如果列表作为参数传递,有一种方法可以将该列表加载到临时表或外部表中,然后对该列表执行“IN”子查询!

以上是关于Informix:IN 子句中的项目数量限制?的主要内容,如果未能解决你的问题,请参考以下文章

MongoDB 的 $in 子句是不是有参数数量的最大限制

MongoDB 的 $in 子句是不是有参数数量的最大限制

ORDER BY 子句“IN()”中指定的值,但在泛型 SQL 和 Informix 中

如何在 IN 子句 sql informix 中使用参数

“In”子句可以处理的项目的最大限制

IN子句中的Spark sql限制