Accueil > Forum > > > > Importation de données massives
Importation de données massives
jeudi 6 mars 2008 à 12:14:13 |
Importation de données massives

Arthenius
|
Hello à tous je suis entrain de bosser sur des importations de données de fichier plat vers notre serveur SQL. Je récupère un fichier Txt que j'importe dans une table temporaire TMP_maTable. ====>BULKINSERT Puis je creer une procedure stockee qui va parcourir tout les enregistrement de cette table TMP_maTable et faire des INSERTS / UPDATE dans mes tables destination, en récupérant au passage les différentes clés étrangères dont ma table de destination pourrait avoir besoin....en faisant des mise à jour ou des insert dans d'autre tables liées, etc.... Il arrive sur certaine table qu'un insert declenche l'execution d'un trigger, et il faut que cela soit fait. ci dessous un exemple de SP que je genere SET ANSI_NULLS ONGO SET QUOTED_IDENTIFIER ONGO DROP PROCEDURE [dbo].[IMPORT_ma_table_destination] GO CREATE PROCEDURE [dbo].[IMPORT_ma_table_destination] AS BEGIN SET NOCOUNT ON --Delete de la table DELETE FROM ma_table_destination; DECLARE @mes_variables_TMP varchar(50), .........; DECLARE @mes_variables_destination uniqueidentifier, .... DECLARE Cur_ CURSOR FOR SELECT * FROM TMP_ma_table_temp; Open Cur_ -- Boucle sur le curseur et exécution des requetes FETCH NEXT FROM Cur_ INTO @mes_variables_TMP, .....; WHILE@@Fetch_Status = 0 BEGIN -- traitement pour remplir les variables à insérer ! SET @var_dest1 = newid(); SET @var_dest2 = NULL; SELECT @var_dest2 = FK FROM T_ma_table_foreignkey WHERE Moncode = @une_de_mes_variable_tmp; -- ......... INSERT INTO ma_table_destination ( mes_champs,....... ) VALUES ( @mes_variables_destination ..... ); IF @Une_des_valeurs = 'TOTO' BEGIN INSERT INTO une_autre_table values (.........................); END FETCH NEXT FROM Cur_ INTO @mes_variables_TMP, .....; END -- Fermeture du curseur et libération des ressources Close Cur_ Deallocate Cur_ END
C'est long  sur des fichiers de plusieurs millions de ligne c'est tres long....(environ 20h...), alors que je tape a chaque fois sur des zones indexe... je me suis dis si j'essayais SSIS, seulement voila j'ai reussi a bidouiller quelques trucs, mais je ne suis pas arriver au même resultat que ce que j'etais capable de faire avec ma SP...genre mettre a jour une table etrangere apres l'insert dans ma table finale etc... => je ne maitrise pas l'outil  bref existe-t-il un moyen d'augmenter les perfs de ce genre d'import en gardant mon principe de procedure stockee, la possibilite de faire des insert a droite a gauche, de declencher ou non certain trigger......  
Arthenius http://blogs.developpeur.org/Arthenius/
"Ce qui ne me tue pas, me rend plus fort..."
|
|
samedi 8 mars 2008 à 19:37:50 |
Re : Importation de données massives

yann_lo_san
|
Salut,
Heu, ça t'arrive souvent le : 'sur des fichiers de plusieurs millions de ligne' ?
Sinon "Integration Services" est un bon outil pour ce genre de chose, on peut tout faire avec, mais au niveau des perfs ça changera pas grand chose. La seule solution est d'améliorer ta procédure par tous les moyens, si ton curseur est LOCAL et FORWARD_ONLY, autant utiliser une boucle WHILE ou revoir la méthode du ligne par ligne et essayer dans la mesure du possible de penser bloc. Mais bon, je pense que tu le sais déjà...
|
|
lundi 10 mars 2008 à 08:43:03 |
Re : Importation de données massives
|
mercredi 12 novembre 2008 à 20:59:19 |
Re : Importation de données massives

