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 :

Performance d'une requête


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut Performance d'une requête
    salut à tous,

    Voilà j'ai une autre requête que je voudrais optimiser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Update tab1 set
    FLAG_CLIENT = w_client
    , FLAG_LIGNE = (select case when w_client > FLAG_LIGNE then w_client else FLAG_LIGNE end from dual)
    where status = 'NEW'
    and FLAG_EQUILIBRE = '0'
    and not exists ( select 'x' from tab2 where tab2.CLIENT = substr(LIGNE_ME,1,16))
    J'ai créé 2 indexes sur tab1 :

    - le premier avec (status ,FLAG_EQUILIBRE)
    - le second avec (substr(LIGNE_ME,1,16))

    et sur tab2 :
    - un index sur (CLIENT ).

    Qu'est ce que vous en pensez?

  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
    Pourquoi cette requête sur DUAL ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    UPDATE tab1
       SET FLAG_CLIENT    = w_client
         , FLAG_LIGNE     = greatest(w_client, FLAG_LIGNE)
     WHERE STATUS         = 'NEW'
       AND FLAG_EQUILIBRE = '0'
       AND NOT EXISTS (SELECT NULL
                         FROM tab2
                        WHERE tab2.CLIENT = substr(LIGNE_ME, 1, 16));
    Quant aux index, ça peut améliorer, ça peut dégrader, ça peut ne rien changer.
    Ça dépend de vos données.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Merci pour le "greatest" je ne connaissais pas!!

    Sinon, la table tab1 et tab2 ont plus de 1 millions de lignes (tab1 varie de 200 000 jusqu'à 2,5 millions et la table tab2 ne varie pas trop 1,4 millions )

  4. #4
    Membre émérite Avatar de NicoL__
    Homme Profil pro
    Architecte
    Inscrit en
    Janvier 2011
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte

    Informations forums :
    Inscription : Janvier 2011
    Messages : 399
    Par défaut
    A ma connaissance il oracle utilise 1 index par table et par requête. Tu peux vérifier le plan d'exécution dans Toad.
    Mais à priori un index avec les 3 champs est peut être mieux, si oracle l'utilise.
    Par contre il ne vaut mieux pas mettre d'index sur FLAG_CLIENT et FLAG_LIGNE car je pense que ça serait pénalisant.

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2010
    Messages
    211
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 211
    Par défaut
    Comment je pourrais voir le plan d’exécution de la requête dans toad?

  6. #6
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Attention Waldar, ton code n'est pas identique, tu ne gères pas les NULL
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    WITH t AS (SELECT 10 AS flag_ligne FROM dual),
    w AS (SELECT 1 w_client FROM dual 
    UNION SELECT 20 FROM dual
    UNION SELECT NULL FROM dual)
    SELECT flag_ligne, w_client,
    	(SELECT CASE WHEN w_client > FLAG_LIGNE THEN w_client ELSE FLAG_LIGNE END FROM dual) res,
    	GREATEST(w_client, FLAG_LIGNE) great,
    	NVL(GREATEST(w_client, FLAG_LIGNE), FLAG_LIGNE) ok
    FROM t, w
     
    FLAG_LIGNE	W_CLIENT	RES	GREAT		OK
    10		1		10	10		10
    10		20		20	20		20
    10		(null)		10	(null)		10

  7. #7
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par AbouZaid Voir le message
    Comment je pourrais voir le plan d’exécution de la requête dans toad?
    Dans Toad, c'est l'icône de l'ambulance. Tu surlignes ta requête et tu cliques sur l'ambulance (ou menu Database / Optimize / Explain Plan).

Discussions similaires

  1. [TSQL] Performance d'une requête "exists"
    Par dj_lil dans le forum Développement
    Réponses: 2
    Dernier message: 04/01/2008, 11h45
  2. Réponses: 8
    Dernier message: 21/09/2007, 14h51
  3. [MySQL 5]Performance d'une requêtes select
    Par SuperCed dans le forum Requêtes
    Réponses: 8
    Dernier message: 01/08/2006, 12h51
  4. [SQL2K] Problème anormal de performance d'une requète
    Par G. Goossens dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/03/2006, 12h06
  5. [SQL ] performances dans une requête
    Par claralavraie dans le forum Oracle
    Réponses: 12
    Dernier message: 05/01/2006, 17h54

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