begin process at 2008 08 08 23:23:08
1 223 648 membres
406 nouveaux aujourd'hui
14 230 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Importation de données massives [ SQL Server, MSDE, SQL Express / Divers ] (Arthenius)

Importation de données massives le 06/03/2008 12:14:13

Arthenius
Membre Club
Hello à tous

je suis entrain de bosser sur des importations de données de fichier plat vers notre serveur SQL.

  • Le principe :
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 ON
GO
SET QUOTED_IDENTIFIER ON
GO
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


  • Mon problème :
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..."


Re : Importation de données massives le 08/03/2008 19:37:50

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à...

Re : Importation de données massives le 10/03/2008 08:43:03

Arthenius
Membre Club

ben plusieurs fichiers a plus de 4 millions

bon je craignais ce genre de reponse

ben on va tacher d'optimiser

merci a toi



Arthenius
http://blogs.developpeur.org/Arthenius/

"Ce qui ne me tue pas, me rend plus fort..."



Classé sous : insert, table, variables, destination, tmp

Participer à cet échange

Pub



Appels d'offres

Snippets en rapport

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS