【问题标题】:Oracle ANSI left outer join with more than 1050 columns in 11gR2Oracle ANSI 左外连接在 11gR2 中超过 1050 列
【发布时间】:2011-11-23 12:36:17
【问题描述】:

我在 Oracle (11.2.0.1.0) 上遇到一个问题,左外连接过多(或者连接表中的列过多)会导致以下错误:

ORA-03113: end-of-file on communication channel

alert.log 文件将潜在错误显示为:

ORA-07445: exception encountered: core dump...

我们之前也看到过类似的问题,但出现了不同的错误:

ORA-01445: cannot select ROWID from, or sample, a join view without a key-preserved table

When ANSI SQL Join Syntax Does Not Work in Oracle

ORA-01445

测试用例:

-- create 100 colum table
CREATE TABLE BIG_TABLE
(
  c1 NVARCHAR2(1), c2 NVARCHAR2(1), c3 NVARCHAR2(1), c4 NVARCHAR2(1), c5 NVARCHAR2(1), c6 NVARCHAR2(1), c7 NVARCHAR2(1), c8 NVARCHAR2(1), c9 NVARCHAR2(1), c10 NVARCHAR2(1), 
  c11 NVARCHAR2(1), c12 NVARCHAR2(1), c13 NVARCHAR2(1), c14 NVARCHAR2(1), c15 NVARCHAR2(1), c16 NVARCHAR2(1), c17 NVARCHAR2(1), c18 NVARCHAR2(1), c19 NVARCHAR2(1), c20 NVARCHAR2(1), 
  c21 NVARCHAR2(1), c22 NVARCHAR2(1), c23 NVARCHAR2(1), c24 NVARCHAR2(1), c25 NVARCHAR2(1), c26 NVARCHAR2(1), c27 NVARCHAR2(1), c28 NVARCHAR2(1), c29 NVARCHAR2(1), c30 NVARCHAR2(1), 
  c31 NVARCHAR2(1), c32 NVARCHAR2(1), c33 NVARCHAR2(1), c34 NVARCHAR2(1), c35 NVARCHAR2(1), c36 NVARCHAR2(1), c37 NVARCHAR2(1), c38 NVARCHAR2(1), c39 NVARCHAR2(1), c40 NVARCHAR2(1), 
  c41 NVARCHAR2(1), c42 NVARCHAR2(1), c43 NVARCHAR2(1), c44 NVARCHAR2(1), c45 NVARCHAR2(1), c46 NVARCHAR2(1), c47 NVARCHAR2(1), c48 NVARCHAR2(1), c49 NVARCHAR2(1), c50 NVARCHAR2(1), 
  c51 NVARCHAR2(1), c52 NVARCHAR2(1), c53 NVARCHAR2(1), c54 NVARCHAR2(1), c55 NVARCHAR2(1), c56 NVARCHAR2(1), c57 NVARCHAR2(1), c58 NVARCHAR2(1), c59 NVARCHAR2(1), c60 NVARCHAR2(1), 
  c61 NVARCHAR2(1), c62 NVARCHAR2(1), c63 NVARCHAR2(1), c64 NVARCHAR2(1), c65 NVARCHAR2(1), c66 NVARCHAR2(1), c67 NVARCHAR2(1), c68 NVARCHAR2(1), c69 NVARCHAR2(1), c70 NVARCHAR2(1), 
  c71 NVARCHAR2(1), c72 NVARCHAR2(1), c73 NVARCHAR2(1), c74 NVARCHAR2(1), c75 NVARCHAR2(1), c76 NVARCHAR2(1), c77 NVARCHAR2(1), c78 NVARCHAR2(1), c79 NVARCHAR2(1), c80 NVARCHAR2(1), 
  c81 NVARCHAR2(1), c82 NVARCHAR2(1), c83 NVARCHAR2(1), c84 NVARCHAR2(1), c85 NVARCHAR2(1), c86 NVARCHAR2(1), c87 NVARCHAR2(1), c88 NVARCHAR2(1), c89 NVARCHAR2(1), c90 NVARCHAR2(1), 
  c91 NVARCHAR2(1), c92 NVARCHAR2(1), c93 NVARCHAR2(1), c94 NVARCHAR2(1), c95 NVARCHAR2(1), c96 NVARCHAR2(1), c97 NVARCHAR2(1), c98 NVARCHAR2(1), c99 NVARCHAR2(1), c100 NVARCHAR2(1)
)
/

-- left outer join query (10 joins = 1000 columns)
SELECT
  *
FROM
  BIG_TABLE
  LEFT OUTER JOIN BIG_TABLE BT1 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT2 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT3 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT4 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT5 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT6 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT7 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT8 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT9 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT10 ON 1 = 1
  --LEFT OUTER JOIN BIG_TABLE BT11 ON 1 = 1

如果你取消最后一行的注释,将会导致错误。

--

我已经针对以下版本进行了测试:

10.2.0.1.0 = ORA-01445:无法从没有保留键的表的连接视图中选择 ROWID。

