Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
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/01/2011, 15h30   #1
Candidat au titre de Membre du Club
 
Inscription : septembre 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 56
Points : 10
Points : 10
Par défaut Problème performance sur une jointure

Bonjour,

J'ai un problème de performance (plus de 10 minutes) sur une jointure, et je pense que ma super optimisé mais la je n'ai plus vraiment d'idée

Code :
1
2
3
4
SELECT w.ID1,  t.ID2, CONVERT(DATE, t.Date) AS Date, COUNT(*) AS Number
FROM TABLE1 w
LEFT JOIN TABLE2 t ON w.ID=t.SendingParticipant
GROUP BY t.ID2, CONVERT(DATE, t.Date), w.ID
En sachant que table 1 j'ai à peu près 35000 records
Et dans la table 2 j'ai 3,000,000 de records

En sachant si je fais uniquement le requête ci-dessous cela me retourne 2979 records en moins de 2 secondes

Code :
1
2
3
SELECT ID2, CONVERT(DATE, Date) AS Date, COUNT(*) AS Number
FROM TABLE2
GROUP BY ID2, CONVERT(DATE, Date)
Et si je fais je fais cette requête sur la table 1 cela me retourne 183 records en moins de 2 secondes. Et en sachant que tous les ID1=ID2 exception faites de 4 ou 5 qui ne sont présent que dans la table1

Code :
SELECT DISTINCT(ID1) FROM table1
Voila si quelqu'un peut m'aider j'apprécierai beaucoup.

Merci par avance.

David
chicken92000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 15h42   #2
Membre Expert
 
Homme
Responsable de service informatique
Inscription : janvier 2009
Messages : 1 081
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 38
Localisation : France

Informations professionnelles :
Activité : Responsable de service informatique
Secteur : Boutique - Magasin

Informations forums :
Inscription : janvier 2009
Messages : 1 081
Points : 1 875
Points : 1 875
Bonjour,
Quel SGBD ?
Quel est le plan d'execution ?
Est-ce qu'on peut voir la définition de tes tables, et de indexes ?

