【问题标题】:ORA-01795 - why is the maximum number of expressions limited to 1000ORA-01795 - 为什么表达式的最大数量限制为 1000
【发布时间】:2016-09-19 23:31:44
【问题描述】:

SO 充满了变通方法,但我想知道 IN 子句中“最大表达式数”限制为 1000 背后的历史原因?

【问题讨论】:

  • 对于一个好的设计来说,1000 的限制本身就很大。实际上,您不会达到极限。无论如何,我已经在我的回答中进一步解释了。
  • 我猜答案与语法和解析有关。也许它们是如何在 30 年前实施的。很高兴看到理论计算机科学对此的回答!
  • 人们可以合理地问,为什么这个数字如此之高?
  • 我认为 Oracle 在 DB 技术方面已经相当老了,这些限制在那时就已经形成,他们再也不必考虑了。所有表达式列表都有 1000 个限制。并且稳健的设计永远不会让用户向 Oracle 寻求解释。而汤姆关于解析的回答总是让我认为当时在 70 年代或 80 年代的所有这些限制目的更多的是计算问题。基于 C 的算法可能需要一些限制,Oracle 提供了 1000 个
  • 我不同意这些限制很高并且可以接受。语言应该允许任意表达或表达组合。一种语言不应该设置随机限制,并且在大多数情况下,Oracle SQL 不设置随机限制。 compound expressions没有限制,expression lists为什么要限制?这个问题总是出现;此功能是一个错误,即使它不是什么大问题。

标签: oracle


【解决方案1】:

这可能是因为,有可能被大量价值观滥用。并且其中的每一个值都会被转化为等价的 OR 条件。

例如NAME IN ('JOHN', 'CHARLES'..) 将被转换为NAME = 'JOHN' OR NAME = 'CHARLES'

所以,它可能会影响性能..

但注意Oracle仍然支持

SELECT ID FROM EMP WHERE NAME IN (SELECT NAME FROM ATTENDEES)

在这种情况下,优化器不会转换成多个 OR 条件,而是生成一个JOIN..

【讨论】:

    【解决方案2】:

    此限制不仅适用于 IN 列表,也适用于任何表达式列表。文档说:

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

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

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

    并且,引用著名的 AskTom 网站关于类似主题的引述,

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

    更新我自己的想法

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

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

    作为一名 DBA,我看到很多开发人员向我提出性能问题,这实际上是 application framework 生成查询以从数据库中获取数据的问题。该应用程序向用户提供添加filters 的功能,最终在IN 查询列表中形成AND, OR 逻辑。在内部,Oracle 在optimization 阶段将其扩展为query rewriteOR 逻辑。并且查询变得巨大,从而增加了PARSE它的时间。大多数时候,它会抑制index usage。因此,这是通过应用程序框架生成带有大量 IN 列表的查询的情况之一。

    【讨论】:

    • 仍然看起来很随意。我们可以添加一百万个表达式,为什么我们不能“输入”一百万个表达式?
    • 是的,我同意。也许,因为 Oracle 在 DB 技术方面已经相当老了,所以这些限制是在那时就已经做出的,他们再也不必考虑了。所有表达式列表都有 1000 个限制。一个健壮的设计永远不会让用户向 Oracle 寻求解释。而汤姆关于解析的回答总是让我认为当时在 70 年代或 80 年代的所有这些限制目的更多的是计算问题。基于 C 的算法可能需要一些限制,Oracle 提供了 1000 个。
    猜你喜欢
    • 2011-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-09-28
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2017-03-20
    • 2013-07-24
    相关资源
    最近更新 更多