SQL*Net message de dblink attendre événement dans Oracle
J'ai une requête d'INSERTION dans Oracle 10g qui est coincé sur un "SQL*Net message de dblink" de l'événement. Il ressemble:
INSERT INTO my_table (A, B, C, ...)
SELECT A, B, C, ... FROM link_table@other_system;
Je ne vois pas de verrous my_table
en plus de celui de l'INSERT, je suis en train de faire. La requête SELECT sur link_table@other_system
se termine sans aucune difficulté lors de courir sur son propre. Je ne reçois que ce problème lorsque j'essaie de faire de l'INSERTION.
Personne ne sait ce qui pourrait se passer ici?
Mise à JOUR
La sélection retourne 4857 lignes de ~1.5 minutes lorsque vous exécutez seul. L'INSERT a été l'exécution de plus d'une heure avec ce message en attente de l'avant, j'ai décidé de le tuer.
Mise à JOUR
J'ai trouvé une erreur dans mes méthodes. J'ai été en utilisant une plage de dates pour limiter les résultats. La plage de dates que j'ai utilisé lors de l'essai de la SÉLECTIONNER seulement était avant la dernière OraStats exécuter sur le link_table, mais la plage de dates que j'ai utilisé lors de l'essai de l'INSERTION a été après la dernière OraStats exécuter sur le link_table. Donc, que me tromper de croire qu'il y avait un problème avec l'INSERT. Pas très scientifique de moi; mon erreur.
- Est le
SELECT
vraiment frapper un tableau sans prédicat? Ou est-il en train de faire des jointures et des filtres? Est le plan de requête de même pour l'autonomeSELECT
et laINSERT ... SELECT
? - Vous m'avez pris. Il y a quelques jointures, mais tous sur le même dblink. Comment puis-je voir le plan de requête?
Vous devez vous connecter pour publier un commentaire.
Êtes-vous à l'aide d'un
/*+ driving_site(link_table) */
conseil pour rendre Oracle effectuer les jointures sur le serveur distant?Si donc, l'astuce sera pas travailler avec DML, comme l'explique Jonathan Lewis sur cette page.
Cela peut être l'un des rares cas où l'exécution de la requête comme une
SELECT
utilise un autre plan que l'exécution de la requête dans le cadre d'unINSERT
. (Vous aurez certainement envie d'apprendre comment générer des plans d'explication dans votre environnement. La plupart des outils ont un bouton pour ce faire.)Comme Andras Gabor recommandé dans le lien, vous souhaiterez peut-être utiliser PL/SQL
BULK COLLECT
pour améliorer les performances. Cela peut être l'un des rares cas où PL/SQL va travailler plus vite que SQL.driving_site
indice corrigé de la question sur la SÉLECTIONNER dans la lumière de ma deuxième mise à jour.SQL*Net message from dblink
signifie généralement que votre système est en attente sur le réseau de transfert des données à travers le réseau. C'est tout à fait normal d'attendre un événement pour ce genre de requête.Combien de lignes le
SELECT
déclaration de revenus? La quantité de données (en MO/GO) ne fait que représenter?Quand vous dites qu'il "se termine sans aucune difficulté sur ses propres", êtes-vous réellement récupération de toutes les données? Si vous utilisez quelque chose comme le CRAPAUD ou SQL Developer, le GUI généralement aller chercher les N premières lignes et de revenir à vous. Qui peut être très rapide, mais il n'implique pas que la base de données est effectuée en cours d'exécution de la requête-- il peut prendre beaucoup plus de temps pour terminer la production de toutes les lignes de votre requête va revenir. Il est assez commun pour les gens à mesurer le temps nécessaire pour récupérer les N premières lignes plutôt que le temps de récupérer la dernière ligne-- votre instruction INSERT, évidemment, ne peut pas revenir jusqu'à ce que toutes les lignes ont été récupérés à partir de la table distante.