在脚本中使用一个远程表驱动Oracle提示

在脚本中使用一个远程表驱动Oracle提示,oracle,oracle11g,Oracle,Oracle11g,当仅从一个远程表访问数据时,使用DRIVING_SITE提示是否有任何优势。执行计划在有提示和无提示的情况下保持不变 SELECT /*+ DRIVING_SITE(REMOTE_TABLE) */ distinct a.COL1_NB, a.COL2_TX, a.COL3_TX FROM REMOTE_TABLE@DASH a WHERE TRUNC(SYSDATE) BETWEEN A.HSTRY_EFCTV_DT AND HSTRY_XPRTN_DT 远程_表有近2M的数据,结果集预计有

当仅从一个远程表访问数据时,使用DRIVING_SITE提示是否有任何优势。执行计划在有提示和无提示的情况下保持不变

SELECT /*+ DRIVING_SITE(REMOTE_TABLE) */ distinct a.COL1_NB, a.COL2_TX, a.COL3_TX
FROM REMOTE_TABLE@DASH a
WHERE TRUNC(SYSDATE) BETWEEN A.HSTRY_EFCTV_DT AND HSTRY_XPRTN_DT

远程_表有近2M的数据,结果集预计有大约300K条记录。

可能没有。如果您只查询远程数据库中的对象,那么优化器很可能不会生成本地站点作为驱动站点的计划。如果您没有看到查询计划的更改,这意味着此查询可能不是优化器会搞糟的少数查询之一


我强烈建议删除提示。

我在Oracle R12过程中有以下查询:

SELECT /*+ DRIVING_SITE(FFUSA_MISSING_DOCS) */ *
FROM FFUSA_MISSING_DOCS@EBS_ONBASE FFUSA_MISSING_DOCS
WHERE "Renewal Date" >= DATE '2018-08-01' OR "Renewal Date" IS NULL;
EBS_ONBASE是指向MS SQL的数据库链接。我无法让它在远程数据库上进行筛选(在远程数据库中,等效查询需要2分钟,而不是12分钟以上,并且返回的行要少得多)。因此,我个人强烈建议您保留这一提示,并尝试找出如何让Oracle能够长时间地听取您的意见,让他们支持向远程非Oracle数据库发送简单的筛选器。下面的解释计划显示了它如何返回所有数据,然后尝试进行筛选:

------------------------------------------------------------------------------------------------
| Id  | Operation        | Name         | Rows  | Bytes | Cost (%CPU)| Time     | Inst   |IN-OUT|
------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT |              |   195 |   277K|   200   (0)| 00:00:01 |        |      |
|*  1 |  FILTER          |              |   195 |   277K|   200   (0)| 00:00:01 |        |      |
|   2 |   REMOTE         | MISSING_DOCS |       |       |            |          | EBS_O~ | R->S |
------------------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   1 - filter("Renewal Date" IS NULL OR "Renewal Date">=TO_DATE(' 2018-08-01 00:00:00', 
              'syyyy-mm-dd hh24:mi:ss'))

Remote SQL Information (identified by operation id):
----------------------------------------------------

   2 - SELECT {column list} FROM 
       "MISSING_DOCS" (accessing 'EBS_ONBASE' )

提示需要引用表别名。不管提示的含义如何,如果不将其更改为
/*+DRIVING_SITE(A)*/
@JonHeller-Jon,它将不可能工作,感谢这一点,因为我在11.2数据库上遇到过类似的情况。然而,从
12.2
来看,如果别名不存在,Oracle似乎在内部使用与表同名的别名。提示与表名一起使用。尽管如此,我在在线文档中找不到任何关于这种行为变化的提及。当然,如果表使用别名,那么提示中也应该使用别名。这是我的假设,没有任何官方文件。