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

Administration Oracle Discussion :

Requête rapide après une 1ere execution / très lente avant


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Par défaut Requête rapide après une 1ere execution / très lente avant
    Bonjour,

    Je fais actuellement des tests de performance sur des procédures stockées qui sont très longues.
    Je suis surpris par le temps d'execution d'une procédure d'update d'une table qui prend plus de 30 minutes lors de la première execution, et qui prend moins de 2 minutes si je la relance une deuxième fois.

    Ma procédure fonctionne sur le modèle suivant :
    ------------------------------------
    cursor gc_cus is
    select *
    from TABLE_REF;
    ...
    for gci in gc_cus
    loop
    update TABLE_UPDATE
    set COL_A = gci.COL_A,
    COL_B = gci.COL_B,
    UPDATE_D = sysdate,
    UPDATED_BY = 'sys'
    where SYSID = gci.SYSID;
    commit;
    end loop;
    ------------------------------------
    SYSID est une colonne indexée (clé primaire).

    Je suppose que la deuxième exécution de la procédure est beaucoup plus rapide car mes blocks de données ont été mis dans le buffer cache. Est-ce bien cela?

    Quelle peut être la solution pour que la procédure soit plus rapide la première fois? Faut-il chercher plutôt au niveau de la structure de la table/indexes ou des paramètres Oracle?

    Je travaille en Oracle 8.1.7

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    c'est bon signe, ça veut juste dire que la 1ere fois toutes les données montent dans le cache et qu'ensuite c'est plus le disque qui est sollicité mais la mémoire

    La solution : mettre TABLE_REF dans le cache BUFFER

    Ensuite, faudrait que tu m'expliques l'intérêt d'utiliser un curseur

  3. #3
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Par défaut
    Mettre TABLE_REF dans le cache BUFFER...
    Comment faire pour qu'elle soit dans le buffer à la première execution?

    Sinon j'utilse un curseur, parce que... Heu
    La seule autre solution qui me vient à l'esprit est la suivante :

    update TABLE_UPDATE T
    set COL_A = (select COL_A from TABLE_REF where where SYSID = T.SYSID),
    COL_B = (select COL_A from TABLE_REF where where SYSID = T.SYSID),
    UPDATE_D = sysdate,
    UPDATED_BY = 'sys'
    where SYSID IN (select SYSID from TABLE_REF);

    C'est plus rapide? ou ce n'est pas ça?

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut


    ça ne marche pas ça ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    update TABLE_UPDATE T
    set (COL_A,COL_B) = (select COL_A,COL_B from TABLE_REF where SYSID = T.SYSID)
    UPDATE_D = sysdate,
    UPDATED_BY = 'sys'
    where SYSID IN (select SYSID from TABLE_REF);
    Sinon : http://download.oracle.com/docs/cd/B...09.htm#i997450

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ALTER TABLE table_ref STORAGE (BUFFER_POOL KEEP)

  5. #5
    Candidat au Club
    Inscrit en
    Juin 2008
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 3
    Par défaut
    Merci beaucoup pour tes réponses. Je vais comparer les temps d'exécution.

    Sinon, quelques questions :
    - pourquoi avoir proposé de mettre TABLE_REF dans le cache, et pas la table que j'update?
    - Est-ce recommandé/déconseillé de laisser en cache des grosses tables (plus d'un million de lignes)?
    - Si l'on ne veut pas laisser les tables en cache, il faut sans doute chercher du côté de l'optimisation des I/O disque? Si on on a plusieurs CPUs,augmenter le db_writer_processes est-il une possibilité? Si l'on a qu'un CPU, comment faire?

  6. #6
    Membre émérite Avatar de 13thFloor
    Homme Profil pro
    DBA Oracle freelance
    Inscrit en
    Janvier 2005
    Messages
    670
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Par défaut
    Citation Envoyé par nc_dvlp Voir le message
    Merci beaucoup pour tes réponses. Je vais comparer les temps d'exécution.

    Sinon, quelques questions :
    - pourquoi avoir proposé de mettre TABLE_REF dans le cache, et pas la table que j'update?
    - Est-ce recommandé/déconseillé de laisser en cache des grosses tables (plus d'un million de lignes)?
    - Si l'on ne veut pas laisser les tables en cache, il faut sans doute chercher du côté de l'optimisation des I/O disque? Si on on a plusieurs CPUs,augmenter le db_writer_processes est-il une possibilité? Si l'on a qu'un CPU, comment faire?
    Oracle alloue par défaut 1 processus dbwriter pour 8 cpu. Donc, en monocpu, 1 seul process devrait suffire. Si vraiment il y a beaucoup trop de buffer busy waits (attentes vues dans un report statspack), tu peux en ajouter un (si les io ne sont pas 100% busy bien sûr) pour accélérer les écritures des blocs sur disque.
    Si une table est très fréquemment accédée (en plus en full table) et qu'elle ne grossit pas, elle peut être candidate à une mise en cache. Ce n'est que mon avis. Si vraiment les FTS ne peuvent être évités et que la table est stable, why not. Sinon il faudra la partitionner pour limiter les IO. Pense à voir combien de blocs elle occupe. Il ne faut pas qu'elle gloutonne tout le cache.

Discussions similaires

  1. Execution trés lente d'un executable JAR
    Par debana dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 07/06/2012, 14h29
  2. Requête d'après une liste déroulante
    Par asaykon dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 05/10/2010, 14h27
  3. Réponses: 0
    Dernier message: 28/10/2009, 07h00
  4. [ASE]optimisation d'une proc stock trés lente
    Par 461219 dans le forum Adaptive Server Enterprise
    Réponses: 8
    Dernier message: 04/01/2008, 13h23
  5. Temps d'execution très lent
    Par bahiatoon dans le forum C++Builder
    Réponses: 16
    Dernier message: 19/07/2007, 23h45

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