Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
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 22/04/2011, 16h05   #1
Membre du Club
 
Homme Andre Parent
Webmaster
Inscription : septembre 2007
Messages : 96
Détails du profil
Informations personnelles :
Nom : Homme Andre Parent
Localisation : Canada

Informations professionnelles :
Activité : Webmaster
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : septembre 2007
Messages : 96
Points : 66
Points : 66
Par défaut Optimisation d'une requête

Bonjour,
J'ai du reprendre les travaux d'un programmeur ingénieur en informatique. Donc la structure mal concu de la base de donnée était déjà en place et je ne peux pas la modifier à part ajouter des tables et des index.

Cette base de donnée sert à un odorateur incluant un gestion des projets.

Donc il y a une table repository qui contient les Punch-in et Punch-Out. Par contre l'ingénieur à décidé de créer un enregistrement pour un punch-in et un autre pour un punch-out. Donc pour calculer le temps il faut trouver le punch-out associée a ce punch-in.
Le punch-out peut etre place avant le punch-in dans la table.
Le punch-in peut ne pas avoir de punch-out pour le moment.
Dans certains cas(car l'administrateur peut ajouté/suprimmer manuelement des punch-in/out) il peut avoir 2 punch-in/out de suite mais dans ce temps c'est normal que GIGO s'applique.



Voici la table Repository
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
CREATE TABLE repository (
id int(11) UNSIGNED NOT NULL AUTO_INCREMENT,
username varchar(25) character SET latin1 NOT NULL DEFAULT '',
state tinyint(1) UNSIGNED NOT NULL DEFAULT '0',
date_time datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
FK_Projet int(11) DEFAULT NULL,
task_id int(11) NOT NULL,
curSalaryCost float(10,2) DEFAULT '0.00',
UNIQUE KEY id (id),
KEY idxUserName (username,FK_Projet,task_id),
KEY idxDateTimeUser (date_time,username)) 
ENGINE=MyISAM  
DEFAULT CHARSET=utf8;
Pour associer les punch in et punch out j'ai créer un VIEW mais elle est lente(2 seconde pour 1800 enregistrements présentement) car je ne suis pas capable d'utilisé WITH dans mysql et je n'ai pas trouver de moyen de faire un jointure effiace donc j'ai utilisé un select imbriqué(tres mauvais). Ca fonctionne mais c'est trop lent.

Voici ma VIEW
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
SELECT 
`a`.`id` AS `id`,
`a`.`username` AS `username`,
`a`.`state` AS `state`,
`a`.`date_time` AS `date_time`,
`a`.`FK_Projet` AS `FK_Projet`,
`a`.`task_id` AS `task_id`,
`a`.`curSalaryCost` AS `curSalaryCost`,
`seconds_between`(`a`.`date_time`,ifnull(
                        (SELECT `b`.`date_time`  
                         FROM `repository` `b` 
                         WHERE ((`a`.`username` = `b`.`username`) 
                         AND (`b`.`state` = 2) 
                         AND (`b`.`date_time` > `a`.`date_time`)) ORDER BY `b`.`date_time` LIMIT 0,1),now())) AS `iNbSeconde` 
FROM `repository` `a`
WHERE (`a`.`state` = 1) 
ORDER BY `a`.`date_time`
seconds_between est tout simplement une fonction que j'ai fait pour calculer le nombre de seconde entre 2 date_time.


Donc si vous avez des piste pour m'aider, ca serait grandement apprécié.

Merci à l'avance
Webselect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 17h50   #2
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
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 953
Points : 17 773
Points : 17 773
Commencez par placer les bons index (state, date_time)
Ensuite MySQL n'ayant pas de fonction optimisées comme ROW_NUMBER, LEAD et LAG, le fait de retrouver la ligne suivante ou précédente sera congénitalement lent.
Seule solution passer à un vrai SGBDR vraiment libre comme PostGreSQL qui sait faire ce genre de choses sans problème !
A lire : http://blog.developpez.com/sqlpro/p9...udre-aux-yeux/
http://blog.developpez.com/sqlpro/p9...lles-en-sql-1/

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 22/04/2011, 18h01   #3
Membre du Club
 
Homme Andre Parent
Webmaster
Inscription : septembre 2007
Messages : 96
Détails du profil
Informations personnelles :
Nom : Homme Andre Parent
Localisation : Canada

Informations professionnelles :
Activité : Webmaster
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : septembre 2007
Messages : 96
Points : 66
Points : 66
hehe, merci beaucoup. J'espérais avoir une réponse de toi.

J'ai pas le pouvoir de changer la BD donc j'ai résolu le problème en le contournant.

Je crée tout simplement une table temporaire(qui contient les bons indexs) au début de mon code dans lequel j'insère les données de ma VIEW déjà pré-filtrer.

Par la suite j'interroge cette table temporaire qui est vraiment plus rapide. Et avant de finir mon code, j'efface cette table.

C'est sûr que j'aurais pus aussi créer cette table permanente et l'incrémenter avec des triggers mais je n'ai même pas accès a ceux-ci non plus


En passant SQLpro, j'ai appris 90% de ce que je sais des Bases de Données par tes tutoriels et faut croire que c'est vraiment mieux que ce qu'ils enseignent dans les universités du Québec.
Webselect est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/04/2011, 20h15   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
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 953
Points : 17 773
Points : 17 773
Oui, sauf que apprendre avec MySQL c'est quand même plus que limite.... Ce n'est toujours pas un vrai SGBD relationnel !

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 22/04/2011, 21h02   #5
Membre du Club
 
Homme Andre Parent
Webmaster
Inscription : septembre 2007
Messages : 96
Détails du profil
Informations personnelles :
Nom : Homme Andre Parent
Localisation : Canada

Informations professionnelles :
Activité : Webmaster
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : septembre 2007
Messages : 96
Points : 66
Points : 66
Citation:
Envoyé par SQLpro Voir le message
Oui, sauf que apprendre avec MySQL c'est quand même plus que limite.... Ce n'est toujours pas un vrai SGBD relationnel !

A +
t'inquiete, J'ai apris avec MS SQL et son Transact SQL
Webselect 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 06h04.


 
 
 
 
Partenaires

Hébergement Web