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 :

CTE versus table temporaire [2008]


Sujet :

Développement SQL Server

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 44
    Points : 39
    Points
    39
    Par défaut CTE versus table temporaire
    Bonjour,

    au hasard de mes lectures sur le net, je suis tombé sur cet article:
    http://sqlblogcasts.com/blogs/tonyro...expansion.aspx

    au vu des nombreux postes vantant les avantages des cte sur developpez.com, j'ai pris l'habitude d'écrire mes requêtes "complexes" avec des CTE et de reprendre les requêtes déjà existante en remplaçant les #t par des cte.

    L'article du M. sus-cité, annonce qu'il ne faut pas les utiliser sauf pour la récursivité.

    J'aimerais avoir vos avis sur le sujet.

    Cdt.

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 897
    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 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Vieux débat et l'article est truffé de bêtises.

    En effet, la table temporaire n'est pas comme certain le pense une table en mémoire, mais nécessite des opérations d'écriture de fichiers (journalisation) et de données (table instanciée).

    En revanche la CTE n'oblige pas SQL Server à instancier la table sous-jacente à la CTE. C'est lui qui décidera au final, en fonction de la volumétrie, s'il y a lieu de tout faire en mémoire, de préparer une table temporaire, et de la remplir ou pas.
    Ceci n'a d"ailleurs rien à voir avec la CTE proprement dit, qui n'est qu'une facilité d'écriture et que la requête finale soit écrite avec ou sans CTE, le résultat est le même en matière de plan d'exécution.

    Mais les effets les plus néfastes de l'utilisation abusive des tables temporaires sont invisible dans la requête elle même :
    1) l'ajout de données d'une nouvelle table, fusse t-elle temporaire, bouffe du cache au détriment de toutes les autres entrées du cache alors que ces données existe déjà dans les tables (redondance)...
    2) les temps de traitements sont allongés du fait de la journalisation et de l'instanciation de la table temporaire, mais cela ne se voit pas car pas compté dans les métriques et de plus asynchrone.
    Ce sont donc des ressources cache et disque volées au détriment des autres processus. C'est donc assez stupide !

    Enfin dire qu'il faut réserver les CTE aux requêtes récursives est aussi une stupidité lapalissienne comme quelqu’un qui dirait, pour manger, avec une fourchette, il faut une fourchette... En effet, difficile de ce passer d'une CTE pour ce cas de figure vu que c'est le seul moyen !

    Mais par expérience, je dirais en sus qu'en présence d'une requête récursive complexe et couteuse, il faut étudier le fait de procéder en plusieurs temps :
    • Avant la récursivité, proposer une table temporaire
    • Après la récursivité, proposer une table temporaire

    Si ce découpage en 3, permet de diviser par 10 les temps de réponse, alors je prend. Si ça permet de gagner 30%, je laisse !

    Récemment, c'est ce qui m'a valu de passer de 3 minutes à moins d'une seconde un traitement financier basé sur la profondeur des cotations jours par jours.
    Mais toutes les tables temporaires étaient indexées après coup pour disposer de statistiques efficients qu'une requête récursive ne peut pas produire...

    Enfin, l'article se base sur des données des tables systèmes dont les principaux inconvénients sont :
    1) un faible volume inutilisable pour prouver quoi que ce soit en matière de temps de réponse (les temps de réponses n'étant pas linéaires, parce que l'optimiseur s’adapte à la volumétrie - changement de stratégie d'accès ou d’algorithme de traitement - ou bien encore activant le parallélisme
    2) une distribution particulière des données des tables systèmes
    3) une faible indexation des tables systèmes.
    4) l'article est ancien et fait en 2008 sur la version 2008 au mieux. ENtre temps l'optimiseur à évolué en 2008 R2, 2012, 2014 et maintenant en 2016 !Donc tout à fait obsolète...
    Bref du grand n'importe quoi...

    Pour en savoir plus :
    Nom : Couverture livre SQL server Eyrolles.jpg
Affichages : 595
Taille : 105,0 Ko


    A +

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    44
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2012
    Messages : 44
    Points : 39
    Points
    39
    Par défaut
    Merci beaucoup pour votre retour,

    votre réponse est claire et instructive.
    Elle me rassure sur mon utilisation des CTE et m’éclaire sur la potentielle utilisation des tables temporaires.

    Cdt

  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 897
    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 897
    Points : 53 135
    Points
    53 135
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par Badplayer1603 Voir le message
    Merci beaucoup pour votre retour,

    votre réponse est claire et instructive.
    Elle me rassure sur mon utilisation des CTE et m’éclaire sur la potentielle utilisation des tables temporaires.

    Cdt
    En définitive, les tables temporaires, il ne faut pas en abuser !

    A +

  5. #5
    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
    Par ailleurs, il faut garder à l'esprit que pour une expression de table commune, il n'est pas possible pour l'optimiseur d'estimer le nombre de lignes qui sera retourné par chaque boucle. L'expression de table commune est donc efficace pour des cardinalités relativement stables durant la récursivité, mais pas toujours quand la distribution des valeurs sur le prédicat de jointure est assez variable.

    Donc comme pour toute requête, seule une revue du plan d'exécution associée à la sortie des options de session SET STATISTICS IO, TIME ON permet de vérifier que le plan est au moins assez bon et qu'il a de bonnes chances d'être stable dans le temps. Pour rejoindre l'exposé de SQLPro, l'utilisation de tables temporaires relève souvent d'une mauvaise modélisation de la base de données à gérer, ou d'une connaissance incomplète des possibilités offertes par T-SQL.

    @++

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

Discussions similaires

  1. Table temporaire
    Par Tapioca dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/07/2004, 11h32
  2. Table temporaire et résultat requête
    Par Royd938 dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 27/07/2004, 14h24
  3. Suppression table temporaire...
    Par Royd938 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 27/07/2004, 12h00
  4. [procédure stockée] table temporaire commençant par #???
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 23/04/2004, 12h23
  5. Nettoyage de table temporaire
    Par Alain Dionne dans le forum Bases de données
    Réponses: 5
    Dernier message: 28/02/2004, 20h44

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