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 :

optimiser le temp du traitement d'une boucle


Sujet :

Développement SQL Server

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Points : 6
    Points
    6
    Par défaut optimiser le temp du traitement d'une boucle
    bonjour j'ai une table qui contient comme champ: date, obj, col1, col2, col3.....

    moi ce que je veut faire, c parcourir les colones pour chaque objet pour deux dates differentes puis extraire la diffirence si elle existe dans une nouvelle table

    pour les colones j 'ai utiliser un cursor pour recupere le nom des colones depuis les tables systemes puis je faire une insruction sql pour comparer chaque ligne du cursor (nom de colone) dans les deux dates
    code
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    CREATE PROCEDURE SP_Riad3
    AS
     
    -- variables locales de la procédure
    DECLARE @NomTable VARCHAR(128),     -- nom de la table
            @SQL      VARCHAR(1000)     -- texte de la requête dynamique
     
    -- pas de messages intempestifs
    SET NOCOUNT ON
     
    -- déclaration du curseur pour recuperer les noms des colonnes
    DECLARE CursBase CURSOR 
    FOR
       SELECT     COLONNES.name
    FROM         syscolumns AS COLONNES INNER JOIN
                          sysobjects AS TABLES ON TABLES.id = COLONNES.id
    WHERE     (TABLES.name = 'tableXXXX')
     
    -- gestion de la table des résultats : nom de la table qui contiendra les differences
    SET @NomTable = 'DATA'
     
    -- vidage si existence de cette table, sinon création
    IF EXISTS(SELECT * FROM   INFORMATION_SCHEMA.tables WHERE  TABLE_NAME = @NomTable)
       DELETE FROM DATA
    ELSE
       CREATE TABLE DATA
       (
    obj   VARCHAR(128),
        OLD   VARCHAR(128),
      NEW VARCHAR(128),
        diff VARCHAR(128))
     
    -- ouverture du curseur
    OPEN CursBase
     
    -- lecture de la première ligne
    FETCH CursBase INTO @NomTable
     
    -- boucle ligne à ligne
    WHILE @@FETCH_STATUS = 0
    BEGIN
    if @NomTable='Date' goto suite
     declare @str varchar(1500)
     
    SET @str = 'INSERT INTO DATA SELECT     t1.obj, t1.' + @NomTable + '  AS old, t2.' + @NomTable +' AS NEW, ''' + @NomTable + ''' AS diff
    FROM         tablexxx AS t1 INNER JOIN
                          tablexxx AS t2 ON t1.obj = t2.obj AND t1.'+@NomTable+' <> t2.'+@NomTable+' AND t1.Date < t2.Date'
     
    suite:
    print (@str)
    exec (@str)
     
       FETCH CursBase INTO @NomTable
    END
     
    -- fermeture et désallocation d'espace mémoire du curseur
    CLOSE CursBase
    DEALLOCATE CursBase
     
    -- envoi des données
    SELECT * FROM DATA
     
    -- pas de messages intempestifs
    SET NOCOUNT OFF
    exemple:
    date obj col1 col2 col3
    2008 XA oui 13 TRUE
    2009 XA oui 15 FALSE


    le resultat sera dans la table DATA comme suit :

    obj OLD NEW Diif

    XA 13 15 col2
    XA TRUE FALSE col3


    avec ce code j'ai un resultat dans 20 sec pour 5000 ligne mais le pb que ces tables grandissent du jour en jour
    y'a t'il un moyen pour plus optimiser ce code

    remarque: j'ai lier la table tablexxx avec elle meme (une fois t1 et une fois t2) je prend de t1 une date et t2 une autre date,
    mais le pb que t1 et t2 contiennent tout les deux les deux dates donc c'est une redondance peut etre (temps de recherche sera plus long).
    et puis sur quel colone on poura appliquer des index pour accelerer la recherche????
    je pense que c'est un bon challenge les mec bonne chance
    merci

  2. #2
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    L'utilisation de curseurs, pour quelque problème que ce soit, est à proscrire, comme je l'ai montré ici pour des raisons de performances, mais aussi parce que SQL est un langage qui est conçu pour traiter des ensembles de données dans leur globalité, et non pas traiter les éléments de ces ensembles un par un comme on peut le faire avec un curseur ou une boucle WHILE.
    Donc quand vous programmez des bases de données, oubliez ce que vous avez appris des autres langages, où l'on traite les données de façon itérative.

    le resultat sera dans la table DATA comme suit :

    obj OLD NEW Diif

    XA 13 15 col2
    XA TRUE FALSE col3
    Cela montre que votre modèle de données est incorrect : en aucun cas une colonne ne doit devenir une valeur !

    avec ce code j'ai un resultat dans 20 sec pour 5000 ligne mais le pb que ces tables grandissent du jour en jour
    y'a t'il un moyen pour plus optimiser ce code
    5000 lignes c'est rien du tout pour beaucoup de moteurs de base de données, et 20s c'est beaucoup trop long pour traiter si peu de lignes.
    Donc oui, on peut optimiser cela mais il faudrait que vous soyez plus précis sur la problématique et que vous soyez prêt à modifier votre modèle de données.

    @++

Discussions similaires

  1. [MySQL] Optimiser le temps de traitement d'une simple requête qui retourne 800 000 lignes.
    Par kamnouz dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 17/06/2011, 18h37
  2. Comment optimiser les temps de réponse d'une requête ?
    Par renaudjuif dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/02/2007, 14h12
  3. Optimisation du temps de traitement
    Par djuddju dans le forum Oracle
    Réponses: 4
    Dernier message: 20/04/2006, 21h16
  4. Réponses: 9
    Dernier message: 20/06/2005, 12h17
  5. optimisation de temps de traitement xml/xslt
    Par Erwy dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 06/05/2004, 16h08

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