6

Oracle IN 子句对静态数据的限制为 1000,但它接受来自子查询的无限数据。为什么?

4

3 回答 3

8

这是对任何表达式列表的限制:

以逗号分隔的表达式列表最多可以包含 1000 个表达式。

为什么是1000?据推测,实现需要某种限制,这似乎绰绰有余。很可能,或者肯定可能已经在几十年前设置了这个限制,限制的性能原因也是如此,特别IN是在这种情况下优化器将其转换为多个OR语句(如果你看一下,你可以看到执行计划)。

我很难想出一个合理的方案,该方案需要接近该方案,其固定值无论如何都无法从其他数据中派生出来作为子查询。

我怀疑这与逻辑数据库限制有关,例如,表中的列不能超过 1000 列;由于在插入语句中使用表达式列表来列出要插入的列和值,因此表达式列表必须能够匹配它,但可能没有理由超过它。

当然是推测……如果没有看到软件的内部结构,您不太可能得到明确的答案。

于 2013-09-25T11:00:17.540 回答
1

这是因为 IN 的性能非常差,列表中有大量值。它只是 OR 子句的快捷方式,在数据库级别,引擎会将 IN 更改为 OR。

您还应该避免在 IN 子句中进行子查询 - 最好使用 EXISTS。

于 2013-09-25T11:01:34.410 回答
0

尝试使用“exists”而不是“in”。您也可以使用“exists”创建子查询。

于 2013-09-26T02:13:39.443 回答