(请注意,您需要注释掉最后两个连接才能使这项工作正常进行 - 除了连接的表之外,它似乎还包括第一个表的列)

11.1.0.6.0 = 好的

11.2.0.1.0 = ORA-03113:通信通道上的文件结束

有人可以确认我的结果(尤其是最后一个结果),如果可能的话,建议任何解决方法?

谢谢, 本

【问题讨论】:

  • 不带连接条件的连接 (ON 1 = 1) 不是外连接,它是一种混淆的方式来编写 cross join
  • 对于 Oracle 10 或更低版本的查询包含太多列而无法处理需求的情况,似乎也需要重构数据库。是的,这句话太可怕了。

标签: sql oracle join


【解决方案1】:

在 Linux x86-64 上的 11.2.0.3 中运行良好。 所以,我建议你升级 11.2.0.1.0 -> 11.2.0.3.0。 它不仅会修复这个错误,还会修复数以千计的其他错误。 此外,如果您使用 Oracle 打开 SR,他们首先会要求您升级到 11.2.0.3。

-马克

【讨论】:

  • 感谢您的信息。不幸的是,我们不在 Linux 上,并且无论如何都无法访问该版本 - 但很高兴知道这个和其他错误已得到修复。再次感谢!
【解决方案2】:

我运行了你的测试用例,我发现了一些结果: 1)如果你在大表中插入 2 行查询输出 4096 行,你正在做一个笛卡尔积,我不知道这是否是所需的行为 2)如果您将所选列的数量限制为 96,您将获得结果。 我试过了

SELECT
  big_table.c1,big_table.c2,big_table.c3,big_table.c4,big_table.c5,big_table.c6,big_table.c7,big_table.c8,big_table.c9,big_table.c10,
  big_table.c11,big_table.c12,big_table.c13,big_table.c14,big_table.c15,big_table.c16,big_table.c17,big_table.c18,big_table.c19,big_table.c20,
  big_table.c21,big_table.c22,big_table.c23,big_table.c24,big_table.c25,big_table.c26,big_table.c27,big_table.c28,big_table.c29,big_table.c30,
  big_table.c31,big_table.c32,big_table.c33,big_table.c34,big_table.c35,big_table.c36,big_table.c37,big_table.c38,big_table.c39,big_table.c40,
  big_table.c41,big_table.c42,big_table.c43,big_table.c44,big_table.c45,big_table.c46,big_table.c47,big_table.c48,big_table.c49,big_table.c50,
  big_table.c51,big_table.c52,big_table.c53,big_table.c54,big_table.c55,big_table.c56,big_table.c57,big_table.c58,big_table.c59,big_table.c60,
  big_table.c61,big_table.c62,big_table.c63,big_table.c64,big_table.c65,big_table.c66,big_table.c67,big_table.c68,big_table.c69,big_table.c70,
  big_table.c71,big_table.c72,big_table.c73,big_table.c74,big_table.c75,big_table.c76,big_table.c77,big_table.c78,big_table.c79,big_table.c80,
  big_table.c81,big_table.c82,big_table.c83,big_table.c84,big_table.c85,big_table.c86,big_table.c87,big_table.c88,big_table.c89,big_table.c90,
  big_table.c91,big_table.c92,big_table.c93,big_table.c94,big_table.c95,big_table.c96
FROM
BIG_TABLE
  LEFT OUTER JOIN BIG_TABLE BT1 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT2 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT3 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT4 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT5 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT6 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT7 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT8 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT9 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT10 ON 1 = 1
  LEFT OUTER JOIN BIG_TABLE BT11 ON 1 = 1

并且没有错误 有 97 列或更多列,我得到了你提到的错误。 我认为您遇到了错误,因此如果您可以访问 Metalink,请尝试升级到最新版本。

【讨论】:

  • 我可以确认您的发现 - 谢谢。这只是一个示例查询,我们确实有一个“现实世界”查询因(似乎)同样的原因而失败!
  • 似乎简单地选择 big_table.c1 和 "ROW_NUMBER() OVER (ORDER BY big_table.c1 ASC) RN" 也会导致错误。太棒了!
  • 您的 sql 遇到了很多 Oracle 错误,如果可以,请修补安装
【解决方案3】:

您的测试用例对我有用。我什至又添加了五个左外连接,而且效果很好。我们的实例可能安装了一些补丁,我不确定。

SELECT * FROM v$version;
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
PL/SQL Release 11.2.0.1.0 - Production
CORE  11.2.0.1.0  Production
TNS for 32-bit Windows: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

【讨论】:

    【解决方案4】:
    1. 以 sysdba 身份登录
    2. 运行这个命令:

      alter system set "_query_rewrite_vop_cleanup" = false
      

    这将解决您在 11.2.0.1 上的问题而无需升级

    【讨论】:

    • 此修复记录在 Bug #10242303 和 Bug #10184115
    猜你喜欢
    • 2016-10-02
    • 1970-01-01
    • 2010-11-15
    • 2016-06-02
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多