Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
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 20/06/2011, 01h28   #1
Invité de passage
 
Inscription : août 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 8
Points : 0
Points : 0
Par défaut [oracle] Comment optimiser mon select ?

Bonjour,


Je suis en stage dans une boite, et on me demande d'optimiser un outil VBA qui utilise une base de donnees oracle .

Des lenteurs sont présentes, mon select dure 20 minutes car il parcourt les donnees en partant de 0... Comment le faire commencer a 50000 par exemple afin de cibler les recherches (les resultats que j'attends bien souvent sont vers la fin) ? OU une autre idée que la mienne serait plus judicieuse ?


Autres choses, comment optimiser le transfert de données sur feuilles à votre avis ?
Perso je pense à faire des transfert de gros blocs et travailler sous VBA, qu'en pensez vous ?




Merci beaucoup par avance pour toute intervention
sousou94 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 20/06/2011, 10h31   #2
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 431
Points : 10 431
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Avec votre requête, ce serait probablement plus simple !
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/06/2011, 10h43   #3
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
et une requête qui commence à 50000 ça ne veut strictement rien dire : les données ne sont pas ordonnées dans une table. Une table c'est un sac de bille, pas une étagère
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/06/2011, 10h47   #4
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Salut !

Cf. Waldar : avec la requête, c'est sans aucun doute mieux.

Et pour faire suite à Orafrance, il faut qu'on sache ce que tu cherches fonctionnellement :
Quelques / beaucoup de lignes ?
Comment identifies-tu les lignes dont tu as besoin ?
(Les dernières... par rapport à une date ? Autre chose ?)

Ce qui peut améliorer drastiquement les performances d'une appli qui fait des requêtes sur une base, ça peut être également les indexes disponibles...
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 20/06/2011, 11h45   #5
Invité de passage
 
Inscription : août 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 8
Points : 0
Points : 0
Merci pour vos réponses,

orafrance : Au temps pour moi, je visualise mal le processus

La requete est du type "select sum(decode(task,'request','1','0')) Request,sum(decode(task,'incident','1','0')) Incident,count(*) " avec un for *16 .

Concretement, mon responsable va vouloir connaitre la somme des tâches ou temps passés sur une tâche mais toujours sur le mois dernier...

@pacmann: Je cherche surtout à retourner le chiffre attendu, soit un "temps passés" à virgule ou soit un nombre entier... donc c'est le plus souvent 1 voire 2 lignes (je parle du gros de l'outil)

J'identifies les lignes par l'équipe dont fait partie la personne, le type de tâche, et d'autres paramètres comme si la tâche demande plusieurs jours etc....

Et les lenteurs d'apres moi proviennent surtout d'un truc tout bête ... l'outil se connecte à chaque fois a la BDD pour retourner un chiffre (le temps passés ou le nombre de tâches) .. c'est pour cela que je me suis dis qu'il fallait mieux retourner de gros blocs et travailler ça sous VBA ... non ?

Cordialement
sousou94 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 20/06/2011, 11h57   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 34

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Citation:
Envoyé par sousou94 Voir le message
Concretement, mon responsable va vouloir connaitre la somme des tâches ou temps passés sur une tâche mais toujours sur le mois dernier...
Faudrait au moins un index sur la date à ce moment là

Citation:
Envoyé par sousou94 Voir le message
Et les lenteurs d'apres moi proviennent surtout d'un truc tout bête ... l'outil se connecte à chaque fois a la BDD pour retourner un chiffre (le temps passés ou le nombre de tâches) .. c'est pour cela que je me suis dis qu'il fallait mieux retourner de gros blocs et travailler ça sous VBA ... non ?
Ou faire une requête qui retourne tous les chiffres d'un coup... mais c'est vrai que se reconnecter à chaque fois c'est moyen
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 20/06/2011, 12h02   #7
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
for * 16 ?

Si c'est parce qu'il veut l'indicateur pour les 16 équipes, tu peux faire une seule requête en faisant un GROUP BY equipe (au lieu de mettre à chaque fois dans le filtre), et traiter comme tu le dis en VBA le résultat.

... il n'en reste pas moins que comme dit Orafrance, un index sur la date te permettra probablement de ne pas te taper les lignes de "1 à 50000"
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 12h27   #8
Invité de passage
 
Inscription : août 2010
Messages : 8
Détails du profil
Informations forums :
Inscription : août 2010
Messages : 8
Points : 0
Points : 0
On arrive à mes limites , comment faire cet index ? sur que base ? je ne visualise pas ...

La requête ne peut retourner tout les chiffres d'un coup, je pense pas du moins, car il y a des sum mais aussi des requêtes sans "sum" ...mais il est possible au moins de passerde 16 à 20 requêtes qui se ressemblent à 5-6 .


pacmann : "group by" sur quoi ? sur un critere exemple l'équipe dont fait partie la personne ?
sousou94 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/06/2011, 13h09   #9
Membre Expert
 
Avatar de pacmann
 
Homme Pacman Pacman
Business analyst
Inscription : juin 2004
Messages : 1 417
Détails du profil
Informations personnelles :
Nom : Homme Pacman Pacman
Âge : 31
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Business analyst
Secteur : Finance

Informations forums :
Inscription : juin 2004
Messages : 1 417
Points : 2 309
Points : 2 309
Ben comme ta description est vague, c'est difficile de te donner un exemple concret

Si ton appli, pour une seul "page" à charger, fait :
Code :
1
2
 
SELECT count(*) FROM activite WHERE equipe = 1 AND dateactivite = SYSDATE
Code :
1
2
 
SELECT count(*) FROM activite WHERE equipe = 2 AND dateactivite = SYSDATE
... etc

Code :
1
2
 
SELECT count(*) FROM activite WHERE equipe = 16 AND dateactivite = SYSDATE
[code]

A la place, tu peux faire :
Code :
1
2
3
4
5
 
SELECT equipe, count(*)
FROM activite
WHERE dateactivite = SYSDATE
GROUP BY equipe
Cela te renvoie un resultset avec tous les résultats, avec lesquels tu pourras populer tes différents champs ensuite (je ne sais pas du tout comment c'est organisé chez toi, vu que tu ne nous l'as pas vraiment dit )

Sinon, un index, ça sert à accéder aux données ponctuelles que tu cherches, sans pour autant lire toute une table.
Donc un index se créerait dans ton cas sur la date, parce que ce sont seulement les lignes les plus récentes qui t'intéressent...
(A créer sur la base Oracle, sur ta grosse table)

Mais pour qu'on puisse être plus précis, il faudrait que tu nous donnes la requête complète, la description de la table et de ces indexes, ...
__________________

(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...

Le pacblog : http://pacmann.over-blog.com/
pacmann est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h32.


 
 
 
 
Partenaires

Hébergement Web