为什么oracle IN子句仅对静态数据有1000的限制?

时间:2013-09-25 10:45:56

标签: oracle oracle11g oracle10g

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

3 个答案:

答案 0 :(得分:8)

这是对任何expression list的限制:

  

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

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

我很难想出一个合理的场景,需要靠近它,固定值无法从其他数据中作为子查询得出。

我怀疑它与logical database limits有些相关,例如表示你不能在表中拥有超过1000列;由于在insert语句中使用表达式列表来列出列和要插入的值,因此表达式列表必须能够匹配,但可能没有理由超过它。

当然猜测......如果没有看到软件的内部结构,你就不可能得到明确的答案。

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

尝试使用'存在'比起'。你也可以使用' exists'来创建子查询。