hymnuade
|
Oh que si SSIS sera plus rapide, transformation massive sur un dataset en cache plutôt qu'une lecture ligne par ligne via un curseur.
Sincèrement SSIS. De plus, certains éléments via du VB.Net peuvent être bcp plus rapide que via le moteur SQL.
Bien utilisé, il résoudra bcp de problème.
|
|
jeudi 13 novembre 2008 à 08:39:17 |
Re : Importation de données massives

Arthenius
|
tu pense donc qu'en faisdant un programme plutot qu'une sp cela pourrait etre plus rapide ?? a tu de bon lien pour ssis ?? merci de ta reponse
Arthenius "Ce qui ne me tue pas, me rend plus fort..."
|
|
jeudi 13 novembre 2008 à 09:59:00 |
Re : Importation de données massives

hymnuade
|
Le msdn bien sûr :-)
Sinon, un très bon bouquin "Professional SQL server 2005 Integration Services" trouvable au format chm. Il contient à la fin une étude de cas très intéressante. Un programme plus rapide qu'une sp ... sais pas, mais plus rapide qu'un curseur, je pense sincèrement que oui.
Sinon, quelques remarques qui s'appliquent à SSIS au SQL ou au 2 : 1. Tu fais un DELETE de ta table au début sans condition. Donc, tu peux utiliser un TRUNCATE peut-être, plus rapide, remise à zéro du compteur auto s'il y a, et surtout, selon ton mode de log, les DELETE sont très longs à inscrire alors qu'un TRUNCATE est une opé unique. 2. Dans ton exemple, je crois avoir vu que tu récupérais ligne par ligne les valeurs des id des FK en fonction de leur valeur. En SSIS, tu pourras massiver tout ça via un merge ou un lookup ou tout autre selon ton approche. Cad, fusionner 2 dataset; 1 équivalent à ta table temporaire, l'autre à la table de référence, les joindre via la clé de valeur de texte (La, y'a pas le choix à première vue) et paramétrer une sortie avec la clé récupérée uniquement. 3. Tu fais un INSERT INTO ligne par ligne ... très très long sans compter encore une fois le mode de log. Tu dois avoir un LDF énorme. Or via SSIS, tu vas pouvoir constituer et transformer ton dataset selon tes besoins puis tout insérer d'un coup via une destination SQL Server ou OleDb.
Sincèrement, gain de temps non négligeable je pense.
|
|
jeudi 13 novembre 2008 à 10:07:33 |
Re : Importation de données massives

Arthenius
|
je vais mediter sur tout cela merci en tout cas pour tes pistes
Arthenius "Ce qui ne me tue pas, me rend plus fort..."
|
|
dimanche 1 mars 2009 à 20:59:01 |
Re : Importation de données massives

Malkuth
|
Réponse acceptée !
Un curseur pour faire ca??? je vois pas l'intérrer, le SQL c'est pas fais pour faire de l'itératif, il Faut Réfléchir en therme d'ensemble :
pourquoi une boucle dans laquel tu fais un insert avec au préalable un précalcule alors que tu peux faire un truc du genre
INSERT INTO Final1 ( C1,C2,C3) SELECT CA, newID(); (SELECT truc FROM Bidule WHERE Machin = Source.B) FROM Source
pour l'insert conditionnel dans ta boucle tu fais
INSERT INTO Final2 ( C1,C2,C3) SELECT CA, newID(); (SELECT truc FROM Bidule WHERE Machin = Source.B) FROM Source Where C = N'Toto'
tu vas voir qu'en te métant a réfléchir de cette maniére et en vacuant les reflexe de programation classique (Bouble, itération etc...) les perfs n'ont plus rien a voir!
|
|
lundi 2 mars 2009 à 10:46:36 |
Re : Importation de données massives

Arthenius
|
je vais tester cette méthode, effectivement avec des case when et autre on peu ce passer de la boucle et autre test, reste a voir au niveau perf. J'ai juste sur certain traitement des insert dans d'autre table (par exmple une table User mise a jour par les utilisateur ayant saisie une commande) ==> il faudra que je parcourt les different user avant et que je fasse les insert en amont de mon import de commande merci je regarde tout ca et je reposte :)
Arthenius "Ce qui ne me tue pas, me rend plus fort..."
|
|
lundi 2 mars 2009 à 12:21:30 |
Re : Importation de données massives

