Sql Oracle ANSI左外联接,11gR2中有1050多列

Sql Oracle ANSI左外联接,11gR2中有1050多列,sql,oracle,join,Sql,Oracle,Join,我在Oracle(11.2.0.1.0)上遇到了一个问题,太多的左外部联接(或者更确切地说,联接表中的列太多)会导致以下错误: ORA-03113:通信频道上的文件结束 alert.log文件将基本错误显示为: ORA-07445:遇到异常:堆芯转储 我们以前见过类似的问题,但有不同的错误: ORA-01445:无法从没有 密钥保留表 测试用例: -- create 100 colum table CREATE TABLE BIG_TABLE ( c1 NVARCHAR2(1), c2

我在Oracle(11.2.0.1.0)上遇到了一个问题,太多的左外部联接(或者更确切地说,联接表中的列太多)会导致以下错误:

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

alert.log文件将基本错误显示为:

ORA-07445:遇到异常:堆芯转储

我们以前见过类似的问题,但有不同的错误:

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=O.K

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

有人能确认我的结果吗(特别是最后一个结果),如果可能的话,建议一些解决方法吗

谢谢,
Ben在Linux x86-64上的11.2.0.3中运行良好。 因此,我建议您升级11.2.0.1.0->11.2.0.3.0。 它不仅可以修复这个bug,还可以修复数千个其他bug。 此外,如果您打开一个SR w/Oracle,他们首先会请求您升级到11.2.0.3


-Mark

我运行了您的测试用例,发现了一些结果: 1) 如果在大表中插入2行,查询将输出4096行,那么这就是笛卡尔积,我不知道这是否是期望的行为 2) 如果将选定列的数量限制为96,则会得到结果。 我试过了

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

您的测试用例对我很有用。我甚至还增加了五个左外连接,这很有效。我们的实例可能安装了一些补丁,我不确定

SELECT * FROM v$version;
  • 以sysdba身份登录
  • 运行以下命令:

    alter system set "_query_rewrite_vop_cleanup" = false
    

  • 这将在11.2.0.1版上解决您的问题,无需升级

    我可以确认您的发现-谢谢。这只是一个示例查询,我们确实有一个“真实世界”查询由于(似乎)相同的原因而失败!似乎简单地选择big_table.c1和“ROW_NUMBER()OVER(ORDER BY big_table.c1 ASC)RN”也会导致错误。极好的!您的sql遇到了很多Oracle错误,如果您想了解相关信息,请修补安装。不幸的是,我们不在Linux上,也没有访问该版本的权限——但很高兴知道这个错误和其他错误已经修复。再次感谢!没有联接条件的联接(
    ON 1=1
    )不是外部联接,它是编写
    交叉联接的一种模糊方式
    。对于Oracle 10或更低版本的查询,如果列太多,无法处理需要,则数据库重构似乎也有关系。是的,这句话太可怕了。这个修复程序记录在Bug#10242303和Bug#10184115中
    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
    
    alter system set "_query_rewrite_vop_cleanup" = false