Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle ORA-01795-为什么表达式的最大数量限制为1000_Oracle - Fatal编程技术网

Oracle ORA-01795-为什么表达式的最大数量限制为1000

Oracle ORA-01795-为什么表达式的最大数量限制为1000,oracle,Oracle,因此有很多解决办法,但我想知道in子句中表达式的最大数量限制为1000个背后的历史原因是什么?这可能是因为,有可能被大量的值滥用。其中的每一个值都将被转换为等价或条件 例如,“约翰”、“查尔斯”中的名字。。将转换为NAME='JOHN'或NAME='CHARLES' 因此,它可能会影响性能 但请注意,Oracle仍然支持 从EMP中选择ID,其中“从与会者中选择名称”中的名称 在这种情况下,优化器不会转换为多个OR条件,而是进行联接。此限制不仅适用于In列表,而且适用于任何表达式列表。文件说:

因此有很多解决办法,但我想知道in子句中表达式的最大数量限制为1000个背后的历史原因是什么?

这可能是因为,有可能被大量的值滥用。其中的每一个值都将被转换为等价或条件

例如,“约翰”、“查尔斯”中的名字。。将转换为NAME='JOHN'或NAME='CHARLES'

因此,它可能会影响性能

但请注意,Oracle仍然支持

从EMP中选择ID,其中“从与会者中选择名称”中的名称


在这种情况下,优化器不会转换为多个OR条件,而是进行联接。

此限制不仅适用于In列表,而且适用于任何表达式列表。文件说:

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

你的问题是为什么上限是1000。为什么不是100、10000或100万?我猜这与表中列数的限制有关,即1000。在Oracle内部,这种关系可能是正确的,以使表达式列表和列与DML语句匹配

但是,对于一个好的设计来说,限制1000本身是很大的。实际上,你不会达到极限

引用著名的AskTom网站关于类似主题的一段话

我们将花更多的时间解析查询,然后实际执行它们

更新我自己的想法


我认为甲骨文在数据库技术方面已经很老了,这些限制是在那个时候制定的,他们再也不用考虑了。所有表达式列表都有1000个限制。而且,稳健的设计绝不会让用户向Oracle寻求解释。Tom关于解析的回答总是让我觉得,在70年代或80年代,所有这些限制目的更多的是计算问题。基于C的算法可能需要一些限制,而Oracle提供了1000个

更新2:从应用程序及其框架的角度


作为一名DBA,我看到很多开发人员向我提出性能问题,这些问题实际上是应用程序框架生成查询以从数据库获取数据的问题。应用程序向用户提供了添加过滤器的功能,过滤器最终在查询的IN列表中形成AND、OR逻辑。Oracle在内部将其扩展为优化阶段的查询重写或逻辑。查询变得巨大,从而增加了解析它的时间。大多数情况下,它会抑制索引的使用。因此,这是通过应用程序框架生成具有巨大IN列表的查询的情况之一。

对于一个好的设计,1000本身的限制很大。实际上,你不会达到极限。无论如何,我已经在我的回答中作了进一步的解释。我猜答案与语法和语法分析有关。也许还有30年前它们是如何实施的。很高兴看到一个理论上的计算机科学答案!有人可能会合理地问,为什么这个数字如此之高?我认为甲骨文在数据库技术方面相当古老,这些限制是在当时制定的,他们再也不用考虑它了。所有表达式列表都有1000个限制。而且,稳健的设计绝不会让用户向Oracle寻求解释。Tom关于解析的回答总是让我觉得,在70年代或80年代,所有这些限制目的更多的是计算问题。基于C的算法可能需要一些限制,而Oracle提供了1000I。我不同意这些限制是高的并且可以接受。语言应该允许任意表达式或表达式的组合。语言不应该设置随机限制,而Oracle SQL在很大程度上也不设置随机限制。没有限制,为什么要有限制?这个问题经常出现,;这个功能是一个bug,即使它不是什么大问题。仍然看起来很武断。我们可以添加一百万个表达式,为什么我们不能添加一百万个表达式呢?是的,我同意。也许,因为Oracle在DB技术方面相当老套,所以这些限制在当时就已经制定过,他们再也不用考虑了。所有表达式列表都有1000个限制。而且,稳健的设计绝不会让用户向Oracle寻求解释。Tom关于解析的回答总是让我觉得,在70年代或80年代,所有这些限制目的更多的是计算问题。基于C的算法可能需要一些限制,而Oracle提供了1000个。