|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() Développeur décisionnel Inscription : mai 2011 Messages : 10 ![]() |
Bonjour,
Habituée d'Oracle, je découvre SQL-Server. J'ai un modèle en étoile avec un table de fait d'environ 20 millions d'enregistrements et une centaine de colonnes qui sont des id de tables de référence. Ces tables de référence contiennent entre 2 et 10 enregistrements. Je construit une requête du type : Requête 1 : Code :
Code :
Ainsi la requête 2 met 2mn30 de plus que la requête 1. Dans Oracle, l'ajout de libellés de tables de référence dans le SELECT n'a aucune influence sur les temps d'exécution ?! Donc je cherche à comprendre pourquoi c'est différent sous SQL-Server. J'ai testé la requête sans jointure et les performances sont bonnes. Ce sont donc les jointures avec les tables de référence de qqs lignes qui ralentissent fortement le temps d'exécution. Pouvez-vous m'expliquer pourquoi ? Et comment faire pour que ce ne soit pas le cas ? Avec mes remerciements, Pitchoonet |
||||
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 10 953 ![]() |
C'est un problématique de star join. Quelle version /édition de SQL Server ? (2005, 20088 enterpriss, standard.... ?
base relationnelle ou décisionnelle. ??? Évidemment ce serait mieux si c'était déjà un cube décisionnel ! 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
|
|
|
#3 | ||||
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 668 ![]() |
Bonjour,
Citation:
Citation:
Je suppose que vous avez les mêmes structures de table, mais avez-vous exactement les mêmes index ? Si c'est le cas, il vous faut voir d'où l'activité disque provient, à l'aide de l'option de session SET STATISTICS IO ON : Code :
Prenez aussi le plan de requête réel, qui vous décrira ce que fait SQL Server. Pour cela, il vous suffit d'activer son exposition : ![]() Il sera affiché dans un nouvel onglet nommé Execution Plan. Vous pouvez le sauvegarder en cliquant-droit sur celui-ci, et le poster ici ensuite (si cela vous est autorisé @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
||||
|
00
|
|
|
#4 |
|
Invité de passage
![]() Développeur décisionnel Inscription : mai 2011 Messages : 10 ![]() |
Merci pour votre aide.
Version : Microsoft SQL Server Enterprise Edition (64-bit) 2008 R2 Base de données relationnelle Pitchoonet |
|
|
00
|
|
|
#5 | ||
|
Invité de passage
![]() Inscription : novembre 2010 Messages : 4 ![]() |
bonjour,
En plus de ce que vous a dit elsuket essayer de modifiant la requête comme ci-dessous, et comparer les plan d'executions avec votre requête d'origine. Code :
|
||
|
|
00
|
|
|
#6 |
|
Invité de passage
![]() Développeur décisionnel Inscription : mai 2011 Messages : 10 ![]() |
Grâce à votre aide, j'ai pu identifier 2 facteurs de ralentissement de ma requête :
- le passage de 9 à 10 jointures avec des tables de référence : ma requête passe de 1mn30 à 8mn. J'ai essayer avec plusieurs jointures différentes afin d’identifier si le facteur discriminant était le nombre de jointures ou la volumétrie ramenée et j'obtiens donc 1mn30 d'exécution en ramenant 230 000 lignes et 8mn en ramenant 130 000 lignes. Svp, existe-t-il une limitation de ce type à votre connaissance? - l'utilisation d'un case dans ma fonction d'agrégation : count(distinct case when TF.TR_ID=1 then TF.PrimaryKeyId end) J'imagine que le second facteur discriminant doit pouvoir se résoudre avec des indexs. Svp, avez-vous des recos? Avec mes remerciements, Pitchoonet |
|
|
00
|
|
|
#7 |
![]() ![]() |
Il faudrait voir la structure de façon un peu plus globale, déjà est-ce que la centaine de colonnes se justifie totalement dans la table de faits ?
C'est beaucoup cent colonnes, j'espère que vous n'avez pas construit une matrice creuse pour coller au modèle en étoile. Votre table de faits est-elle construite avec une clef primaire clustered ou non-clustered ? Dans ce cas-ci, vu que l'accès aux données ne se fait pas sur la clef primaire, j'opterais pour une non-clustered, au contraire de toutes vos tables de références. Est-ce que vos colonnes de références sont toutes indexées ? Est-ce que vos relations sont correctement définies par des clefs étrangères ? Est-ce que vous avez essayé votre requête avec des index composites ? Si la requête que vous avez présenté au départ est représentative de votre vraie requête, le distinct dans le count est inutile. Pour le case à l'intérieur de celui-ci, je ne sais pas, ça dépend de vos données et de ce que vous essayez d'en extirper.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#8 | |
|
Membre Expert
![]() |
Citation:
Sur le plan d’exécution estimé, le nombre de lignes qu'il estime traiter est'il cohérent avec le nombre réel de lignes? J'ai eu le soucis sur une requête avec de multiples LEFT JOIN... il manquait une statistiques sur un couple de colonnes... je suis ainsi passé de 5mn... à 3secondes :-) Un coups d'oeil de ce côté là ne fera pas de mal...
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#9 | |
![]() ![]() ![]() David BARBARINExpert SQL Server Inscription : août 2005 Messages : 3 723 ![]() |
Citation:
|
|
|
00
|
|
|
#10 | |
|
Membre Expert
![]() |
Citation:
A toi aussi ![]() Une épidémie surement
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#11 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 668 ![]() |
Effectivement, la Thaïlande étant également touchée ...
Et c'est probablement pas le seul pays @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#12 |
|
Invité de passage
![]() Développeur décisionnel Inscription : mai 2011 Messages : 10 ![]() |
Ce n'est pas moi qui ai construit le modèle et il est trop tard pour le modifier.
Je fais donc avec ce dont j'hérite... Concernant les indexs de PK, ils sont en cluster. Je vais essayer de le passer en non cluster sur la table de fait. A ce sujet, est-il possible de créer une contrainte de PK sans l'index sous SQL Server? Pour l'histoire des statistiques, svp pouvez-vous m'indiquer comment les voir? |
|
|
00
|
|
|
#13 | |||||
|
Membre Expert
![]() |
Citation:
Citation:
Citation:
Code :
Mais plus visuellement dans SSMS au niveau de votre table vous avez un node 'statistiques'
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|||||
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() |
Mais le mieu est vraiment de nous fournir le plan d'execution comme vous l'a expliqué elsuket
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
00
|
|
|
#15 |
|
Invité de passage
![]() Développeur décisionnel Inscription : mai 2011 Messages : 10 ![]() |
Voici les plans d'exécutions.
Avec mes remerciements, Pitchoonet |
|
|
00
|
|
|
#16 | |
|
Membre Expert
![]() |
Citation:
Il vous manque également des index... SQL SERVER (est'il gentil tout de même) vous en propose dailleurs... commencez par harmoniser vos Requètes et creez l'index manquant (profitez en pour aliaser vos tables!!! c'est illisible)
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. |
|
|
|
00
|
|
|
#17 |
|
Invité de passage
![]() Développeur décisionnel Inscription : mai 2011 Messages : 10 ![]() |
La proposition de SQL Server (il est gentil:-)) est de créer un index avec inclusion de toutes les colonnes de mon select...
C'est une solution trop spécifique pour être acceptable dans le contexte de mon projet... |
|
|
00
|
|
|
#18 |
![]() ![]() ![]() David BARBARINExpert SQL Server Inscription : août 2005 Messages : 3 723 ![]() |
Effectivement créer un index avec l'ensemble des colonnes devient abérant. Cependant la plus grosse consommation de votre requête vient de la table TF_COMPTE.
Que pouvez vous nous dire sur la cardinalité de valeurs de la colonne TF_COMPTE.EDITEUR_TF1_FR_ID ? Quelle est la proportion de valeurs <> 0 dans cette table ? Code :
TF1BDDCiblage.Contact.TF_COMPTE.EDITEUR_TF1_FR_ID <> 0 ++ |
|
00
|
|
|
#19 |
|
Invité de passage
![]() Développeur décisionnel Inscription : mai 2011 Messages : 10 ![]() |
La colonne EDITEUR_TF1_FR_ID est de type bit.
Voici la répartition des lignes dans la table TF_COMPTE: 0 10207666 1 7295917 J'ai déjà créé un index non cluster sur cette colonne. C'est ma seule condition de clause WHERE et donc mon premier réflexe. Mais le plan d'exécution ne l'utilise pas... Toute proposition de création d'index est la bienvenue. Svp, y a-t-il l'équivalent des indexs bitmap en SQL Server? Avec mes remerciements, Pitchoonet |
|
|
00
|
|
|
#20 |
![]() ![]() |
C'est normal que l'optimiseur choisisse de ne pas utiliser l'index, il n'est absolument pas discriminant.
Si ce critère revient dans beaucoup de vos requêtes vous gagneriez à partitionner votre table sur cette colonne.
__________________
Email : http://scr.im/waldar |
|
00
|
Copyright © 2000-2012 - www.developpez.com