Malkuth
|
Réponse acceptée !
Niveau perf, aucun doute à avoir, SQL serveur optimiseras bien mieux un insert massif qu'une sucsession de millions d'insert (fais un tit code simple avec et sans urseur pour t'en convaincre), c'est même a cette condition que SQL prend son vrai sens. D'une maniére général les curseurs sont a proscrire, les cas ou ils s'avére nésséssaire sont trés rares et le plus souvent ils sont signe d'un défaut de "vision", le probléme c'est qu'un programmeur "classique" se dirigera facilement vers cette solution car elle lui est familiére en programation SQL c'est une erreur trés courrante d'optimisation.
Concernant ton probléme de table lié : admetons les tables suivantes :
ImportSource(Nom (nvarchar), Catégorie (nvarchar)) Catégories(ID (int auto), Nom (nvarchar)) Personnels(ID (int auto), Nom(nvarchar), ID_Cat (int))
Tu commence par traiter l'ajout des nouvelle Catégorie :
INSERT INTO Catégories (Nom) SELECT DISTINCT Catégorie FROM ImportSource WHERE Catégorie NOT IN(SELECT Nom From Catégories) La clause where permet de ne pas ajouter les catégories déjà existante, le Distinct évite d'ajouter une nouvelle catégorie qui aparaitrait 2 fois dans la ImportSource.
Ensuite tu ajoute les Personnels :
INSERT INTO Personnels (Nom, ID_Cat) SELECT ImportSource.Nom, Catégories.ID FROM ImportSource. INNER JOIN Catégories ON ImportSource.Catégorie = Catégorie.Nom
Grace à une jointure, il est maintenant aisé de reconstruire les dépandances ^^
Dans le cas présent, un Index sur Catégories.Nom seras trés profitable pour la rapiditée des requettes. les INDEX sont LE facteur d'optimisation Premier d'une base de donnée aprés la conception des requettes elles même.
|
|
Cette discussion est classée dans : insert, table, variables, destination, tmp
Répondre à ce message
Sujets en rapport avec ce message
[Heritage]insert [ par Bronks_78 ]
Bonjour tout le monde . Voila, jai une table adherent et une table pilote qui herite de la table adherent. Je voudrais savoir comment inserez une vale
insertion de nombre de 1 à N [ par ftug ]
Bonjour,j'aimerai inserer dans une table des nombre de 1 à N avec le moins de requetes possible ( le serveur SQL est déjà bien chargé )pour l'instant
Optimisation de requete [ par Antilope ]
Bonjour,J'effectue une boucle sur un cursor puis à l'interieur de la boucle un insert dans une table.Du type :for r1 in c1 loop ...... insert into
requete insert avec select!! [ par othland ]
Bonjour tout le monde!je dois inserer un tuple dans ma table T1 dont un element doit être tiré par un select d'une autre table T2, or je n'arrive pas
Problème Requête SQL INSERT INTO sous access [ par bonnaud ]
Bonjour,J'ai un problème avec une requête INSERT INTO.En fait je veux insérer dans une BDD des champs d'une autre table. Le problème qu'en j'insère ce
insert into cherche exemple ... SVP! [ par trexor ]
Voilà, c'est pas que j'en ai marre mais je pète un peu les plonds. Pour insérer des données dans une bas access, c'est vraiment la merde avec vb.net!l
Utilisation des variables memoire dans la commande SQL INSERT INTO [ par Omer Pitou ]
BONJOUR A TOUS ET MERCI D'AVANCE POUR VOTRE ASSISTANCE. Mon probleme est celui-ci : j'ai deux variables X,Y predefinies et dont les valeurs changent s
Insertion d'une variable dans table sql [ par jlmzk ]
Salut à tous.Voila c'est tout simple, j'ai une variable $bc dont la valeur peut être par exemple AB01Si je fais un echo $bc; j'ai bien AB01 qui s'affi
INSERT INTO ok via ACCESS Too few parameter via ODBC [ par Frederick_Etudiant ]
Bonsoir à tous,Je n'arrive pas à résoudre un problème et encore moins à le comprendre.Je travaille avec Java et ACCESS, je crée une table et juste ens
insert into/select [ par boubou2412 ]
salut tout le monde,je suis certaine qu'il ya une faute dans ma requete j'aimerais bien savoir comment la corriger, bon j'ai un table X qui contient p
Livres en rapport
|
Derniers Blogs
WORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBEWORKFLOW FOUNDATION 3 A UN PIED DANS LA TOMBE par JeremyJeanson
Depuis déjà un an, je conseille vivement les utilisateurs de Workflow Foundation 3 à migrer vers la version 4. L'information qui va suivre ne devrait donc pas trop prendre au dépourvu les personnes qui m'ont suivi. Je profite de ce poste, pour faire le re...
Cliquez pour lire la suite de l'article par JeremyJeanson TECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PCTECHDAYS PARIS 2012 : NOUVELLES TENDANCES DU POSTE DE TRAVAIL - BRING YOUR OWN PC par ROMELARD Fabrice
Speakers: Thierry Rapatout, Antoine Petit et Xavier Trebbia Cette session entre dans le cadre des RDV Décideurs des TechDays 2012, elle est liée à la consumérisation de l'IT et la mise en place du "DeskTop as a Service" dans de plus en ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLETECHDAYS PARIS 2012 : SYSTEM CENTER SERVICE MANAGER 2012 VUE D'ENSEMBLE par ROMELARD Fabrice
Speakers: Julien Marechal, Gautier Confiant, Sébastien MEYER La session débute par le positionnement de la solution System Center par rapport aux concepts d'organisation ITIL. Le portail du catalogue de se...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : PLEINIèRE SECOND JOURTECHDAYS PARIS 2012 : PLEINIèRE SECOND JOUR par ROMELARD Fabrice
Après une première journée dédiée aux développeurs, cette seconde journée est dédiée au monde des entreprises et de ses applications. Ainsi, cette pleinière est dédiée à faire un 360 de l'évolution des applications Business aux demandes ac...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2012 : RETOUR D'EXPéRIENCE SUR LA MISE EN PLACE D'UN CLOUD PRIVéTECHDAYS PARIS 2012 : RETOUR D'EXPéRIENCE SUR LA MISE EN PLACE D'UN CLOUD PRIVé par ROMELARD Fabrice
Speaker : Guillaume Rochette Cette session est dédiée à fournir le retour sur la mise en place d'un cloud privé (IaaS) par Osiatis pour son compte ou celui de ses clients. Ce projet s'est déroulé sur 4 mois et a permis de faire évoluer...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Logiciels
Academy System (17.2.1.0)ACADEMY SYSTEM (17.2.1.0)Logiciel de gestion des établissements.
- élèves/étudiants (inscription, dossier, absence...)
-... Cliquez pour télécharger Academy System Easy-Planning (1.0.0.1)EASY-PLANNING (1.0.0.1)Basé sur les mêmes principes que MyPlanning, Easy-Planning permet de créer des plannings sous la ... Cliquez pour télécharger Easy-Planning COLLECTOR PLUS (3.00B)COLLECTOR PLUS (3.00B)COLLECTOR PLUS version 3.00B est un logiciel utilisant une base de données alimentée par :
- L... Cliquez pour télécharger COLLECTOR PLUS PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO (V7.4)PONAMEDIA TV DEVIENS HELLLOOO FLASH
LA TV SUR VOTRE ORDINATEUR.
Toute une plateforme Multi... Cliquez pour télécharger PONAMEDIA PREMIUM - HELLLOOO FLASH DEMO LettresFaciles 2011 (8.0.0.1)LETTRESFACILES 2011 (8.0.0.1)LettresFaciles est un logiciel facilitant la création et la rédaction de lettres types.
Son inte... Cliquez pour télécharger LettresFaciles 2011
|