在脚本中使用一个远程表驱动Oracle提示
当仅从一个远程表访问数据时,使用DRIVING_SITE提示是否有任何优势。执行计划在有提示和无提示的情况下保持不变在脚本中使用一个远程表驱动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的数据,结果集预计有
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似乎在内部使用与表同名的别名。提示与表名一起使用。尽管如此,我在在线文档中找不到任何关于这种行为变化的提及。当然,如果表使用别名,那么提示中也应该使用别名。这是我的假设,没有任何官方文件。