Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/09/2011, 16h55   #1
Candidat au titre de Membre du Club
 
Inscription : février 2011
Messages : 70
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 70
Points : 13
Points : 13
Par défaut Create Table #tmp ou Declare @tmp Table

Bonjour,

Utiliser
Create Table #tmp ...
OU
Declare @tmp Table ...

J'aurais voulu savoir quelles sont les différences entre ces 2 méthodes ?
Je sais que l'une est permanente, donc ne pas oublier de la supprimer après le traitement et l'autre ne vit que pendant le traitement en cours.

Et comment faire le meilleur choix ?

Merci
weebo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 17h08   #2
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
La principale différence, c'est que :

J'ai dit une grosse connerie
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 17h23   #3
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
NON !
#tmp est une table locale instanciée dans la tempdb (base de données systèmes des objets temporaire) mais permettant des contraintes avancées (CHECK, FOREIGN KEY...) et l'indexation
Elle persiste tant que l'utilisateur est connecté et sera détruite par un DROP TABLE ou la déconnexion de l'utilisateur.

@tmp est une variable table instanciée dans la tempdb, mais ne permet que la clef primaire (pas d'index ni d'autres contraintes).
Elle n'existe que dans la porté locale de code (pas de DROP...)

MAIS ... la cardinalité de @tmp est évaluée à 1 dans les plans de requêtes, tandis que celle de #tmp est évaluée de manière statistique !
Et cela change beaucoup de chose en matière de perf.

Autrement dit : une seule ligne (voire très peu) et peu de colonnes => @tmp.
Dans les autres cas :
  • soit #tmp
  • soit une table en dur dans la base avec un tag de données temporaires.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 17h58   #4
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
Grmpf. Désolé !

Ça a toujours été ainsi ?
J'étais persuadé que sous SQL Server 2000 tout du moins, les tables temporaires étaient globale (???)
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 18h04   #5
Modérateur
 
Avatar de Jinroh77
 
Homme Alexandre Chemla
Consultant en Business Intelligence
Inscription : février 2006
Messages : 1 773
Détails du profil
Informations personnelles :
Nom : Homme Alexandre Chemla
Âge : 28
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Consultant en Business Intelligence

Informations forums :
Inscription : février 2006
Messages : 1 773
Points : 1 837
Points : 1 837
La différence globale/locale se fait entre une table # / ##
Soit elle est globale pour les session, soit uniquement pour la session locale.

La différence avec les @table est tout autre.
__________________
Alexandre Chemla - Consultant MS BI chez Masao
Jinroh77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 18h06   #6
Membre Expert
 
Homme Sylvain Devidal
Chef de projets Générix
Inscription : février 2010
Messages : 1 062
Détails du profil
Informations personnelles :
Nom : Homme Sylvain Devidal
Âge : 33
Localisation : France, Rhône (Rhône Alpes)

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

Informations forums :
Inscription : février 2010
Messages : 1 062
Points : 1 515
Points : 1 515
D'accord. Encore désolé, j'ai tout mélangé
StringBuilder est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 09h43   #7
Candidat au titre de Membre du Club
 
Inscription : février 2011
Messages : 70
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 70
Points : 13
Points : 13
Merci pour vos réponses, je me range ça dans un coin de ma tête !


Par contre c'est quoi et à quoi ça sert :

"soit une table en dur dans la base avec un tag de données temporaires."
weebo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 10h09   #8
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 959
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 959
Points : 17 791
Points : 17 791
En gros, c'est la même chose qu'une table temporaire, mais c'est bien une table en dur dans la base, avec en sus une colonne permettant de stocker un marqueur transactionnel (GUID par exemple).
On l'utilise de la façon suivante :
  • générer une valeur de marqueur
  • insérer des lignes avec ce marqueur
  • faire des requêtes en filtrant sur ce marqueur
Cela évite l'utilisation de tables temporaires dont les performances sont généralement moins bonnes du fait des changements de schémas.

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 10h23   #9
Membre Expert
 
Homme Etienne ZINZINDOHOUE
Ingénieur développement
Inscription : mars 2010
Messages : 1 139
Détails du profil
Informations personnelles :
Nom : Homme Etienne ZINZINDOHOUE
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Activité : Ingénieur développement
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2010
Messages : 1 139
Points : 2 467
Points : 2 467
Envoyer un message via Yahoo à zinzineti
J'ajoute, qu'il est impossible de faire les opération suivantes avec une variable table :
  • ROLLBACK dans une transaction avec une variable table (@table)
  • ALTER sur une variable table (@table)
  • directement du SQL dynamique avec une variable table (@table)

Par contre la variable table (@table) est très utile pour les UDFs retournant une table

Je me suis posé la même question il y a un moment

A+
__________________
Etienne ZINZINDOHOUE
Billets-Articles
zinzineti est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/09/2011, 11h06   #10
Candidat au titre de Membre du Club
 
Inscription : février 2011
Messages : 70
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 70
Points : 13
Points : 13
Un grand Merci !
weebo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h17.


 
 
 
 
Partenaires

Hébergement Web