如何强制Oracle异类查询将where子句发送到ODBC驱动程序



我正在使用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/

相关内容

  • 没有找到相关文章

最新更新