2010-06-28 21 views
0

29 juin 2010 - J'ai eu une action non-validée à partir d'une instruction delete précédente. J'ai commis l'action et j'ai eu une autre erreur à propos des identifiants primaires en conflit. Je peux réparer cela. Alors le moral de l'histoire, commettez vos actions.La requête de serveur lié s'exécute mais ne se termine pas?

Original Question -

Je suis en train d'exécuter cette requête:

with spd_data as (
select * 
from openquery(IRPROD,'select * from budget_user.spd_data where fiscal_year = 2010') 
) 

insert into [IRPROD]..[BUDGET_USER].[SPD_DATA_BUD] 
    (REC_ID, FISCAL_YEAR, ENTITY_CODE, DIVISION_CODE, DEPTID, POSITION_NBR, EMPLID, 
    spd_data.NAME, JOB_CODE, PAY_GROUP_CODE, FUND_CODE, FUND_SOURCE, CLASS_CODE, 
    PROGRAM_CODE, FUNCTION_CODE, PROJECT_ID, ACCOUNT_CODE, SPD_ENC_AMT, SPD_EXP_AMT, 
    SPD_FB_ENC_AMT, SPD_FB_EXP_AMT, SPD_TUIT_ENC_AMT, SPD_TUIT_EXP_AMT, 
    spd_data.RUNDATE, HOME_DEPTID, BUD_ORIG_AMT, BUD_APPR_AMT) 
SELECT REC_ID, FISCAL_YEAR, ENTITY_CODE, DIVISION_CODE, DEPTID, POSITION_NBR, EMPLID, 
     spd_data.NAME, JOB_CODE, PAY_GROUP_CODE, FUND_CODE, FUND_SOURCE, CLASS_CODE, 
     PROGRAM_CODE, FUNCTION_CODE, PROJECT_ID, ACCOUNT_CODE, SPD_ENC_AMT, SPD_EXP_AMT, 
     SPD_FB_ENC_AMT, SPD_FB_EXP_AMT, SPD_TUIT_ENC_AMT, SPD_TUIT_EXP_AMT, 
     spd_data.RUNDATE, HOME_DEPTID, lngOrig_amt, lngAppr_amt 
    from spd_data 
left join Budgets.dbo.tblAllPosDep on project_id = projid 
            and job_code = jcc and position_nbr = psno 
            and emplid = empid 
where OrgProjTest = 'EQUAL'; 

Fondamentalement, je sélectionne une table de IRPROD (un oracle db), rejoignant avec une table locale, et l'insertion des résultats sur IRPROD.

Le problème que j'ai est que pendant que la requête s'exécute, elle ne s'arrête jamais. Je l'ai laissé courir pendant une heure et ça continue jusqu'à ce que je l'annule. Je peux voir sur un moniteur de bande passante sur les données SQL Server entrant et sortant. En outre, si je viens d'exécuter la partie select de la requête, elle renvoie les résultats en 4 secondes.

Des idées pour lesquelles ce n'est pas fini? J'ai d'autres requêtes installées d'une manière similaire et je n'ai aucun problème (accordé ces insertions à partir de tables locales et non d'une table distante).

+0

Avez-vous regardé le côté Oracle du tout? C'est là où vous insérez, c'est là que les verrous et les contraintes seraient probablement. –

+0

@Stephanie N'a pas regardé le côté Oracle. S'il y avait une contrainte, une erreur ne se produirait-elle pas? Je vais vérifier de plus près de ce côté mais mon problème est que je ne suis pas aussi familier avec Oracle que je suis SQL Server. –

+0

Créer une table, avec une seule colonne, contrainte unique. Commencer deux insert de session 1 à partir d'une session, puis insérer 1 à partir de la seconde. Le second attendra que le premier commette ou soit annulé. Il y a seulement une erreur si on commet. Mais il peut attendre pour toujours. Mais quelles attentes indéterminées POSSIBLE pourriez-vous rencontrer READING de SQL Server? Oui, il y a probablement 1 thread mais mais pourquoi regarder le côté avec ZERO chance de bloquer? Seulement parce que vous êtes le plus familier? C'est comme regarder la jauge de carburant vide dans la voiture et se demander pourquoi il n'y a pas de gaz qui sort de la pompe. –

Répondre

0

Vous n'avez inclus aucune mesure de volume. Mais je recommanderais d'utiliser une table temporaire pour rassembler les résultats.

Ensuite, vous devriez essayer d'insérer les deux premières lignes. Si cela réussit, vous aurez un fort indice que tout va bien. Essayez de répartir chaque tâche d'insertion par project_id ou emplid pour éviter les journaux de transactions volumineux.

Vous devriez également penser à l'élaboration d'un processus de traitement par lots en vrac.

+0

Évitez les journaux de transactions volumineux de quel côté? Oracle? Ce n'est pas vraiment une préoccupation. Chaque insertion contiendra la même quantité de journal des transactions, quelle que soit la fréquence de validation. Parlez-vous de Rollback Space ou Undo Space? Lot en vrac? Ceci est Bulk Batch (Semble redondant). Il fait toutes les lignes, tout à la fois ... Lot; par opposition à un à la fois ... Transactionnel. –

+0

J'essayais d'éviter une table temporaire, mais c'est ce que j'ai fini par faire de toute façon. Je ne comprends pas ce qu'est un traitement par lots en vrac, je pensais que c'était ce que je faisais. –

+0

Les serveurs liés ont des problèmes différents. Une chose que j'essaie toujours d'éviter est de déplacer de gros morceaux de données à travers le fil. Et la meilleure façon de le faire est de trouver une bonne clé de partition pour diviser les données en plus petits morceaux. Je parle de 25k à 50k lignes et plus. Je parie que s'il le fait, l'importation réussira. –

0

Si vous exécutez la sélection sans l'insertion, combien d'enregistrements sont renvoyés? Les données semblent-elles correctes ou y a-t-il plusieurs enregistrements en raison de la jointure?

Y a-t-il des déclencheurs sur la table dans laquelle vous insérez? Si vous renvoyez de nombreux enregistrements et que des triggers sont sur la table et qu'ils sont conçus pour exécuter row-byrow, cela pourrait ralentir les choses. Vous envoyez également à un autre serveur, de sorte que le pipeline réseau peut être ce qui vous ralentit. Peut-être qu'il serait préférable d'envoyer les données de budget au serveur Oracle et de faire l'insertion à partir de là plutôt que de SQL Server.

+0

Lorsque je viens de courir la sélection, les données semblaient correctes. Pas de déclencheurs sur la table. Je suis sûr que le réseau me ralentit, mais comme je l'ai dit, j'ai d'autres emplois similaires qui fonctionnent bien. –