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 :

Create Table vs Declare [2008R2]


Sujet :

Développement SQL Server

  1. #1
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 192
    Points : 28 075
    Points
    28 075
    Par défaut Create Table vs Declare
    Salut à tous

    Le contexte :
    J'ai un script qui tourne depuis plusieurs années sans problème. Dans le cas particulier d'un client, ce script est amené à traiter un très gros volume de données, et le problème est qu'il sort en timeout.

    A force de tests, j'ai réussi à isoler le problème au niveau de la création d'une table temporaire et de 2 requêtes Insert successives pour la remplir avant de continuer les traitements. Sur un très gros volume de données la seconde requête se met à tourner dans le vide jusqu'au timeout quelque soit la valeur de celui-ci (je suis monté à plus de 16h lors d'un test nocturne)

    Lors de tests aujourd'hui, j'ai modifié la création de la table et j'aurais à priori résolu le problème.

    A l'heure actuelle, la table temporaire est crée via DECLARE @MaTableTemp AS TABLE (...). J'ai modifié la création par CREATE TABLE #MaTableTemp (....).
    J'aimerais comprendre la différence entre ces 2 façons alors que l'on est toujours sur de la table temporaire.
    Et surtout est-ce que la résolution du problème est bien réelle, ou est-ce que j'ai affaire à un effet de bord trompeur ?
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 151
    Points : 7 399
    Points
    7 399
    Billets dans le blog
    1
    Par défaut
    De mémoire, il y a notamment un souci de cardinalité / calcul de statistiques.

    Les variables table, tout comme les fonctions tables, ont une cardinalité de 1 pour l'optimiseur.
    En revanche, les tables temporaires ont des cardinalités calculées correctement.

    Du coup ça induit en erreur l'optimiseur lors de l'utilisation de ces tables, surtout sur de gros volumes.

    Aussi, visiblement l'accès aux variables table n'est pas parallélisable : c'est aussi pénalisant lorsqu'on traite de gros volumes dans une requête complexe.

    Voici deux liens que j'ai trouvé qui détaillent mieux :
    http://www.concatskills.com/2017/12/...ariable-table/
    https://stackoverflow.com/questions/...-in-sql-server

    Dans les grandes lignes, il y a très peu d'avantages à utiliser les variables tables.
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 763
    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 763
    Points : 52 554
    Points
    52 554
    Billets dans le blog
    5
    Par défaut
    Une variable table n'est pas une table temporaire. Elle ne dispose pas de cardinalité et donc l'optimiseur considère qu'il n'y a jamais qu'une seule ligne dans la variable table… Si ce n'est pas le cas, le plan de requête peut donc devenir catastrophique car le choix des algorithmes (jointure, groupage, déduplication…) dépend des cardinalités !

    En revanche une table temporaire dispose de statistiques. Le plan est donc ré évalué après alimentation de la table temporaire pour cadrer avec les statistiques.

    D'où le comportement que vous avez expérimenté à votre détriment !

    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/ * * * * *

  4. #4
    Modérateur
    Avatar de sevyc64
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2007
    Messages
    10 192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 192
    Points : 28 075
    Points
    28 075
    Par défaut
    Ok, merci pour les infos.

    Je n'ai donc pas de scrupule pour modifier mon script et remplacer ma variable table par une table temporaire locale pour résoudre mon problème.
    --- Sevyc64 ---

    Parce que le partage est notre force, la connaissance sera notre victoire

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/02/2018, 10h54
  2. Create Table #tmp ou Declare @tmp Table
    Par weebo dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 29/09/2011, 11h06
  3. [DB2] create table... if not exists ?
    Par iubito dans le forum DB2
    Réponses: 6
    Dernier message: 23/03/2004, 18h26
  4. Create table + jointure
    Par ender999 dans le forum Débuter
    Réponses: 7
    Dernier message: 20/02/2004, 12h04
  5. Database new user & create table
    Par MFDev dans le forum InterBase
    Réponses: 3
    Dernier message: 30/09/2003, 20h47

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