Je mets en place un système d’import de table à table sur une base de données SQL Server 2000 de 60 GO, plusieurs dizaines de millions de lignes à importer.
Le problème qui se pose lorsque je fais la requête en un bloc est une saturation du journal de transaction.
Une solution serait d’importer en plusieurs blocs plus petits (par bloc d’un million).
L’instruction BULK INSERT avec le paramètre BATCH SIZE ne fonctionne pas pour l’importation de table à table.
J’ai utilisé l’astuce avec ROWCOUNT en faisant bien attention de ne pas réinsérer deux fois la même ligne si elle a déjà été insérée, mais j’ai comme même des erreurs de violation de clé primaires, je ne comprends pas :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SET ROWCOUNT 1000000 Encore: BEGIN TRANSACTION Insert tabledestination( Select * from tablesource Where ID not in ( Select ID from tabledestination) ) END TRANSACTION IF @@ROWCOUNT > 0 GOTO Encore: SET ROWCOUNT 0
J'ai trouvé cette technique en parcourant le forum, cependant le ROWCOUUNT est encapsulé dans la transaction ce qui ne semble pas fonctionner, il passe une seule fois dans la boucle:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 declare @startId numeric declare @rows int SELECT @rows = 10000 while @rows > 0 begin BEGIN TRANSACTION SET rowcount 10000 SELECT @startId = isnull(max(id), 0) FROM nouvelle_table INSERT nouvelle_table SELECT * FROM ancienne_table WHERE id > @startId SELECT @rows = @@rowcount dump transaction ma_db TO "/chemin....." COMMIT TRANSACTION SET rowcount 10000 end
Si vous avez une autre technique optimisée pour l’importation de gros volumes de données qui ne sature pas le journal de transaction (pas avec DTS mais avec des requête T-SQL) je suis preneur.
Partager