Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xslt/3.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
Db2 Oracle DB link-where子句求值_Db2_Oracle12c_Database Link - Fatal编程技术网

Db2 Oracle DB link-where子句求值

Db2 Oracle DB link-where子句求值,db2,oracle12c,database-link,Db2,Oracle12c,Database Link,我有一个DB2数据源和一个Oracle 12c目标。 Oracle有一个到DB2定义的DB链接,该链接通常可以正常工作 现在我在DB2中有一个巨大的表,它有一个timestamp列,我们可以将其称为ROW_CHANGED for ROW changes。我想检索在特定时间后更改的行 运行 从更改了行的lib.tbl中选择*>“2016-08-01 10:00:00” 在DB2上,大约90秒后返回正好1行,这很好 现在,我尝试通过db链接从Oracle执行相同的查询: 从lib中选择*。tbl@d

我有一个DB2数据源和一个Oracle 12c目标。 Oracle有一个到DB2定义的DB链接,该链接通常可以正常工作

现在我在DB2中有一个巨大的表,它有一个timestamp列,我们可以将其称为ROW_CHANGED for ROW changes。我想检索在特定时间后更改的行

运行

从更改了行的lib.tbl中选择*>“2016-08-01 10:00:00”

在DB2上,大约90秒后返回正好1行,这很好

现在,我尝试通过db链接从Oracle执行相同的查询:

从lib中选择*。tbl@dblink_name其中第行更改为时间戳“2016-08-01 10:00:00”

这会运行数小时,最后超时。 我阅读了一些Oracle文档,发现了分布式查询优化技巧,但其中大多数都提到将本地表连接到远程表,这与我的情况不同

在我的绝望中,我尝试了驾驶室网站的提示,但没有效果

现在我想知道何时计算查询的WHERE部分。由于查询必须使用Oracle语法而不是DB2语法,Oracle是否可能首先复制完整的表,然后应用where子句?我做了一些研究,但没有发现任何对我有帮助的东西

如果有必要的话,更改的行是DB2中的一个隐藏列

请提前通知我们任何提示

更新

Thanks@all寻求帮助。我会告诉大家是什么让我玩这个把戏的

首先,我使用了_TIMESTAMP,因为DB2列也是TIMESTAMP而不是date,我希望通过它来避免隐式转换。 没有显式转换,我遇到了ORA-28534:异构服务预处理错误,我不希望在合理的时间内接触数据库配置

顺便说一句,解释计划没有带来多少好处。它显示了一个完整的提示,并且没有对谓词进行转换。事实上,它显示了ROW_更改为Date列,我想知道为什么

我尝试过Justins的建议使用bind变量,但是我又得到了ORA-28534。我做的下一件事是将其包装到pl/sql块中,该块稍后将在SP中运行

declare
v_tmstmp TIMESTAMP := 01.08.16 10:00:00;
begin

INSERT INTO ORAUSER.TMP_TBL (SRC_PK,ROW_CHANGED)
SELECT  SRC_PK,ROW_CHANGED
FROM lib.tbl@dblink_name
WHERE ROW_CHANGED > v_tmstmp;
end;
这与在DB2中同时执行。此处的日期格式为DD.MM.YY,因为它是默认格式。 将变量赋值更改为

v_tmstmp TIMESTAMP := TO_TIMESTAMP('01.08.16 10:00:00','DD.MM.YY HH24:MI:SS');
我遇到了和以前一样的问题


与此同时,DB2操作员在我当天早些时候请求的ROW_CHANGED列中创建了一个索引。这似乎从总体上解决了问题。甚至我的原始查询现在也很快就完成了。

如果您实际使用的是特定于Oracle的转换函数,如“时间戳”,则会强制在Oracle端对谓词进行求值。Oracle不知道如何将内置函数(如to_timestamp)转换为DB2中完全等效的函数调用

如果使用绑定变量,则更有可能在DB2端对其进行计算。但不同数据库之间的数据类型映射可能会使这一点变得复杂——一个引擎的日期和另一个引擎的时间戳数据类型之间可能没有完美的映射。如果这是一个数字列,绑定变量几乎肯定会被推送。在本例中,它可能需要仔细研究一下,以确定在框架、Oracle和DB2中使用的变量的数据类型


如果使用绑定变量不起作用,可以使用强制在远程服务器上计算谓词。这允许您将查询逐字发送到远程服务器,这样您就可以使用DB2数据库中定义的函数。在这种情况下,这可能有点过头了,但如果简单的解决方案不能足够快地工作,最好将锤子作为备份。

这似乎是两个查询之间的唯一区别:to_TIMESTAMP函数。不熟悉DB链接,但我不明白您为什么需要它?我没有DB2实例可供测试,但看起来数据类型不同,可能导致DB2数据的隐式转换和/或全表扫描。使用“截止日期”2016-08-01 10:00:00,“YYYY-MM-DD HH24:MI:SS”是否有帮助?添加链接版本的执行计划可能会有用;特别是谓词信息,以查看它是否针对DB2表列调用函数。这使我走上了正确的轨道,因此我将其标记为应答。看起来bind变量可以工作,但在我的例子中可能需要在连接器配置ODBC中进行自适应