|
Publicité ' | ||||||||||||||||||||||||
|
|
#21 |
|
Membre Expert
![]() ![]() Analyste / Programmeur / DBA Inscription : juillet 2006 Messages : 2 049 ![]() |
Et à la demande de mikedavem (qui efface mes messages le bougre :p), voici le plan et les messages (voir pièce jointe).
__________________
Kropernic (anciennement Griftou). |
|
00
|
|
|
#22 |
|
Expert Confirmé Sénior
![]() ![]() ![]() David BARBARINInscription : août 2005 Messages : 4 166 ![]() |
Oui oui dsl fausse manipulation
Tu pourrais éventuellement essayer de créer un index cluster sur la table temporaire #T2 pour voir. Comme cela à vue de nez tu devrais encore voir certaines opérations de l'optimiseur disparaitre. ++ |
|
00
|
|
|
#23 | |
|
Membre Expert
![]() ![]() Analyste / Programmeur / DBA Inscription : juillet 2006 Messages : 2 049 ![]() |
Pas de souci ^^
Citation:
Ajouter une colonne avec la fonction ROW_NUMBER() ? Mais pour le moment, ça a l'air de bien tourner avec l'index proposer par dbaffaleuf. Le jour où ça se gâte, je me souviendrai de tenter l'index cluster.
__________________
Kropernic (anciennement Griftou). |
|
|
00
|
|
|
#24 |
|
Expert Confirmé Sénior
![]() ![]() ![]() David BARBARINInscription : août 2005 Messages : 4 166 ![]() |
Tu n'as pas besoin d'avoir de colonne unique pour un index cluster. Je n'ai pas dit clé primaire mais index cluster :-)
++ |
|
00
|
|
|
#25 | |
|
Membre Expert
![]() ![]() Analyste / Programmeur / DBA Inscription : juillet 2006 Messages : 2 049 ![]() |
Citation:
Où aurais-je été pêché ça ?
__________________
Kropernic (anciennement Griftou). |
|
|
00
|
|
|
#26 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() David BARBARINInscription : août 2005 Messages : 4 166 ![]() |
Citation:
++ |
|
|
00
|
|
|
#27 |
|
Membre Expert
![]() ![]() Analyste / Programmeur / DBA Inscription : juillet 2006 Messages : 2 049 ![]() |
Probable oui.
Je testerai à l'occasion.
__________________
Kropernic (anciennement Griftou). |
|
00
|
|
|
#28 | |||
|
Membre émérite
![]() David BAFFALEUFInscription : février 2008 Messages : 673 ![]() |
Citation:
Code :
__________________
David B. |
|||
|
00
|
|
|
#29 |
|
Membre Expert
![]() ![]() Analyste / Programmeur / DBA Inscription : juillet 2006 Messages : 2 049 ![]() |
Le dernier plan se trouve en pièce jointe du premier message de cette page-ci.
__________________
Kropernic (anciennement Griftou). |
|
00
|
|
|
#30 |
|
Membre Expert
![]() ![]() Analyste / Programmeur / DBA Inscription : juillet 2006 Messages : 2 049 ![]() |
Une dernière question :
Puis-je tirer comme conclusion qu'il vaut mieux toujours utiliser des tables temporaires plutôt que des CTE ?
__________________
Kropernic (anciennement Griftou). |
|
00
|
|
|
#31 | |
|
Membre émérite
![]() David BAFFALEUFInscription : février 2008 Messages : 673 ![]() |
Citation:
En l'occurence dans ton cas, ça dépend du manque de précision dans les estimations de cardinalités (le comptage des lignes en sortie de chaque opérateur) qui induit le mauvais choix de jointure (nested loops join). Je me demande si à l'origine tes indexes ne sont pas fragmentés, et donc quelle est la dernière date de calcul des stats sur ces indexes.
__________________
David B. |
|
|
00
|
|
|
#32 | |
|
Membre Expert
![]() ![]() Analyste / Programmeur / DBA Inscription : juillet 2006 Messages : 2 049 ![]() |
Citation:
Je ne connais encore rien de toute ce qui touche aux statistiques. Je sais que ça existe, quelque part, mais ça s'arrête là. J'attends que sqlpro pondent un article sur le sujet
__________________
Kropernic (anciennement Griftou). |
|
|
00
|
|
|
#33 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 170 ![]() |
Citation:
Lisez mon livre sur SQL et dans la partie administration des serveurs, dont le chapitre est en ligne, je traite des problèmes de performances.... Or les tables temporaires pose des problèmes de performances difficiles à cerner. En effet, comme il faut bien stocker en RAM les données de ces tables temporaires, cela met de la pression mémoire, qui fait dégager d'autres données. Ce n'est donc pas la table temporaire qui sera moins efficace... C'est TOUT LE RESTE ! En sus, une table temporaire est journalisée comme toute table de toute base, ce qui suppose des opérations d'écritures de fichiers... Enfin toute requête, CTE ou non, peut conduire à créer des tables temporaire pour réaliser le traitement (woktable). On ne peut donc pas opposer ces deux choses ! 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 * * * * * |
|
|
00
|
|
|
#34 | |
|
Membre Expert
![]() ![]() Analyste / Programmeur / DBA Inscription : juillet 2006 Messages : 2 049 ![]() |
Citation:
La partie en gras me fait un peu peur... Ok ma requête a été boostée et réponds au quart de tour mais si c'est pour que le reste du serveur rame à cause de ça quand ce sera en production (je dramatise sûrement mais bon), je ne suis pas sûr que cela en vaille vraiment la peine. Du coup, ne serait-il pas préférable que je cherche un autre moyen d'exécuter cette requête qui soit tout autant performant ? Je me souviens d'un papier que vous avez écrit où vous parlez de l'efficacité des vues indexées dans le cas de calculs importants. Je ne fais pas vraiment de calcul mais pas mal de fonction d'agrégation MIN et MAX. Est-ce que une ou plusieurs vues indexées ne serait pas une meilleure solution ?
__________________
Kropernic (anciennement Griftou). |
|
|
00
|
|
|
#35 |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
S'il y a des min/max, peut-être aussi des colonnes calculées en mode persistantes ?
|
|
|
00
|
|
|
#36 |
|
Membre Expert
![]() ![]() Analyste / Programmeur / DBA Inscription : juillet 2006 Messages : 2 049 ![]() |
Nope, pas de colonnes calculées persistantes. Du moins, pas dans mes "vraies" tables.
Après, est-ce que les colonnes produites par les fonction min et max dans les #tables sont considérées comme telle, je ne suis pas assez calé pour le savoir.
__________________
Kropernic (anciennement Griftou). |
|
00
|
|
|
#37 | |
|
Expert Confirmé Sénior
![]() ![]() ![]() David BARBARINInscription : août 2005 Messages : 4 166 ![]() |
Citation:
++ |
|
|
00
|
|
|
#38 |
|
Membre Expert
![]() ![]() Analyste / Programmeur / DBA Inscription : juillet 2006 Messages : 2 049 ![]() |
Ah mais c'est pas pour tout de suite ça...
La DB n'est même pas encore sur le serveur de production (logique, c'est un projet en développement). En plus, on attend de nouveaux serveurs d'ici la fin de l'année ^^ EDIT : J'ai tenté l'expérience avec les vues mais je n'arrive même pas à un résultat qui tourne... Je ne savais pas que les vues étaient si contraignantes dès qu'on commence à utiliser des vues dans la définition d'une nouvelle vue.
__________________
Kropernic (anciennement Griftou). |
|
00
|
|
|
#39 | ||
|
Membre Expert
![]() ![]() Analyste / Programmeur / DBA Inscription : juillet 2006 Messages : 2 049 ![]() |
Je reviens sur le sujet...
D'après le message de sqlpro, l'emploi de tables temporaires (et dans certains cas, celui de CTE's qui conduit à la création de tables temporaires) peut poser des problèmes de performances aux autres traitements du SGDBR. Du coup, que faudrait-il alors mettre en œuvre comme solution ? J'imagine que la "simple" requête reste la piste à privilégier plutôt que de multiples CTE's ou tables temporaires non ? Cette "simple" requête existe mais elle prend énormément de temps (j'ai déjà patienté 30 min avant de l'annuler). Le problème vient probablement d'un problème d'indexation de mes tables. Voici la requête en question : Code :
Selon vous connaissances expertes, que faut-il préférer ? La requête unique où la décomposition en plusieurs requêtes ? EDIT : Ajout du plan de requête estimé en pièce jointe.
__________________
Kropernic (anciennement Griftou). |
||
|
00
|
|
|
#40 |
|
Membre Expert
![]() ![]() Analyste / Programmeur / DBA Inscription : juillet 2006 Messages : 2 049 ![]() |
Une piste aussi qui n'est pas à exclure, serait de renvoyer les données brutes à l'applicatif client et d'y faire le traitement.
Niveau traitement, cela devrait aller très vite. Par contre, le transfert des données via le réseau, ça risque de merdé... Donc de base, je serais plutôt pour faire le taff côté DB même si c'est un traitement grandement cosmétique...
__________________
Kropernic (anciennement Griftou). |
|
00
|
Copyright © 2000-2013 - www.developpez.com