Je le code ci-dessous pour insérer les non transformés (processed=0
) les enregistrements de serveur 1 au serveur 2 (en utilisant des serveurs liés), et une fois inséré, il devrait être mis à jour processed=1
procédure stockée est trop lent (en utilisant CURSOR)
Je suis juste en utilisant
requête 1:
INSERT INTO SELECT FROM WHERE processed=0
UPDATE processed=1 WHERE processed=0
requête 2:
DECLARE pending_records CURSOR LOCAL FOR
SELECT FROM WHERE processed=0
OPEN pending_records
FETCH NEXT FROM pending_records INTO @UniqueID
WHILE @@FETCH_STATUS=0
BEGIN
INSERT INTO SELECT FROM WHERE [email protected]
IF @@ROWCOUNT=1 .... UPDATE processed=1 WHERE [email protected]
FETCH NEXT FROM pending_records INTO @UniqueID
END
CLOSE pending_records
DEALLOCATE pending_records
Requête 1 est super rapide et la requête en utilisant le curseur est trop lent (prend 30 secondes pour les mises à jour 1 enregistrements)
Je reste loin de la requête 1 parce que s'il y a une défaillance dans la base de données, cela affectera la enregistrements. Remarque: Je ne peux pas utiliser DISTRIBUTED TRANSACTION
pour le moment car il nécessite une configuration supplémentaire.
'INSÉREZ DANS SÉLECTION À PARTIR DE LÀ O' ... Les noms des tables peuvent être composés si vous avez peur que nous les arrêtions de vous. Le moins que vous puissiez faire est de rassembler un échantillon qui peut compiler. –
@ZoharPeled je peux. Je viens juste de noter une chose maintenant, sans le 'IF @@ ROWCOUNT = 1 .... UPDATE traité = 1 WHERE UniqueID = @ UniqueID' cela prend seulement 3 secondes pour compléter 400 enregistrements. Avec la commande de mise à jour, cela prend presque 15 minutes (pour 400 enregistrements) – Rauf
Alors s'il vous plaît [modifier] votre question afin que nous puissions voir le code qui a du sens. En outre, il serait probablement utile si nous savions quelle table est sur quel serveur. –