IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

[9i] optimisation de requete


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 283
    Par défaut [9i] optimisation de requete
    Bonjour,

    Une base 9i sur un serveur W2K3 héberge un progiciel REMEDY.

    Je suis confronté à de gros problèmes de performance, lors de l'ouverture d'une session (via client lourd) REMEDY génére un code dynamique dont voici une partie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    SELECT	COUNT(*) 
    FROM 	T930 
    WHERE 	
    			(
    				(
    					(T930.C1000000079 = 'SGP000000000004'
    					) 
    				AND 	(' ' = ' '
    					)
    				) 
    			OR 	(
    					(' ' = T930.C536871260
    					) 
    				AND 	(
    						(T930.C1000000079 != ' '
    						) 
    					OR 	(T930.C1000000427 != ' '
    						)
    					)
    				)
    			)
    Lorsque j'execute cette requete il s'écoule une quinzaine de secondes.

    Le plan d'execution montre que l'on effectue un full scan de la table T930 (300.000 enregistrements avec les stats à jour), les index ne sont pas utilisés.

    Lorsque je décompose la requête en deux requêtes distinctes l'execution de chaque requête est instantannée et le plan d'execution montre que l'on passe par les index.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT	COUNT(*) 
    FROM 	T930 
    WHERE 	
    			(
    				(
    					(T930.C1000000079 = 'SGP000000000004'
    					) 
    				AND 	(' ' = ' '
    					)
    				) 
    			)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT	COUNT(*) 
    FROM 	T930 
    WHERE
    				(
    					(' ' = T930.C536871260
    					) 
    				AND 	(
    						(T930.C1000000079 != ' '
    						) 
    					OR 	(T930.C1000000427 != ' '
    						)
    					)
    				)
    Je suis en mode CHOOSE et je ne peux pas passer en mode RULES.

    Est il possible selon vous d'optimiser cette partie de requête ?

    Merci pour votre aide,
    Alain

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Peut-être comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT COUNT(*)
      FROM
    (
    SELECT <PK>
      FROM T930 
     WHERE T930.C1000000079 = 'SGP000000000004'
     UNION
    SELECT <PK>
      FROM T930
     WHERE T930.C536871260 = ' ' 
       AND (T930.C1000000079 <> ' ' OR  T930.C1000000427 <> ' '))
    );
    Avec <PK> les colonnes de la clef primaire de la table.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 283
    Par défaut
    Bonjour

    Je viens de tester, effectivement ça marche beaucoup mieux

    Je n'avais pas pensé à faire une requête imbriquée avec un opérateur UNION.

    J'ai souvent parcouru les forum à la recherche des 'règles principales' pour optimiser les requêtes.

    Je retiens celle ci.

    Un grand merci, je vais appliquer cette règle sur l'ensemble de ma requete.

    Bonne journée,
    Alain

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 283
    Par défaut
    Bonjour,

    J'ai fait une petite erreur, en effet lorsque j'ai scindé la requête j'ai oublié l'une des clauses OR , j'ai essayé de l'ajouter dans la requête modifée mais je sèche un peu

    La requête initiale était la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    SELECT	COUNT(*) 
    FROM 	T930 
    WHERE 	
    			(
    				(
    					(T930.C1000000079 = 'SGP000000000004'
    					) 
    				AND 	(' ' = ' '
    					)
    				) 
    			OR 	(
    					(' ' = T930.C536871260
    					) 
    				AND 	(
    						(T930.C1000000079 != ' '
    						) 
    					OR 	(T930.C1000000427 != ' '
    						)
    					)
    				)
    			)
    J'ai mis en rouge la clause OR en question.

    Merci pour votre aide,
    Alain

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Vous ne l'aviez pas oublié, elle est bien présente dans votre requête initiale ainsi que dans la solution que je vous ai proposé : j'ai juste modifié l'ordre des opérandes, en lecture je préfère comparer une colonne à une valeur plutôt qu'une valeur à une colonne.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    283
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 283
    Par défaut
    Bonjour,

    Merci pour votre réponse, en fait je me suis aperçu que la table en question présentait un taux de chainage très important.

    J'ai fait un move de la table, le problème est résolu (pour le moment).

    Peut-on faire un alter table move [online] en 9i sans risque ?

    Bonne fin de journée,
    Alain

Discussions similaires

  1. Optimisation de requete
    Par Scorff dans le forum MS SQL Server
    Réponses: 8
    Dernier message: 11/07/2005, 09h59
  2. [sgbd]Optimisation des requetes Oracle/Perl
    Par linou dans le forum SGBD
    Réponses: 7
    Dernier message: 30/06/2005, 18h09
  3. Optimiser une Requetes SQL sous ASP
    Par NeHuS dans le forum ASP
    Réponses: 8
    Dernier message: 18/04/2005, 16h26
  4. Optimisation de requete
    Par cyril dans le forum SQL
    Réponses: 3
    Dernier message: 09/10/2003, 08h57
  5. Optimisation des requetes
    Par bifidus dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 06/10/2003, 11h29

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo