table temporaire : create table ou Declare table ?

Le
Steph
Bonjour a tous,
j'ai une PS relativement sollicitee, et cette PS fait un traitement lourd.


Ma question est la suivante :
--
vaut il mieux, pour accelerer le temps de traitement de cette PS, creer
une table temporaire avec :

declare @matable table {}

ou en

declare table #matable {}

L'avantage de la table globale est que l'on peut y mettre des index.



L'utilisation de cette table ? :
--
c'est une table temporaire dans la quelle on stocke les resultats des
sous requetes, permettant ainsi a chaque fois des faires des
"select id from xxx where id in (select id from [@#]matable)"
puis de faire un delete + insert dans la [@#]matable des id retrouvés"
(et ceci n fois)



pour info : le serveur a 12 giga de ram, et actuellement seulement 4 est
utilisé.


merci aux experts
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Philippe Bouchardy
Le #11879731
Bonjour Stéphane,

Quelques petites précisions : quand on parle de tables (#), on parle de
table temporaire locale, propre à la session de l'utilisateur qui l'a crée.
On utilise le caractère ## pour obtenir une table temporaire de portée
global (multi session).



Le troisième type de tables temporaires et le type table variable (@), ce
type de tables à l'inverse des 2 autres n'est généralement pas stocké sur le
disque mais directement en mémoire (sauf en case de dépassement de mémoire),
l'avantage dans ce cas est qu'il ni y a pas de IO sur le disque.



Néanmoins le scope des tables variables n'est pas le même, et leur porté se
limite a la procédure dans laquelle la table est créée.



Il n'est effectivement pas possible de créer des index non-cluster dans un
table variable par contre vous pouvez créer un index cluster qui dans votre
cas devrait suffire.



Microsoft à publié un KB trés interessante à ce sujet, je vous invite à la
consutler à cette adresse
http://support.microsoft.com/default.aspx/kb/305977



Cordialement,


"Steph" news:483129c2$0$862$
Bonjour a tous,
j'ai une PS relativement sollicitee, et cette PS fait un traitement lourd.


Ma question est la suivante :
-----------------------------
vaut il mieux, pour accelerer le temps de traitement de cette PS, creer
une table temporaire avec :

declare @matable table {...}

ou en

declare table #matable {...}

L'avantage de la table globale est que l'on peut y mettre des index.



L'utilisation de cette table ? :
--------------------------------
c'est une table temporaire dans la quelle on stocke les resultats des sous
requetes, permettant ainsi a chaque fois des faires des
"select id from xxx where id in (select id from [@#]matable)"
puis de faire un delete + insert dans la [@#]matable des id retrouvés"
(et ceci n fois)



pour info : le serveur a 12 giga de ram, et actuellement seulement 4 est
utilisé.


merci aux experts...


Fred BROUARD
Le #11879571
Philippe Bouchardy a écrit :
Bonjour Stéphane,

Quelques petites précisions : quand on parle de tables (#), on parle de
table temporaire locale, propre à la session de l'utilisateur qui l'a crée.
On utilise le caractère ## pour obtenir une table temporaire de portée
global (multi session).



Le troisième type de tables temporaires et le type table variable (@), ce
type de tables à l'inverse des 2 autres n'est généralement pas stocké sur le
disque mais directement en mémoire (sauf en case de dépassement de mémoire),
l'avantage dans ce cas est qu'il ni y a pas de IO sur le disque.



Hélas, erreur, la table est bien instanciée en tempdb...




Néanmoins le scope des tables variables n'est pas le même, et leur porté se
limite a la procédure dans laquelle la table est créée.



Il n'est effectivement pas possible de créer des index non-cluster dans un
table variable par contre vous pouvez créer un index cluster qui dans votre
cas devrait suffire.



Microsoft à publié un KB trés interessante à ce sujet, je vous invite à la
consutler à cette adresse
http://support.microsoft.com/default.aspx/kb/305977



Cordialement,


"Steph" news:483129c2$0$862$
Bonjour a tous,
j'ai une PS relativement sollicitee, et cette PS fait un traitement lourd.


Ma question est la suivante :
-----------------------------
vaut il mieux, pour accelerer le temps de traitement de cette PS, creer
une table temporaire avec :

declare @matable table {...}

ou en

declare table #matable {...}

L'avantage de la table globale est que l'on peut y mettre des index.



L'utilisation de cette table ? :
--------------------------------
c'est une table temporaire dans la quelle on stocke les resultats des sous
requetes, permettant ainsi a chaque fois des faires des
"select id from xxx where id in (select id from [@#]matable)"
puis de faire un delete + insert dans la [@#]matable des id retrouvés"
(et ceci n fois)



pour info : le serveur a 12 giga de ram, et actuellement seulement 4 est
utilisé.


merci aux experts...








--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
Fred BROUARD
Le #11879561
Le mieux est de s'en passer. Depuis SQL Server 2005 les CTE et donc la
récursivité, rare sont les traitements qui ont effectivement besoin
d'une table temporaire...

A +

Steph a écrit :
Bonjour a tous,
j'ai une PS relativement sollicitee, et cette PS fait un traitement lourd.


Ma question est la suivante :
-----------------------------
vaut il mieux, pour accelerer le temps de traitement de cette PS, creer
une table temporaire avec :

declare @matable table {...}

ou en

declare table #matable {...}

L'avantage de la table globale est que l'on peut y mettre des index.



L'utilisation de cette table ? :
--------------------------------
c'est une table temporaire dans la quelle on stocke les resultats des
sous requetes, permettant ainsi a chaque fois des faires des
"select id from xxx where id in (select id from [@#]matable)"
puis de faire un delete + insert dans la [@#]matable des id retrouvés"
(et ceci n fois)



pour info : le serveur a 12 giga de ram, et actuellement seulement 4 est
utilisé.


merci aux experts...




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
*********************** http://www.sqlspot.com *************************
helios services
Le #11879201
Fred BROUARD a écrit :
Le mieux est de s'en passer. Depuis SQL Server 2005 les CTE et donc la
récursivité, rare sont les traitements qui ont effectivement besoin
d'une table temporaire...

A +

Steph a écrit :
Bonjour a tous,
j'ai une PS relativement sollicitee, et cette PS fait un traitement
lourd.


Ma question est la suivante :
-----------------------------
vaut il mieux, pour accelerer le temps de traitement de cette PS,
creer une table temporaire avec :

declare @matable table {...}

ou en

declare table #matable {...}

L'avantage de la table globale est que l'on peut y mettre des index.



L'utilisation de cette table ? :
--------------------------------
c'est une table temporaire dans la quelle on stocke les resultats des
sous requetes, permettant ainsi a chaque fois des faires des
"select id from xxx where id in (select id from [@#]matable)"
puis de faire un delete + insert dans la [@#]matable des id retrouvés"
(et ceci n fois)



pour info : le serveur a 12 giga de ram, et actuellement seulement 4
est utilisé.


merci aux experts...






mais peut on faire confiance à quelqu'un qui prétends coder plus de
65536 valeurs sur 2 octets ?

http://groups.google.com/group/fr.comp.applications.sgbd/msg/621527f995585842?dmode=source





et donc les écrits ont été bannis de wikipedia

--
Dr Thierry HOLZ
HELIOS SERVICES
180 rue de la croix du chene
60250 HEILLES
www.openqm.com02.net
www.pick.com02.net
Philippe Bouchardy
Le #11878651
Bonjour Fred,



Votre poste du 25 mai m'a fait approfondir mes recherches sur la gestion des
tables variable :



En re-parcourant le livre SQL Server 2005 Implementation and Mainteance MCTS
40-431 Microsoft Press, j'ai trouvé en Page 122, Table temporaire,
l'explication suivante :



Table variables provide an alternative to temporary tables and can be user
in functions, triggers, and stored procedures. Instead of storing the table
and all date wihtin the table in the tempdb database on disk, a table
variable and all associated data is stored in memory. However, if the amout
of data placed into the table variable causes it to require more storage
space than is available in memory, the overflow will be spooled to disk
within tempdb.

==> J'en conclu que les Tables Variables sont en mémoire principalement

En cherchant sur le web je trouve la KB de microsoft 305977
http://support.microsoft.com/kb/305977 qui explique ceci (Note cette KB
parle de la gestion des tables dans SQL Server 2000) :

Q4: Are table variables memory-only structures that are assured better
performance as compared to temporary or permanent tables, because they are
maintained in a database that resides on the physical disk?

A4: A table variable is not a memory-only structure. Because a table
variable might hold more data than can fit in memory, it has to have a place
on disk to store data. Table variables are created in the tempdb database
similar to temporary tables. If memory is available, both table variables
and temporary tables are created and processed while in memory (data cache).

==> J'en conclu que les Tables Variables sont dans TempDB aussi, et qui si
il y assez de mémoire la table est chargée uniquement en mémoire, idem pour
les tables temporaires.

Mes questions sont les suivantes :

- S'il y a assez de mémoire disponible la Table Variable est créé en
mémoire seulement ?

- Quel paramètres rentre en compte pour définir cette limite.

- Quelle différence / interet par rapport aux tables temporaires
"classiques" ?

Pourriez-vous apporter des informations complémentaires sur leur gestion ?

D'avance merci de votre réponse

Cordialement,
Publicité
Poster une réponse
Anonyme