Tatayo.
tatayo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 15h45   #3
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 443
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 443
Points : 7 528
Points : 7 528
Première question à se poser : y a-t-il un index sur les colonnes utilisées dans la jointure pour chacune des tables ?
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises [code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 16h40   #4
Candidat au titre de Membre du Club
 
Inscription : septembre 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 56
Points : 10
Points : 10
je suis sur SQL Server 2008.

Sinon au niveau des index aucun sur la table2 (3 millions de records) et un
index sur la table1 sur ID1 et sur d'autres champs que je n'utilise pas sur la requête.

J'ai fait le choix de ne pas mettre d'index sur la table2 pour des questions de performance lors de l'insertion cela à un sens ?

Pour vous envoyer le plan d'exécution comment je fais?

Merci

David
chicken92000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 17h01   #5
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 638
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 638
Points : 2 630
Points : 2 630
Votre table2 est une table de travail ?

Si ca n'est pas le cas, quelques index dessus seront les bienvenus.

Si c'est effectivement une table de travail, des tests pour savoir ce que vous coute un index lors du vidage / remplissage de celle-ci me sembleraient plus judicieux que de partir tout de suite sur le postulat : un seul index va me foutre en l'air les perfs
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 17h01   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 990
Points : 18 241
Points : 18 241
Envoyer un message via MSN à CinePhil
Pas d'index sur 3 millions de lignes = requêtes en lecture très lentes !

Avec SQL Server, je ne pense pas qu'il y ait de gros problèmes avec les insertions à cause des index, même avec 3 millions de lignes. Au pire, tu peux désactiver temporairement les index lors des insertions et les réactiver après.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 17h05   #7
Candidat au titre de Membre du Club
 
Inscription : septembre 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 56
Points : 10
Points : 10
Je pense que je me complique un peu trop, car après réflexion je ne pense pas qu'il soit nécessaire d’utiliser une autre table.

La structure de ma table est la suivante

Entite1 Entite2 Date Valeurs
Toto Tata 01/01/2011 300
Tete Toto 01/01/2011 600
Toto Tete 01/01/2011 250

je souhaiterai avoir comme résultat de ma requête

Entite Date Valeurs
Toto 01/01/2011 550
Tete 01/01/2011 600
Tata 01/01/2011 0

Merci

David
chicken92000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 17h13   #8
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Votre exemple n'est probablement pas suffisamment précis pour répondre à tous les cas de figure, néanmoins voici une base de départ :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
WITH MaTable (Entite1, Entite2, Date, Valeurs) AS -- Vos données
(
SELECT 'Toto', 'Tata', '01/01/2011', 300 union ALL
SELECT 'Tete', 'Toto', '01/01/2011', 600 union ALL
SELECT 'Toto', 'Tete', '01/01/2011', 250
)
  ,  SR (Entite, Date) AS
(
SELECT Entite1, Date FROM MaTable
 union
SELECT Entite2, Date FROM MaTable
)
  SELECT SR.Entite, SR.Date, coalesce(sum(MT.Valeurs), 0) AS Valeurs
    FROM SR
         LEFT OUTER JOIN MaTable AS MT
           ON MT.Entite1 = SR.Entite
          AND MT.Date    = SR.Date
GROUP BY SR.Entite, SR.Date
 
Entite Date       Valeurs
------ ---------- -----------
Tata   01/01/2011 0
Tete   01/01/2011 600
Toto   01/01/2011 550
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 17h25   #9
Candidat au titre de Membre du Club
 
Inscription : septembre 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 56
Points : 10
Points : 10
Merci Fabien pour ta réponse désolé mais je ne comprends pas très bien la 1ère partie de ton code.

Code :
1
2
3
4
5
6
7
WITH MaTable (Entite1, Entite2, Date, Valeurs) AS -- Vos données
(
SELECT 'Toto', 'Tata', '01/01/2011', 300 union ALL
SELECT 'Tete', 'Toto', '01/01/2011', 600 union ALL
SELECT 'Toto', 'Tete', '01/01/2011', 250
)
  ,  SR (Entite, Date) AS
David
chicken92000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/01/2011, 23h31   #10
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
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 950
Points : 17 769
Points : 17 769
Citation:
Envoyé par chicken92000 Voir le message
Sinon au niveau des indexe aucunes sur la table2 (3 millions de records) et un
indexe sur la table1 sur ID1 et sur d'autres champs que je n'utilise pas sur la requête.

J'ai fait le choix de ne pas mettre d'index sur la table2 pour des questions de performance lors de l'insertion cela à un sens ?
Désolé de le dire aussi crument, mais c'est d'une haute stupidité !
En effet les index sont nécessaire aussi bien pour les lecture que pour les écritures !!! En effet tout ordre SQL d'écriture commence par une lecture positionnelle pour savoir ou insérer. Sans index vous faites donc une lecture complete de la table à chaque insertion !!!!

On se demande parfois ou les gens vont pêcher de telles imbécilités comme mettre des index c'est mal...
Que serait une SGBDR sans index ni contraintes ? Un simple fichier Cobol !!!!

Maintenant sur l'indexation de ces tables , faites ceci :

Code :
ALTER TABLE TABLE2 ADD CONSTRAINT PK PRIMARY KEY (ID2);
si cela ne passe pas :
Code :
CREATE UNIQUE CLUSTERED INDEX X_21 ON TABLE2 (ID2)
SI cela ne passe toujours pas :
Code :
CREATE CLUSTERED INDEX X_21 ON TABLE2 (ID2)
et enfin :
Code :
CREATE INDEX X_22 ON TABLE2  (SendingParticipant, "Date")
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 déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 09h49   #11
Candidat au titre de Membre du Club
 
Inscription : septembre 2004
Messages : 56
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 56
Points : 10
Points : 10
Bonjour,

Merci de votre réponse et désolé si mes question sont "très stupides" et de t'avoir énervé ...

Par rapport à tes suggestions, je ne pense pas pouvoir utiliser ces colonnes car les valeurs ne sont pas uniques.

David
chicken92000 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2011, 09h58   #12
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
La première partie du code c'est simplement pour simuler votre jeu de données.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2011, 13h57   #13
Membre Expert
 
Avatar de iberserk
 
Homme Bruno IGNACE
Architecte de base de données
Inscription : novembre 2004
Messages : 1 299
Détails du profil
Informations personnelles :
Nom : Homme Bruno IGNACE
Âge : 30
Localisation : France, Gironde (Aquitaine)

Informations professionnelles :
Activité : Architecte de base de données
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2004
Messages : 1 299
Points : 2 282
Points : 2 282
Envoyer un message via MSN à iberserk
Ton topic est'il résolu?
iberserk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h51.


 
 
 
 
Partenaires

Hébergement Web