Joe*_*ris 7 sql oracle plsql oracle11g
我正在从我正在研究的Oracle实例中获得一些奇怪的行为.这是Itanium上的11gR1,没有RAC,没什么特别的.最终,我在数据仓库场景中将数据从一个Oracle实例移动到另一个Oracle实例.
我有一个在数据库链接上运行的半复杂视图; 4个内部连接在大型桌子上,5个左连接在中型桌子上.
这是问题:当我在SQL Developer(或SQL*Plus)中测试视图时,它看起来很好,没有任何重复.但是,当我实际使用视图将数据插入表中时,我得到了大量的欺骗.
编辑: - 数据进入一个空表.查询中的所有表都在数据库链接上.传递给查询的唯一事情是日期(例如INSERT INTO目标SELECT*FROM视图WHERE view.datecol = dQueryDate) -
我已经尝试将一个ROW_NUMBER()函数添加到select语句中,由PK为视图分区.所有行都返回编号为1.但是,同样的语句作为插入运行生成与之前相同的dupe,现在方便编号.每个键的欺骗行数不一样.有些记录存在4次,有些只存在一次.
我发现这种行为非常令人困惑.:)它让我想起了使用Teradata,你有SET表(仅限唯一行)和MULTISET表(允许重复行),但Oracle没有这样的功能.
将行返回到客户端的选择应该与将这些行插入到另一个位置的选择相同.我无法想象这种情况发生的合理原因,但也许我正在遭受想象力的失败.;)
我想知道是否有其他人经历过这个或者这个平台上是否有错误.
解
感谢@Gary,我能够通过使用"EXPLAIN PLAN FOR {my query}"来解决这个问题.和"SELECT*FROM TABLE(dbms_xplan.display);".实际上用于 INSERT 的解释与SELECT非常不同.
对于SELECT,大多数计划操作是"TABLE ACCESS BY INDEX ROWID"和"INDEX UNIQUE SCAN"."谓词信息"块包含查询中的所有连接和过滤器.最后它说"注意 - 完全远程声明".
对于INSERT,没有对索引的引用.'Predicate Information'块只有三行,一个新的'Remote SQL'块显示9个小的SQL语句.
数据库已将我的查询拆分为9个子查询,然后尝试在本地加入它们.通过运行较小的选择,我找到了重复的来源.
我相信这是围绕远程链接的Oracle编译器中的错误.它在重写SQL时会产生逻辑缺陷.基本上编译器没有正确应用WHERE子句.我只是测试它并给它一个5个键的IN列表来带回来.SELECT带回5行.INSERT将77,000多行放入目标并完全忽略IN列表.
{仍然在寻找一种强制正确行为的方法,我可能不得不要求在远程数据库上创建视图,尽管从开发角度来看这并不理想.当我让它工作时我会编辑它...}
小智 6
它似乎是Oracle Bug,我们发现以下内容如下:如果你希望你的" insert into select ...
"像你的" select ...
" 那样工作,你可以将你的选择打包到子选择中.
例如 :
select x,y,z from table1, table2, where ...
Run Code Online (Sandbox Code Playgroud)
- >没有重复
insert into example_table
select x,y,z from table1, table2, where ...
Run Code Online (Sandbox Code Playgroud)
- >重复错误
insert into example_table
select * from (
select x,y,z from table1, table2, where ...
)
Run Code Online (Sandbox Code Playgroud)
- >没有重复
问候
归档时间: |
|
查看次数: |
4347 次 |
最近记录: |