我正在使用Oracle 21c XE进行测试。我已经安装了Progress Openedge ODBC驱动程序,并创建了所有内容,包括异构服务所需的DB链接。当我执行一个简单的";从myview中选择*";它相对快速地返回200行;MyView"有几十万行。
在Oracle数据库所在的同一VM上,我安装了查询工具(使用ODBC(;"本地";查询测试和性能比较。
如果我执行;
select * from myview where guid = 1.488657859
从Query Tool返回一行需要.203秒,从Oracle返回同一行需要1.54秒;
select * from myview@data_link where guid = 1.488657859
虽然速度较慢,但并不完全令人震惊。但是,如果我执行;
SELECT *
FROM myview
WHERE POST_ASSESS_TIME IS NULL AND
mod_date > SYSDATE -1
从Query Tool,它在.390秒内返回25行,但当我执行时,Oracle似乎从未返回;
SELECT *
FROM myview@data_link
WHERE POST_ASSESS_TIME IS NULL AND
mod_date > SYSDATE -1
我已经等了一个多小时了。
经过一番研究,我将查询改为只返回guid,并在initODBC.ora中打开了跟踪;
HS_FDS_TRACE_LEVEL=4
在我的跟踪文件中,我为where子句找到了以下内容,该子句查找单个guid(guid=1.488657859(,跟踪文件显示该查询已传递给odbc驱动程序;
SQL text from hgopars, id=1, len=69 ...
00: 53454C45 43542041 312E2247 55494422 [SELECT A1."GUID"]
10: 2046524F 4D202246 4C4F5753 48454554 [ FROM "MYVERYOWN]
20: 5F564945 57222041 31205748 45524520 [_VIEW" A1 WHERE ]
30: 41312E22 47554944 223D312E 34383836 [A1."GUID"=1.4886]
40: 35373835 39 [57859]
这显然是在发送包括where子句在内的整个查询,并且它会快速返回。
对于具有更复杂where文件的查询,它将以下内容发送到odbc驱动程序;
SQL text from hgopars, id=1, len=65 ...
00: 53454C45 43542022 47554944 222C224D [SELECT "GUID","M]
10: 4F445F44 41544522 2C22504F 53545F41 [OD_DATE","POST_A]
20: 53534553 535F5449 4D452220 46524F4D [SSESS_TIME" FROM]
30: 2022464C 4F575348 4545545F 56494557 [ "MYVERYOWN_VIEW]
40: 22 ["]
它似乎没有使用where子句发送完整查询。
它似乎正在检索我请求的内容(guid(以及处理Oracle数据库上where子句所需的一切,这将导致它检索超过200000行,并将它们带入Oracle,在那里它将执行筛选。
有没有一种方法可以告诉Oracle将where子句原样传递给ODBC驱动程序?
如果是,怎么办?
驱动程序将尝试"最好的";发送谓词,但如果存在不兼容(通常是由于某种数据类型不匹配(,则我们将省略谓词,然后在本地应用它。
例如;SYSDATE";在您的远程数据库中可能是未知的。我们不知道远程数据库在哪个时区,使用什么时钟等等,所以发送日期意味着潜在的虚假结果。在这种情况下,您可以在本地评估sysdate的值,然后使用文字值。
有一种使用传递机制将整个操作发送到远程数据库的机制。更多详情点击此处
https://connor-mcdonald.com/2012/07/18/dbms_hs_passthroughthe-magic-package/