IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

[TSQL] Rapidité d'exécution lors d'une migration de données d'une base à une autre


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 8
    Points
    8
    Par défaut [TSQL] Rapidité d'exécution lors d'une migration de données d'une base à une autre
    Bonjour à tous!

    Que je vous explique mon problème...

    Mon travail actuel consiste en la migration de données (données de production et de configuration d'un logiciel) d'une base SQL Server 2005 'A' vers une autre base SQL Server 'B'.

    Bien que la fonction première de ces deux bases est sensiblement la même, leur modèle de données est vraiment très différent.

    Pour ce faire, j'ai développé des scripts SQL, etj'utilise des curseurs... Oui oui, j'assume.
    Avant de crier au scandale, je vous assure que j'ai bien étudié la chose, et au vu de la complexité de cette migration, c'est vraiment le choix qui s'impose... Promis.

    Bref, revennons-en à nos moutons:

    Lors de la migration de tables de production assez importantes (+ de deux millions de lignes), par l'intermediaire d'un curseur sur ma table "source" (base A), l'exécution est très très lente (environ 5000 lignes minutes!).

    J'ai tout tenté (test en charge de différentes requêtes, sous-requêtes, tables temporaires, etc..).

    Je me suis aperçu qu'en ouvrant (clic droit, "ouvrir la table") ma table "source" sous la base A depuis le Management Studio Express pendant l'exécution de mon script, je passe à plus 150 000 lignes minute...

    Je ne vois pas trop d'où viens cette différence. Pour moi c'est incompréhensible.

    Autres infos:
    J'utilise SLQ Server 2005 Express, sur un ordinateur récent.
    Après défragmentation, la chose s'améliore un peu, mais pas de trop.

    Si vous avez des idées sur le pourquoi du comment, je suis preneur

    Merci d'avance.
    Pillou

  2. #2
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Citation Envoyé par pillou Voir le message
    Pour ce faire, j'ai développé des scripts SQL, etj'utilise des curseurs... Oui oui, j'assume.
    Assume jusqu'au bout alors... Les problèmes de performances liés aux curseurs ne sont pas nouveaux


    Pour la différence de vitesse que tu observes une fois que tu as ouvert ta table A peut provenir du fait que tu charges la mémoire (cache) avec les données de ta table A et que tu accèdes à celles-ci directement en mémoire plutot que d'aller lire ligne par ligne sur le disque.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Merci pour ta réponse Ptit_Dje.

    Je pense aussi que c'est une question de chargement de la table source en mémoire... d'ailleur quand la table est "ouverte", je n'entend plus les petits bruits caractéristiques des accés disque .
    Maintenant je ne vois pas comment intégrer la chose directement depuis mon script SQL (ou en configurant la base et/ou le serveur?).

    Si quelqu'un à une info...

    Merci d'avance.

  4. #4
    Membre chevronné

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2007
    Messages
    1 216
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Août 2007
    Messages : 1 216
    Points : 1 758
    Points
    1 758
    Par défaut
    Pour integrer une ouverture de la table... Utilise un select * de ta table dans ton script avant de démarrer avec le curseur.

    Bien que je te conseillerai d'utiliser des loops pour remplacer tes curseurs, surtout sur d'aussi des tables aussi grosse.

    Pour faire du row par row tu peux utiliser un truc du genre :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    declare @i int
    declare @maxId int
     
    create #loopTable
    (
         idLoop int identity (1,1),
         col1,
         Col2,
         ...
    )
     
    insert into #loopTable (col1, col2 ....)
    select col1, col2 .... from tableSource where filtre
     
    --- Tu peux meme penser à creer des index sur ta table temporaire ici
     
    set @i = 1
    select @maxID = max(idLoop) from #loopTable
     
    while @i <= @maxId
    begin
                   select .... from #loopTable where idLoop = @i
     
                   .........
     
                   @i = @i + 1
    end

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Drôme (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 11
    Points : 8
    Points
    8
    Par défaut
    Merci pour ton aide Ptit_Dje, mais le select * sur les tables "sources" avant traitement ne change rien...

    Merci aussi pour l'info sur les loops, mais crois moi je ne pense pas avoir vraiment le choix quant à l'utilisation des curseurs

    C'est vraiment une histoire d'accès disque, vue que ni le processeur et la ram ne sont en surcharge pendant le processus... et de loin.

    Personne n'a eu ce gene de problème?

    Merci d'avance.

    EDIT: idem quand j'ouvre la fenêtre propriété de ma table source... le processus s'accélère
    EDIT 2 : Dans ces deux cas (ouverture et propriétés sur ma table "source") l'utilisation de mon UC gonfle et reste stable à environ 20%. Dans le cas contraire: variation rapides de 2 à 13%. Juste pour infos.

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/09/2011, 12h39
  2. Réponses: 5
    Dernier message: 01/04/2010, 00h59
  3. Réponses: 4
    Dernier message: 11/08/2008, 16h29
  4. Réponses: 8
    Dernier message: 25/01/2008, 12h48
  5. Réponses: 19
    Dernier message: 21/10/2005, 15h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo