2013-09-25 81 views
5

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

+0

不要质疑甲骨文Mightiness,它是禁止普通用户:D只是开玩笑。您可以使用WHERE par_id IN('a','b',...,'z')或par_id IN('或','pr'...'zd')覆盖它。 –

+0

覆盖此的许多方法我在stackexhange中发现了3或4)。但是原因可能只是像Oracle预加载中的基本约束,查询中的最大字节等 – SriniV

+0

如果您有超过十多个条目,则应该使用子查询无论如何,有些类型。 1000是一个任意大的限制 - 可能已经太大了。 –

回答

8

这是对任何expression list的限制:

用逗号分隔的表达式列表可以包含超过1000个表情没了。

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

我很难想出一个合理的方案,需要得到任何附近的位置,固定值无法从其他数据派生出来作为子查询。例如:

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

推测当然......没有看到软件的内部,你不可能得到明确的答案。

+1

列数与表达式列表中元素的数量之间有趣的相关关系。从来没有想过这可能是相关的。 –

1

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

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

+1

'IN'和'EXISTS'在逻辑上是等效的。 Oracle优化器对它们进行相同的处理。你应该酌情使用它们中的任何一个,从性能的角度来看它并不重要。 –

0

尝试使用'exists'而不是'in'。您还可以使用'exists'创建子查询。