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 :

Différence entre deux "requêtes"


Sujet :

Développement SQL Server

  1. #1
    Membre expérimenté
    Homme Profil pro
    /
    Inscrit en
    Février 2003
    Messages
    433
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : /

    Informations forums :
    Inscription : Février 2003
    Messages : 433
    Points : 1 604
    Points
    1 604
    Par défaut Différence entre deux "requêtes"
    Bonjour à tous,
    Je m'interrogeais sur la manière dont ces deux éléments sont interprétés par le moteur SQL.
    Dans la compréhension que j’en ai, le comportement devrait être sensiblement le même mais je me fourvoie peut-être.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    WITH 
    	chose(colonne1, colonne2)
    	AS
    	(
    		SELECT
    			a,
    			max(b)
    		FROM table1
    		GROUP BY a
    	)
    	UPDATE table2 set colonne2 = chose.colonne2
    	WHERE table2.colonne1 = chose.colonne2
    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
     
    CREATE TABLE #chose
    (
    	colonne1,
    	colonne2
    )
     
    INSERT INTO #chose
    	SELECT
    			a,
    			max(b)
    		FROM table1
    		GROUP BY a
     
    UPDATE table2 set colonne2 = #chose.colonne2
    	WHERE table2.colonne1 = #chose.colonne2

  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 : 42
    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,

    Ces deux requêtes ne feront pas le même chose, et vous pouvez le voir en observant le plan de chacune des deux requêtes (CTRL+L lorsque vous êtes sous Management Studio)

    - La première manipule uniquement des données en mémoire, grâce à la CTE.
    C'est dommage que vous n'ayiez pas spécifié une jointure avec un JOIN à la place du WHERE

    - La seconde va écrire les données dans la base de données système TempDB, car comme toute table, il est obligatoire de la persister pour garantir son intégrité (pour vous en convaincre, déployez la node "Tables temporaraires" de la node "Tables" de la base de données système TempDB).
    En plus de cela SQL Server va créer des statistiques sur les colonnes de cette table.
    En conséquence celle-ci s'avèrera moins performante parce que vous écrivez des données dans un autre fichier de données, et que vous consommez plus de ressources puisque SQL Server se sert de TempDB massivement pour bien d'autres tâches , outre les statistiques que vous lui demandez implicitement de maintenir.

    @++

  3. #3
    Membre expérimenté
    Homme Profil pro
    /
    Inscrit en
    Février 2003
    Messages
    433
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : /

    Informations forums :
    Inscription : Février 2003
    Messages : 433
    Points : 1 604
    Points
    1 604
    Par défaut
    Merci beaucoup pour cette réponse, j'ai sans doute été influencé par diverses lectures qui expliquaient les CTE en parlant de "table temporaire".

  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 761
    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 761
    Points : 52 547
    Points
    52 547
    Billets dans le blog
    5
    Par défaut
    On doit plutôt dire de la CTE que c'est une vue temporaire locale....

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

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

Discussions similaires

  1. [AC-2010] Calculer la différence entre deux dates, en jour, dans une requête
    Par Just-Soft dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 31/10/2010, 02h19
  2. [AC-2007] Requête SQL différence entre deux date en heure
    Par sarah12 dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 21/07/2010, 20h58
  3. Différence entre deux requêtes
    Par viny dans le forum Langage SQL
    Réponses: 7
    Dernier message: 03/10/2006, 16h28

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