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

MS SQL Server Discussion :

[OPTIMISATION]fonction de concaténation


Sujet :

MS SQL Server

  1. #1
    Membre éclairé
    Avatar de m-mas
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2003
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2003
    Messages : 576
    Points : 719
    Points
    719
    Par défaut [OPTIMISATION]fonction de concaténation
    Bonjour,

    je suis sous SQL server 2000

    j'ai une fonction de concaténation de différents champs que j'utilise pour insérer des données dans une 2éme table.

    Voici ma fonction :
    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
     
    CREATE    FUNCTION FN_CONCAT (@ECR_ID NUMERIC)
    RETURNS VARCHAR(8000)
     
    AS
    BEGIN
    DECLARE @CH3 VARCHAR(8000)
    SET @CH3=''
    SELECT @CH3=@CH3+
    ISNULL(CG_C1,'') + ';'
    + ISNULL(CG_C2,'') + ';'
    + ISNULL(CONVERT(VARCHAR(10),CG_C3),'')+';'
    + ISNULL(CG_C4,'') +';'
    + ISNULL(CG_C5,'') +';'
    + ISNULL(CG_C6,'')
    + ';'
    FROM T_ECR
    WHERE CG_ECR_ID=@ECR_ID
     
    IF (@CH3 <>''  ) SET @CH3= LEFT(@CH3, LEN(@CH3)-1)
     
    RETURN @CH3
     
    END
    l'appel à ma fonction se fait via cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    insert into T_TECH
    (TECH_ID,TECH_C)
    SELECT distinct CG_ID,
    dbo.FN_CONCAT(CG_ECR_ID),
    FROM T_ECR
    ORDER BY
    CG_ECR_ID
    A faible volume de ma table T_ECR, cette fonction marche trés bien, mais si j'ai beaucoup de données (30000 lignes par exemple dans T_ECR dont 9000 CG_ECR_ID différents) ma fonction prend 18 minutes

    ma table T_ECR continet juste un index sur sa clé primaire (numéro automatique) et même si je crée un index sur l'ensemble des CG_Cn qui sont sélectionnés dans la concaténation, ceci ne s'améliore pas !

    Voyez vous quelques choses pour optimiser ?

    Merci.
    mon blog http://www.3click-solutions.com/actualites/

    MCP VB.NET (70-305) - (70-306) - (70-310)
    Développeur PHP / Wordpress

  2. #2
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Août 2006
    Messages
    730
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 730
    Points : 923
    Points
    923
    Par défaut
    c'est ton distinct qui fait ramer car si tu n'insères que 9000 lignes il fait quand même appel 30000 fois a ta fonction
    je te conseille de passer par une temp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    SELECT DISTINCT CG_ID,CG_ECR_ID
    into #temp
    FROM T_ECR
    ORDER BY
    CG_ECR_ID
     
    INSERT INTO T_TECH
    (TECH_ID,TECH_C)
    SELECT CG_ID,dbo.FN_CONCAT(CG_ECR_ID)
    FROM #temp
     
    drop table #temp
    Errare humanum est, perseverare diabolicum (Sénèque)

  3. #3
    Membre éclairé
    Avatar de m-mas
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2003
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2003
    Messages : 576
    Points : 719
    Points
    719
    Par défaut
    tout à fait ! je n'ai pas pensé à ça

    a noter, que si j'utilise des curseurs (qui est déconseillé); j'obtient un temps de traitement de 9 min à peu prés (gain de 50%)

    Avec l'utilisation des tables temporaires (comme tu me l'a suggéré) sans curseur ça dure 3 min alors avec un curseur ça ne prend qu' 1 min 30

    je pense que je vais opter pour un curseur + table temporaire (1min30) qui est un temps de traitement inespéré

    A titre d'indication, avec le curseur ma fonction deviens :
    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
     
    CREATE    FUNCTION FN_CONCAT_CURSOR (@ECR_ID NUMERIC)
    RETURNS VARCHAR(8000)
     
    AS
    BEGIN
    declare @var varchar(255)
    declare cur cursor for
    (select ISNULL(CG_C1,'') + ';'
    + ISNULL(CG_C2,'') + ';'
    + ISNULL(CONVERT(VARCHAR(10),CG_C3),'')+';'
    + ISNULL(CG_C4,'') +';'
    + ISNULL(CG_C5,'') +';'
    + ISNULL(CG_C6,'')
    + ';'
    FROM TSMCG_ECRITURE_MOUVEMENT 
    where cg_ecrm_ecriture_id=@ecr_id
     
    DECLARE @CH3 VARCHAR(8000)
    SET @CH3=''
    open cur
    fetch cur into @var 
    while @@fetch_status =0 
    begin
    SELECT @CH3=@CH3+@var
    IF (@CH3 <>''  ) SET @CH3= LEFT(@CH3, LEN(@CH3)-1)
    fetch next from cur into @var
    end
     
    RETURN @CH3
     
    END
    Merci serge
    mon blog http://www.3click-solutions.com/actualites/

    MCP VB.NET (70-305) - (70-306) - (70-310)
    Développeur PHP / Wordpress

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 847
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 847
    Points : 52 962
    Points
    52 962
    Billets dans le blog
    6
    Par défaut
    CG_ECR_ID est-il indexé ?

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre éclairé
    Avatar de m-mas
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2003
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2003
    Messages : 576
    Points : 719
    Points
    719
    Par défaut
    Citation Envoyé par SQLpro
    CG_ECR_ID est-il indexé ?

    A +
    non, faut il le faire ?
    mon blog http://www.3click-solutions.com/actualites/

    MCP VB.NET (70-305) - (70-306) - (70-310)
    Développeur PHP / Wordpress

  6. #6
    Membre éclairé
    Avatar de m-mas
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2003
    Messages
    576
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2003
    Messages : 576
    Points : 719
    Points
    719
    Par défaut
    en créant l'index, la fonction avec le curseur passe à 3s (je dis bien 3 secondes)

    la fonction sans le curseur (1er message) dure 2 minutes !
    mon blog http://www.3click-solutions.com/actualites/

    MCP VB.NET (70-305) - (70-306) - (70-310)
    Développeur PHP / Wordpress

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Optimisation fonction MAX
    Par AurelGTS dans le forum Langage SQL
    Réponses: 7
    Dernier message: 14/05/2007, 19h26
  2. Réponses: 3
    Dernier message: 07/09/2006, 12h00
  3. Optimisation : fonction vide ou test
    Par bolhrak dans le forum C++
    Réponses: 2
    Dernier message: 15/07/2006, 19h31
  4. [TSQL] Optimisation fonction levenshtein
    Par Adi81 dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 17/03/2006, 15h22
  5. [Optimisation][Fonction]calcul du nombre de jours ...
    Par m-mas dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 26/10/2005, 14h39

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