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 :

T-SQL - Optimisation des Cursor / Tables temp


Sujet :

Développement SQL Server

  1. #1
    Membre éclairé Avatar de SebastienM
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 310
    Par défaut T-SQL - Optimisation des Cursor / Tables temp
    Bonjour, voilà, j'ai réalisé un script qui fonctionne, mais utilisant des cursor imbriqués les temps de traitements sont excessivements longs.

    Ma fonction renvoie une TABLE appelée @resultat.
    J'ai essayé d'optimiser mais j'ai buté sur un problème : en fait il y a un bout de script qui remplie cette table temporaire @resultat, puis une autre portion va chercher des données et met à jour cette table temporaire. Le soucis c'est qu'un update récursif sur 700 000 lignes c'est très très lourd !

    Je suis en train d'essayer une autre méthode qui consisterai en la création de plusieurs tables temporaires, puis un insert massif dans ma table @resultat à la fin en utilisant des jointures sur toutes mes tables temporaires.

    Le soucis, c'est que lorsque j'essaye de faire un select sur une table temporaire @resultatTemp1 j'ai le message suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    La variable scalaire "@resultatTemp1" doit être déclarée.
    Pourtant cette variable est bien déclarée !!!

    Auriez-vous des tuyaux ?

    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
    Par défaut
    Bonjour,

    Si vous êtes vraiment obligé de passer par une variable table + un curseur, ne vous étonnez pas des temps de traitement longs.
    Essayez plutôt d'utiliser une vraie table, indexez la proprement et veillez à utiliser des requêtes purement ensemblistes.

    C'est tout à fait possible dès SQL Server 2005, en utilisant des CTE, qui en outre vous permettent d'effectuer des traitements récursifs.

    Notez que les tables temporaires (# et ##) et les variables tables sont persistées, comme toute table, dans la base de données TempDB, que le moteur de base de données utilise massivement pour bien d'autres traitements ... donc vous pourrissez vos performances par cette utilisation.

    Enfin une différence entre les variables tables et les autres tables, c'est que sur les premières, SQL Server ne maintient aucune statistique.
    Par conséquent, il est impossible pour le moteur de base de données de créer un bon plan de requête.
    Si vous utilisez des tables temporaires (# et ##), le moteur de base de données maintient des statistiques, mais toujours dans TempDB ...

    En revanche pour votre erreur, impossible d'aller plus loin sans votre code.

    @++

  3. #3
    Membre éclairé Avatar de SebastienM
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 310
    Par défaut
    Merci de votre réponse, j'ai essayé de passer par une procédure stocker et d'updater directement les tables réelles.
    C'est un peu plus performant mais reste lourd ! J'ai optimisé à fond mes clauses where pour arriver à quelque chose d'acceptable. Il n'y a pas de miracle en fait

  4. #4
    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
    Par défaut
    J'ai optimisé à fond mes clauses where
    C'est-à-dire ? Avez-vous utilisé des S-ARG ? Avez-vous indexé les colonnes qui sont dans la clause WHERE ?

    @++

  5. #5
    Membre éclairé Avatar de SebastienM
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 310
    Par défaut
    Oui c'est ce que j'ai utilisé ; et j'ai effectivement ajouté des index. Je ne vois plus quoi ajouter, mais au final j'ai du gagner 30 à 50% de temps ; en ne traitant que ce dont j'ai besoin (à l'aide des S-ARG) j'ai pu passer de 30 mintes à 50 secondes

  6. #6
    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
    Par défaut
    30 mintes à 50 secondes
    Un gain non négligeable, tout de même

    Pour info, voici une petite comparaison

    @++

  7. #7
    Membre éclairé Avatar de SebastienM
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    310
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 310
    Par défaut
    Merci je vais aller potasser tout ça

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 25/11/2016, 14h03
  2. Réponses: 13
    Dernier message: 19/12/2008, 14h32
  3. [ASE][T-SQL]droits des user sur une table...
    Par arona dans le forum Sybase
    Réponses: 3
    Dernier message: 11/05/2006, 21h48
  4. SQL - Traiter des données d'une table
    Par david71 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 22/02/2005, 16h47
  5. Optimisation des tables
    Par le-roy_a dans le forum Décisions SGBD
    Réponses: 5
    Dernier message: 24/01/2005, 10h04

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