| Oracle® Database Heterogen
eous Connectivity Administrator's Guide 10g Release 1 (10.1) Part Number B10764-01 |
|
|
View PDF |
This chapter describes the major features provided by Oracle Transparent Gateways and Generic Connectivity. Description s of these features are contained in the following topics:
SQL statements are translated and datatypes are mapped according to capabilities. PL/SQL calls are mapped to non-Oracle system stored procedures. In the case of SQL statements, if functionality is missing at the remote system, then either a simpler que ry is issued or the statement is broken up into multiple queries and the desired results are obtained by post processing in the Oracl e database.
Even though Heterogeneous Services can, for the most part, incorporate non-Orac le systems into Oracle distributed sessions, there are several limitations to this. Some of the generic limitations are:
CONNECT BY clauses in SQL statements.
out arguments of type REF CURSOR but not in or in-out objects.Data can be replicated between a non-Oracle system and an Oracle server using materialize d views.
|
Note: Starting with Oracle9i, Release 2, there is another means of sharing information b etween databases. This functionality is called Streams and includes the replication of information between Oracle and non-Oracle data bases. For information about using Streams, see Oracle Streams Concepts and Administration. |
Materialized views instantiate data captured from tables at the non-Oracle master site at a particular point in time. This instant is defined by a refresh operation, which copies this data to the Oracle server and synchronizes the copy on Oracle with the master copy on the non-Oracle system. The "materialized" data is then available as a view on the Oracle server. p>
Replication facilities provide mechanisms to schedule refreshes and to collect materialized views into replication groups to facilitate their administration. Refresh groups permit refreshing multiple materialized views just a s if they were a single object.
Heterogeneous replication support is necessarily limited to a subset of the full Oracle-to-Oracle replication functionality:
Other restri ctions apply to any access to non-Oracle data through Oracle's Heterogeneous Services facilities. The most important of these are:
The following examples illustrate basic setu p and use of three materialized views to replicate data from a non-Oracle system to an Oracle data store.
|
< /a>Note: For the f
ollowing examples, Modify these examples for your environment. Do not try to execute them as they are written. p> |
This example creates three materialized views that are then used in succeeding examples.
customer@remote_db.
CREATE MATERIALIZED VIEW pk_mv REFRESH COMPLETE AS SELECT * FROM customer@remote_db WHERE "zip" = 94555;
orders@remote_db and customer@remote_db.
CREATE MATERIALIZED VIEW sq_mv REFRESH COMPLETE AS SELECT * FROM orders@remote_db o WHERE EXISTS (SELECT c."c_id" FROM customer@remote_db c WHERE c."zip" = 94555 and c."c _id" = o."c_id" );
remote_db.
CREATE MATERIALIZED VIEW cx_mv REFRESH COMPLETE AS SELECT c."c_id", o."o_ id" FROM customer@remote_db c, orders@remote_db o, order_line@remote_db ol WHERE c."c_id" = o."c_id" AND o ."o_id" = ol."o_id";
BEGIN db ms_refresh.make('refgroup1', 'pk_mv, sq_mv, cx_mv', NULL, NULL); END; /
BEGIN dbms_refresh.refresh('refgroup1'); END; /
| See Also:
Oracle Database Advanced Rep lication for a full description of materialized views and replication facilities |
The pass-through SQL feature enables you to send a statement directly to a non- Oracle system without being interpreted by the Oracle server. This feature can be useful if the non-Oracle system allows for operatio ns in statements for which there is no equivalent in Oracle.
This section contains the foll owing topics:
You
can execute pass-through SQL statements directly at the non-Oracle system using the PL/SQL package DBMS_HS_PASSTHROUGH.
Any statement executed with this package is executed in the same transaction as standard SQL statements.
The DBMS_HS_PASSTHROUGH package is a virtual package. It conceptually resides at the non-Oracle system. In
reality, however, calls to this package are intercepted by Heterogeneous Services and mapped onto one or more Heterogeneous Services
application programming interface (API) calls. The driver, in turn, maps these Heterogeneous Services API calls onto the API of the
non-Oracle system. The client application should invoke the procedures in the package through a database link in exactly the same way
as it would invoke a non-Oracle system stored procedure. The special processing done by Heterogeneous Services is transparent to the
user.
| See Also:
PL/SQL Packages and Types Reference for more information about this package |
When you execute a pass-through SQL stateme nt that implicitly commits or rolls back a transaction in the non-Oracle system, the transaction is affected. For example, some syste ms implicitly commit the transaction containing a data definition language (DDL) statement. Because the Oracle database server is byp assed, the Oracle database server is unaware of the commit in the non-Oracle system. Consequently, the data at the non-Oracle system can be committed while the transaction in the Oracle database server is not.
If the transac tion in the Oracle database server is rolled back, data inconsistencies between the Oracle database server and the non-Oracle server can occur. This situation results in global data inconsistency.
Note that if the application executes a regular COMMIT statement, the Oracle database server can coordinate the distr
ibuted transaction with the non-Oracle system. The statement executed with the pass-through facility is part of the distributed trans
action.
The following table shows the f
unctions and procedures provided by the DBMS_HS_PASSTHROUGH package that enable you to execute pass-through SQL statemen
ts.
Non-queries include the following statements and types of st atements:
To execute non-query statements, use the
EXECUTE_IMMEDIATE function. For example, to execute a DDL statement at a non-Oracle system that you can access using the
database link salesdb, execute:
DECLARE num_rows INTE GER; BEGIN num_rows := DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE@sal esdb ('CREATE TABLE dept1 (n SMALLINT, loc CHARACTER(10))'); END; /
The variable num_rows is assig
ned the number of rows affected by the execution. For DDL statements, zero is returned. Note that you cannot execute a query with
Bind variables allow you to use the same SQL statement multiple times with different values, reducing the number of times a SQL statement needs to be parsed. For example, when you need to insert four rows in a particular table, you can parse the SQL statement once and bind and execute the SQL statement for each row. One SQL statement can have zero or more bind variables.
To execute pass-through SQL statements with bind variables, you must:
Figure 3-1 shows the flow diagram for executing non-queries with bind variables.
Text descri ption of the illustration heter007.gif
The syntax of the non-Oracle system determines how a statement specifies a bind variable. For example, in Oracle you define bind variables with a preceding colon. For example:
... UPDATE emp SET sal=sal*1.1 WHERE ename=:ename; ...
In this statement, ename is the bind variable. In non-Oracle systems, you may need to s
pecify bind variables with a question mark. For example:
... UPDATE e mp SET sal=sal*1.1 WHERE ename= ?; ...
In the bind variable step, you must positionally associate host program variables (in this ca se, PL/SQL) with each of these bind variables.
For example, to execute the preceding statem ent, you can use the following PL/SQL program:
DECLARE c INTEGER; < a name="1006208"> nr INTEGER; BEGIN c := DBMS_HS_PASSTHROUGH.OPEN_CURSOR@salesdb; DBMS_HS_PASSTHROUGH.PARSE@salesdb(c, 'UPDATE emp SET SAL=SAL*1.1 WHERE ename=?' ); DBMS_HS_PASSTHROUGH.BIND_VARIABLE@salesdb(c,1,'JONES'); nr:=DBMS_HS_PASSTHROUGH.EX ECUTE_NON_QUERY@salesdb(c); DBMS_OUTPUT.PUT_LINE(nr||' rows updated'); DBMS_HS_PASSTH ROUGH.CLOSE_CURSOR@salesdb(c); END; /
In some cases, the non-Oracle system can also support OUT bind variables. With OU
T bind variables, the value of the bind variable is not known until after the execution of the SQL sta
tement.
Although OUT bind variables are populated after the SQL statement is e
xecuted, the non-Oracle system must know that the particular bind variable is an OUT bind variable be
fore the SQL statement is executed. You must use the BIND_OUT_VARIABLE procedure to specify that the bind variable
is an OUT bind variable.
After the SQL statement is executed, you can retrieve
the value of the OUT bind variable using the GET_VALUE procedure.
A bind variable can be both an IN and an OUT variable. This mea
ns that the value of the bind variable must be known before the SQL statement is executed but can be changed after the SQL statement
is executed.
For IN OUT bind variables, you must use the BIND_INOUT_VARI
ABLE procedure to provide a value before the SQL statement is executed. After
the SQL statement is executed, you must use the GET_VALUE procedure to retrieve the new value of the bind variable.
The difference between queries and non-queries is that queries
retrieve a result set from a SELECT statement. The result set is retrieved by iterating over a cursor.
Figure 3-2 illustrates the steps in a pass-through SQL query. After t
he system parses the SELECT statement, each row of the result set can be fetched with the FETCH_ROW procedu
re. After the row is fetched, use the GET_VALUE procedure to retrieve the select list items into program variables. Afte
r all rows are fetched, you can close the cursor.
Text description of the illustration heter008.gif
You do not have to fetch all the rows. You can close the cursor at any time after opening the cursor, for exam ple, after fetching a few rows.
The next ex ample executes a query:
DECLARE val VARCHAR2(100); c INTEGER; nr INTEGER; BEGIN c := DBMS_HS_PASS THROUGH.OPEN_CURSOR@salesdb; DBMS_HS_PASSTHROUGH.PARSE@salesdb(c, 'select ENAME < a name="1006267"> from EMP where DEPTNO=10'); LOOP a> nr := DBMS_HS_PASSTHROUGH.FETCH_ROW@salesdb(c); EXIT WHEN nr = 0; DBMS_HS_P ASSTHROUGH.GET_VALUE@salesdb(c, 1, val); DBMS_OUTPUT.PUT_LINE(val); END LOOP; DBMS_HS_PASSTHROUGH.CLOSE_CURSOR@salesdb(c); END; /
After the SELECT statementhas been parsed, the rows are fetched and printed in a loop unti
l the function FETCH_ROW returns the value 0.
Various relational databases allow stored procedures to return result sets. In other words, stored procedures will be able to return one or more sets of rows.
Traditionally, database stored procedures worked exactly like pr
ocedures in any high-level programming language. They had a fixed number of arguments which could be of types in,
out, or in-out. If a procedure had n arguments, it could return at most n values as res
ults. However, suppose that somebody wanted a stored procedure to execute a query such as SELECT * FROM emp and return t
he results. The emp table might have a fixed number of columns but there is no way of telling, at procedure creation tim
e, the number of rows it has. Because of this, no traditional stored procedure can be created that can return the results of a such a
query. As a result, several relational database vendors added the capability of returning results sets from stored procedures, but e
ach kind of relational database returns result sets from stored procedures in a different way.
Oracle has a datatype called a REF CURSOR. Like every other Oracle datatype, a stored procedure can take this dataty
pe as an in or out argument. In Oracle, a stored procedure can return a result set in the following way. To return a result set, a st
ored procedure must have an output argument of type REF CURSOR. It then opens a cursor for a SQL statement and places a
handle to that cursor in that output parameter. The caller can then fetch from the REF CURSOR the same way as from any o
ther cursor.
Oracle can do a lot more than simply return result sets. REF CURSORs can be passed as input arguments to PL/SQL routines to be passed back and forth between client programs and PL/SQL routines or be
tween several PL/SQL routines.
Sever al non-Oracle systems allow stored procedures to return result sets but do so in completely different ways. Result sets are supported to some extent in DB2, Sybase, Microsoft SQL Server, and Informix. Result set support in these databases is based on one of the foll owing two models.
When creating a stored procedure, the user can expl icitly specify the maximum number of result sets that can be returned by that stored procedure. While executing, the stored procedure can open anywhere from zero to its pre-specified maximum number of result sets. After the execution of the stored procedure, a clien t program can obtain handles to these result sets by using either an embedded SQL directive or calling a client library function. Aft er that the client program can fetch from the result in the same way as from a regular cursor.
In this model, there is no pre-specified limit to the number of result sets that can be returned by a store
d procedure. Both Model 1 and Oracle have a limit. For Oracle the number of result sets returned by a stored procedure can be at most
the number of REF CURSOR out arguments; for Model 1, the upper limit is specified using a directive in the stored proce
dure language. Another way that Model 2 differs from Oracle and Model 1 is that they do not return a handle to the result sets but in
stead place the entire result set on the wire when returning from a stored procedure. For Oracle, the handle is the REF CURSOR
out argument; for Model 1, it is obtained separately after the execution of the stored procedure. For both Oracle and Model 1,
once the handle is obtained, data from the result set is obtained by doing a fetch on the handle; we have a bunch of cursors open an
d can fetch in any order. In the case of Model 2, however, all the data is already on the wire, with the result sets coming in the or
der determined by the stored procedure and the output arguments of the procedures coming at the end. So the whole of the first result
set must be fetched, then the whole of the second one, until all of the results have been fetched. Finally, the stored procedure
As can be seen in the preceding sections, result set support exists among non-Oracle databases in a variety of forms. All
of these have to be mapped onto the Oracle REF CURSOR model. Due to the considerable differences in behavior among the v
arious non-Oracle systems, Heterogeneous Services result set support will have to behave in one of two different ways depending on th
e non-Oracle system it is connected to.
Please note the following about Heterogeneous Servi ces result set support:
REF CURS
OR out arguments from stored procedures. In and in-out arguments will not be supported.REF CURSOR out arguments will all be anonymous REF CURSORs.
No typed REF CURSORs are returned by Heterogeneous Services.Oracle generally behaves such that each result set returned by the non-Oracle system stored procedure is mapped by the
driver to an out argument of type REF CURSOR. The client program sees a stored procedure with several REF CURSOR. After executing the stored procedure, the client program can fetch from the <
code>REF CURSOR in exactly the same way as it would from a REF CURSOR returned by an Oracle stored procedure. Whe
n connecting to the gateway as described in Model 1, Heterogeneous Services will be in cursor mode.
In Oracle, there is a pre-specified maximum number of result sets that a particular stored pro
cedure can return. The number of result sets returned is at most the number of REF CURSOR out arguments for the stored p
rocedure. It can, of course, return fewer result sets, but it can never return more.
For th
e system described in Model 2, there is no pre-specified maximum of result sets that can be returned. In the case of Model 1, we know
the maximum number of result sets that a procedure can return, and the driver can return to Heterogeneous Services a description of
a stored procedure with that many REF CURSOR out arguments. If, on execution of the stored procedure, fewer result sets
than the maximum are returned, then the other REF CURSOR out arguments will be set to NULL.
Another problem for Model 2 database servers is that result sets have to be retrieved in the order in whic h they were placed on the wire by the database. This prevents Heterogeneous Services from running in cursor mode when connecting to t hese databases. To access result sets returned by these stored procedures, you must operate Heterogeneous Services in sequential mode .
In sequential mode, the procedure description returned by the driver contains the followi ng:
out argument of type REF CURSOR (corresponding to the first result set returned by the stored proced
ure)The client fetches from this REF CURSOR and then calls the virtual
package function dbms_hs_result_set.get_next_result_set to get the REF CURSOR corresponding to the next res
ult set. This function call is repeated until all result sets have been fetched. The last result set returned will actually be the
The major limitations of sequentia l mode are as follows:
Oracle ha s five datetime datatypes:
TIMESTAMPTIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONEINTERVAL YEAR TO MONTHINTERVAL DAY TO SECONDHeterogeneous Services generic code supports Oracle datetime datatypes in SQL and stored procedures. Oracle does not suppo rt these datatypes in data dictionary translations or queries involving data dictionary translations.
Even though Heterogeneous Services generic code supports this, support for a particular gateway depends on whether or not the driver for that non-Oracle system has implemented datetime support. Support even when the driver implements it may be partial bec ause of the limitations of the non-Oracle system. Users should consult the documentation for their particular gateway on this issue.< /p>
The user must set the timestamp formats of the non-Oracle system in the gateway initializat
ion file. The parameters to set are HS_NLS_TIMESTAMP_FORMAT and HS_NLS_TIMESTAMP_TZ_FORMAT. The user should
also set the local time zone for the non-Oracle system in the initialization file by setting HS_TIME_ZONE.
| See Also:
Oracle Database SQL Reference for information on datetime datatypes |
Heterogeneous Services provides the infrastructure for the implementation of the two-phase commit mechanism. The ext ent to which this is supported depends on the gateway, and the remote system. Please refer to individual gateway manuals for more inf ormation.
| See Also:
Oracle Data base Administrator's Guide for more information about the two-phase commit protocol |
Earlier versions of gateways had limited support for the LONG dat
atype. LONG is an Oracle datatype that can be used to store up to 2 gigabytes (GB) of character/raw data (LONG RAW
). These earlier versions restricted the amount of LONG data to 4 MB. This was because they would treat LON
G data as a single piece. This led to restrictions of memory and network bandwidth on the size of the data that could be handl
ed. Current gateways have extended the functionality to support the full 2 GB of heterogeneous LONG data. They handle th
e data piecewise between the agent and the Oracle server, thereby doing away with the large memory and network bandwidth requirements
.
There is a new Heterogeneous Services initialization parameter, HS_LONG_PIECE_TRANS
FER_SIZE, that can be used to set the size of the transferred pieces. For example, let us consider fetching 2 GB of LONG
data from a heterogeneous source. A smaller piece size means less memory requirement, but more round trips to fetch all the d
ata. A larger piece size means fewer round trips, but more of a memory requirement to store the intermediate pieces internally. Thus,
the initialization parameter can be used to tune a system for the best performance, that is, for the best trade-off between round-tr
ips and memory requirements. If the initialization parameter is not set, the system defaults to a piece size of 64 KB.
Until Oracle9i, you could not describe non-Oracle system objects using the SQL*Plus DESC
RIBE command. As of Oracle9i, functionality to do this has been added to Heterogeneous Services. There
are still some limitations. For example, using Heterogeneous links, you still cannot describe packages, sequences, synonyms, or type
s.
This section explains some of the constraints that exist on SQL in a distributed environment. These constraints apply to distributed environments that involve access to non-Oracle systems or remote Oracle databases.
This section contains the followin g topics:
|
Note: Many of the rules for heterogeneous access als o apply to remote references. For more information, please see the distributed database section of the Oracle Database Administrator's Guide. |
A statement can, with restrictions, be executed on any database node referenced in the statem
ent or the local node. If all objects referenced are resolved to a single, referenced node, then Oracle attempts to execute a query a
t that node. You can force execution at a referenced node by using the /*+ REMOTE_MAPPED */ or /*+ DRIVING_SITE */
hints. If a statement is forwarded to a different node than the node where the statement was issued, then the statement is sa
id to be remote mapped.
The ways in which statements can, mus t, and cannot be remote mapped are subject to specific rules or restrictions. If these rules are not all followed, then an error will occur. As long as the statements issued are consistent with all these rules, the order in which the rules are applied does not matte r.
Different constraints exist when you are using SQL for remote mapping in a distributed e nvironment. This distributed environment can include remote Oracle databases as well as non-Oracle databases that are accessed throug h Oracle Transparent Gateways or Generic Connectivity agents.
The following section lists some of the different constraints that exist when you are using SQL for remote mapping in a distributed environment.
|
Note: In the examples that follow, |
In Oracle data definition language, the target object syntactically has no place for a rem ote reference. Data definition language statements that contain remote references are always executed locally. For Heterogeneous Serv ices, this means it cannot directly create database objects in a non-Oracle database using SQL.
However, there is an indirect way using pass-through SQL.
Consider the following examp le:
DECLARE num_rows INTEGER; BEGIN num_rows := DBMS_HS_PASSTHROUGH.EXECUTE_IMMEDIATE@remote_db ( 'cr eate table x1 (c1 char, c2 int)' ); END; /
This rule is more restrictive for non-Oracle remote databases than for a remote Oracle database. This is because the remote system cannot fetch data from the originating Oracle database while executing DML statements targeting tables in a non-Oracle system.
For example, to in
sert all local employees from the local emp table to a remote Oracle emp1 table, use the following statemen
t:
INSERT INTO emp@remote_db SELECT * FROM emp;
This statement is remote-mapped to the remote database. The remote-mapped statement sent to the remote datab
ase contains a remote reference back to the originating database for emp. Such a remote link received by the remote data
base is called a callback link.
If callback links are not supported by a particular gateway, then the previous INSERT statements returns the followi
ng error:
ORA-02025: all tables in the SQL statement must be at the remote database
The workaround is to write a PL/SQL block:
DECLARE CURSOR remote_insert IS SELECT * FROM emp; BEGIN FOR rec IN remote_insert LOOP INSERT INTO emp@remote_db (empno, ename, deptno) VALUES ( rec.empno, rec.ename, rec.deptno ); END loop; END; /
Another special case involves session specific SQL functions such as USER, USERENV and SYSDATE. These functions may need to be executed at the originating site. A remote mapped statement containing th
ese functions will contain a callback link. For a non-Oracle database where callbacks are not supported this could (by default) resul
t in a restriction error.
For example, consider the following statement:
DELETE FROM emp@remote_db WHERE hiredate > sysdate;
The statement returns the following error message:
ORA-02070: database REMOTE_DB does not support special functions in this context
This often must be resolved by replacing special functions with a bind variable:
DELETE FROM emp@remote_db WHERE hiredate > :1;
Currently, these column types are not supported for heterogeneous access. Hence, this limitation is not directly encountered.
Note that in our description of Rule B we already encountered special constructs such as callback links and special functions as examples of this.
If the statement is a S
ELECT (or DML with the target table local) and none of the remaining rules would require the statement to be remote mapped, th
en the statement can still be executed by processing the query locally using the local SQL engine and the remote select
operation.
The remote SELECT operation is the operation to retrieve rows for r
emote table data as opposed to other operations like full table scan and index access which retrieve rows of local table data. The re
mote table scan has a SQL statement associated with the operation. A full table scan of table emp1 is issued as SE
LECT * FROM emp1 (with the * expanded to the full column list). Access for indexes is converted back to WHERE cla
use predicates. Also, filters that can be supported are passed down to the WHERE clause of the remote row source.
You can check the SQL statement generated by the Oracle server by explaining the statement and qu
erying the OTHER column of the explain plan table for each REMOTE operation.
| See Also:
Example: Using Index and Table Statistics for more information on how to interpret explain plans with remote references |
For example consider the following statement:
SELECT COUNT(*) FROM emp@remote_db WHERE hiredate < sysdate;
The statement returns the following output:
COUNT(*)
----------
14
1 row selected.
The remote table scan is:
SELECT hiredate FROM emp;
The predicate converted to a filter can
not be generated back and passed down to the remote operation because sysdate is not supported by the remote_db or evaluation rules. Thus sysdate must be executed locally.
This limitation is not directly encountered because table expressions are not supported in the heterogeneo us access module.
For example, consider the following type of statement:
SELECT long 1 FROM table_with_long@remote_db, dual;
This type of statement returns the following error message:
ORA-02025: all tables in the SQL statement must be at the remote database
This can be r esolved by the following type of statement:
SELECT long1 FROM table_with _long@remote_db WHERE long_idx = 1;
When the SQL statement is of the form SELECT...FOR UPDATE OF..., the statement must be mapped to the node on which
the table or tables with columns referenced in the FOR UPDATE OF clause resides.
For example, consider the following statement:
SELECT ename FROM emp@remote_db WHERE hir edate < sysdate FOR UPDATE OF empno;
The statement returns the following error message:
ORA-02070: database REMOTE_DB does not su pport special functions in this context
This rule is not encountered for the heterogeneous access since remote non-Oracle sequences are not supported. The restriction for remote non-Oracle access is already present because of the callback link restrictio n.
This rule is also already covered under the callback link restriction discussed in Rule B.
The workaround for this restriction is to use unique bind variables and bind by number.
As with any remote update, whether non-Oracle or a previous remote update, if a SQL update in an Oracle format is not supported, then an error is returned in th e following format:
ORA-2070: database ... does not support ... in this context.< a name="1006871">
|
Note: These restrictions do not apply to DML with a local target object referencing non-Oracle or remote Oracle database object s. |
You can perform DML to remote Oracle or non-Oracle target t ables in an Oracle format that is not supported by using PL/SQL. Declare a cursor that selects the appropriate row and executes the u pdate for each row selected. The row may need to be unique, identified by selecting a primary key, or, if not available, a rowid.
Consider the following example:
DECLARE
CURSOR c1 IS SELECT empno FROM emp e, dept d
WHERE e.deptno = d.deptno
AND d.dname = 'SALES';
BEGIN
FOR REC IN c1 LOOP
UPDATE emp@remote_db SET comm = .1 * sal
WHERE empno = rec.empno;
END loop;
END;
/
Consider the fol lowing statement where you create a table in the Oracle database with 10 rows:
CREATE TABLE T1 (C1 number);
Analyze the table by issuing the following SQL s tatement:
ANALYZE TABLE T1 COMPUTE STATISTICS;
Now create a table in the non-Oracle system with 1000 rows.
Issue the following SQL statement:
SELECT a.* FROM remote_t1@remote_db a, T1 b
WHERE a.C1 = b.C1;
The Oracle optimizer issues the follo wing SQL statement to the agent:
SELECT C1 FROM remote_t1@remote_db;
This fetches all of the 1000 rows from the non-Oracle system and performs the join in t he Oracle database.
Now, if we add a unique index on the column C1 in the tabl
e remote_t1, and issue the same SQL statement again, the agent receives the following SQL statement for each value of t1:
... SELECT C1 FROM remote _t1@remote_db WHERE C1 = ?; ...
|
|
To verify the SQL execution plan, generate an explain plan for the SQL statement. First load
utlxplan in the admin directory.
Enter the following:
EXPLAIN PLAN FOR SELECT a.* FROM remote_t1@remote_db a, T1 b WHERE a.C1 = b.C1;
Execute the utlxpls utility script by enteri
ng the following statement.
@utlxpls
The operation remote indicates that remote SQL is being referenced.
To find o ut what statement is sent, enter the following statement:
SELECT ID, OTHER FROM PLAN_TABLE WHERE OPERATION = 'REMOTE';
The followin g is an example of the remote join optimization capability of the Oracle database.
The explain plan that uses table s from a non-Oracle system can differ from similar statements with local or remote Oracle table scans. This is because of the limitat ion on the statistics available to Oracle for non-Oracle tables. Most importantly, column selectivity is not available for non-unique indexes of non-Oracle tables. Because of the limitation of the statistics available, the following example is not necessarily what y ou encounter when doing remote joins for yourself and is intended for illustration only.
Consider the following example:
EXPLAIN PLAN FOR SELECT e.ename, d.dname, f.ename, f.deptno FROM dept d, emp@remote_db e, emp@remote_db f WHERE e.mgr = f.empno AND e.deptno = d.deptno AND e.empno = f.empno; @utlxpls
You should see output similar to the following:< /p>
PLAN_TABLE_OUTPUT --------------------------------------------------- ----------------------------- ---------------------------------------------------------- ----------------- | Id | Operation | Name | Rows | Bytes | Cost | Inst |IN-OUT| --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 2000 | 197K| 205 | |* 1 | HASH JOIN | | 2000 | 197K| 205 | | 2 | TABLE ACCESS FULL | DEPT | 21 | 462 | 2 | |* 3 | HASH JOIN | | 2000 | 154K| 201 | | 4 | REMOTE | | 2000 | 66000 | 52 | | 5 | REMOTE | | 2000 | 92000 | 52 | --------------------------------------------------------------------------- PLAN_ TABLE_OUTPUT -------------------------------------------------------------------------------- Query Block Name / Hint Alias (identified by operation id): ----------------------- ------------------------------------ 1 - sel$1 / D 2 - sel$1 / D 3 - sel$1 / F 4 - sel$1 / F 5 - sel$1 / E Predicate Information (identified by operation id): PL AN_TABLE_OUTPUT -------------------------------------------------------------------------------- --------------------------------------------------- 1 - access("E"."DEPTNO"="D"."DEPTNO") 3 - access("E"."MGR"="F"."EMPNO" AND "E"."EMPNO"="F"."EMPNO")
Issue the following statement:
< a name="1007022">SET long 300 SELECT other FROM plan_table WHERE operation = 'REMOTE'; < /a>
You should see output similar to the following:
OTHER -------------------------------------------------------------------------------- SELECT "EMPNO","ENAME","DEPTNO" FROM "EMP" SELECT "EMPNO","ENAME","MGR","DEPTNO" FRO M "EMP" SELECT "EMPNO","ENAME","DEPTNO" FROM "EMP" SELECT "EMPNO","ENAME","MGR","DEPTNO" FROM "EMP"
For instance, the earlier example can be rewritten to the form:
SELECT v.ename, d.dname, d.deptno FROM dept d, (SELECT / *+ NO_MERGE */ e.deptno deptno, e.ename ename emp@remote_db e, emp@remote_db f WHERE e.mgr = f.empno AND e.empno = f.empno; ) WHERE v.deptno = d.deptno;
This guarantees a
remote join because it has been isolated in a nested query with the NO_MERGE hint.
|
Copyright © 2001, 2003 Oracle Corporation All Rights Reserved. |
|