Sélectionner et Insérer à travers dblink
Je vais avoir un peu de difficulté avec un select into insérer dans un dblink dans oracle 10. Je suis à l'aide de l'instruction suivante:
INSERT INTO LOCAL.TABLE_1 ( COL1, COL2)
SELECT COL1, COL2
FROM REMOTE.TABLE1@dblink s
WHERE COL1 IN ( SELECT COL1 FROM WORKING_TABLE)
Quand je lance la déclaration de la suivante est ce qui est exécuté sur le serveur distant sur la DB Lien:
SELECT /*+ OPAQUE_TRANSFORM */ "COL1", "COL2"
FROM "REMOTE"."TABLE1" "S"
Si je lance le sélectionner uniquement et ne font pas l'insérer dans le suivant est exécuté:
SELECT /*+ */ "A1"."COL1"
, "A1"."COL2"
FROM "REMOTE"."TABLE1" "A1"
WHERE "A1"."COL1" =
ANY ( SELECT "A2"."COL1"
FROM "LOCAL"."TABLE1"@! "A2")
La question est dans l'insert cas, le enitre tableau est tiré à travers la dblink et limité en local qui prend un peu juste de temps compte tenu de la taille de la table. Est-il une raison de l'ajout de l'insérer serait de modifier le comportement de cette manière?
OriginalL'auteur Domtar | 2010-03-17
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser le driving_site soupçon. Il y a une bonne explication ici:
http://www.dba-oracle.com/t_sql_dblink_performance.htm
OriginalL'auteur Rene
Quand il s'agit de DML, oracle choisit de l'ignorer tout driving_site soupçon et exécute l'instruction au niveau du site cible. Donc je doute que si vous voulez être en mesure de changer cela (même AVEC l'aide de l'approche décrite ci-dessus). Une solution possible est que vous pouvez créer un synonyme pour les LOCAUX.TABLE1 sur la base de données à distance et d'utiliser le même dans votre instruction INSERT.
OriginalL'auteur
En tirant parti de la clause pourrait optimiser votre récupération de votre jeu de travail:
OriginalL'auteur T.j.
Oracle va ignorer la driving_site astuce pour insérer des états, comme DML est toujours exécuté localement. La façon de le faire est de créer un curseur avec la conduite site d'indice, et ensuite une boucle à travers le curseur avec un bulkcollect/forall et l'insérer dans la table locale.
OriginalL'auteur NMR
Quelle est la taille de WORKING_TABLE ?
Si il est assez petit, vous pouvez essayer de sélectionner à partir de work_table dans une collection, et en passant ensuite les éléments de recueillir le plus d'éléments dans une liste.
Êtes-vous en mesure de créer une table temporaire globale sur le côté éloigné de la liaison ? Vous pouvez insérer dans celle de la table de travail, puis la jointure seraient tous être sur le côté éloigné.
OriginalL'auteur Gary Myers
Insérer dans zith cardinalité astuce semble bien fonctionner dans 11.2
OriginalL'auteur Lavallee Alain