I get the same as my original results with 12.1 talking to 11.2.0.4
SQL> explain plan for
2 select *
3 from t1@db11 inner join t1@db11 t1a on t1.object_id = t1a.object_id
4 where t1.object_name = 'XXXXX' or t1a.subobject_name = 'YYYY'
5 union all
6 select *
7 from t2@db11 inner join t2@db11 t2a on t2.data_object_id = t2a.data_object_id
8 where t2.object_name = 'XXXXX' or t2a.subobject_name = 'YYYY';
Explained.
SQL>
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------
Plan hash value: 926263822
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Inst |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT REMOTE| | 166 | 68724 | 2875 (1)| 00:00:35 | |
| 1 | UNION-ALL | | | | | | |
| 2 | CONCATENATION | | | | | | |
|* 3 | HASH JOIN | | 14 | 5796 | 719 (1)| 00:00:09 | |
|* 4 | TABLE ACCESS FULL | T1 | 14 | 2898 | 359 (1)| 00:00:05 | DB11 |
| 5 | TABLE ACCESS FULL | T1 | 110K| 21M| 360 (1)| 00:00:05 | DB11 |
|* 6 | HASH JOIN | | 14 | 5796 | 719 (1)| 00:00:09 | |
|* 7 | TABLE ACCESS FULL | T1 | 14 | 2898 | 359 (1)| 00:00:05 | DB11 |
|* 8 | TABLE ACCESS FULL | T1 | 110K| 21M| 360 (1)| 00:00:05 | DB11 |
| 9 | CONCATENATION | | | | | | |
|* 10 | HASH JOIN | | 69 | 28566 | 719 (1)| 00:00:09 | |
|* 11 | TABLE ACCESS FULL | T2 | 14 | 2898 | 359 (1)| 00:00:05 | DB11 |
| 12 | TABLE ACCESS FULL | T2 | 101K| 20M| 359 (1)| 00:00:05 | DB11 |
|* 13 | HASH JOIN | | 69 | 28566 | 719 (1)| 00:00:09 | |
|* 14 | TABLE ACCESS FULL | T2 | 14 | 2898 | 359 (1)| 00:00:05 | DB11 |
|* 15 | TABLE ACCESS FULL | T2 | 101K| 20M| 360 (1)| 00:00:05 | DB11 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("A5"."OBJECT_ID"="A4"."OBJECT_ID")
4 - filter("A4"."SUBOBJECT_NAME"='YYYY')
6 - access("A5"."OBJECT_ID"="A4"."OBJECT_ID")
7 - filter("A5"."OBJECT_NAME"='XXXXX')
8 - filter(LNNVL("A4"."SUBOBJECT_NAME"='YYYY'))
10 - access("A3"."DATA_OBJECT_ID"="A2"."DATA_OBJECT_ID")
11 - filter("A2"."SUBOBJECT_NAME"='YYYY')
13 - access("A3"."DATA_OBJECT_ID"="A2"."DATA_OBJECT_ID")
14 - filter("A3"."OBJECT_NAME"='XXXXX')
15 - filter(LNNVL("A2"."SUBOBJECT_NAME"='YYYY'))
Note
-----
- fully remote statement
- dynamic statistics used: dynamic sampling (level=2)
41 rows selected.
SQL>
SQL>
SQL> variable b1 varchar2(20)
SQL> variable b2 varchar2(20)
SQL> exec :b1 := 'XXXXX'; :b2 := 'YYYY';
PL/SQL procedure successfully completed.
SQL>
SQL> explain plan for
2 select *
3 from t1@db11 inner join t1@db11 t1a on t1.object_id = t1a.object_id
4 where t1.object_name = :b1 or t1a.subobject_name = :b2
5 union all
6 select *
7 from t2@db11 inner join t2@db11 t2a on t2.data_object_id = t2a.data_object_id
8 where t2.object_name = :b1 or t2a.subobject_name = :b2;
Explained.
SQL>
SQL> select * from table(dbms_xplan.display());
PLAN_TABLE_OUTPUT
----------------------------------------------------------------------------------------------------------------------------
Plan hash value: 926263822
----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | Inst |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT REMOTE| | 11876 | 4801K| 2875 (1)| 00:00:35 | |
| 1 | UNION-ALL | | | | | | |
| 2 | CONCATENATION | | | | | | |
|* 3 | HASH JOIN | | 1110 | 448K| 719 (1)| 00:00:09 | |
|* 4 | TABLE ACCESS FULL | T1 | 1110 | 224K| 359 (1)| 00:00:05 | DB11 |
| 5 | TABLE ACCESS FULL | T1 | 110K| 21M| 360 (1)| 00:00:05 | DB11 |
|* 6 | HASH JOIN | | 1111 | 449K| 719 (1)| 00:00:09 | |
|* 7 | TABLE ACCESS FULL | T1 | 1110 | 224K| 359 (1)| 00:00:05 | DB11 |
|* 8 | TABLE ACCESS FULL | T1 | 109K| 21M| 360 (1)| 00:00:05 | DB11 |
| 9 | CONCATENATION | | | | | | |
|* 10 | HASH JOIN | | 4852 | 1961K| 719 (1)| 00:00:09 | |
|* 11 | TABLE ACCESS FULL | T2 | 1019 | 205K| 359 (1)| 00:00:05 | DB11 |
| 12 | TABLE ACCESS FULL | T2 | 101K| 20M| 359 (1)| 00:00:05 | DB11 |
|* 13 | HASH JOIN | | 4803 | 1941K| 719 (1)| 00:00:09 | |
|* 14 | TABLE ACCESS FULL | T2 | 1019 | 205K| 359 (1)| 00:00:05 | DB11 |
|* 15 | TABLE ACCESS FULL | T2 | 100K| 19M| 360 (1)| 00:00:05 | DB11 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
3 - access("A5"."OBJECT_ID"="A4"."OBJECT_ID")
4 - filter("A4"."SUBOBJECT_NAME"=:B2)
6 - access("A5"."OBJECT_ID"="A4"."OBJECT_ID")
7 - filter("A5"."OBJECT_NAME"=:B1)
8 - filter(LNNVL("A4"."SUBOBJECT_NAME"=:B2))
10 - access("A3"."DATA_OBJECT_ID"="A2"."DATA_OBJECT_ID")
11 - filter("A2"."SUBOBJECT_NAME"=:B2)
13 - access("A3"."DATA_OBJECT_ID"="A2"."DATA_OBJECT_ID")
14 - filter("A3"."OBJECT_NAME"=:B1)
15 - filter(LNNVL("A2"."SUBOBJECT_NAME"=:B2))
Note
-----
- fully remote statement
- dynamic statistics used: dynamic sampling (level=2)
41 rows selected.
Can you paste the output of your explain plan in the same way I have above so we can take a look