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 :

Comment identifier le temps de mise à jour des index inclus dans un update


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut Comment identifier le temps de mise à jour des index inclus dans un update
    Bonjour à tous

    Disons qu'on fait un update sur une table, qui dure 30 secondes.
    Cet update touche de multiples colonnes indexées, donc les index correspondants sont mis à jour.

    Je cherche à déterminer le temps passé à mettre à jour les index, pour pouvoir dire :
    temps total d'update de la table : 30 secondes
    dont mise à jour des index : 20 secondes

    Bien entendu, je cherche une méthode plus subtile que de tester avec et sans index !

    Avez-vous une idée, parce que moi je sèche désespérément.

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    On peut partir du principe que le temps est proportionnel au nombre de blocks lus parce que sinon il y a trop de paramètres (cache, organisation dans le bloc, etc...)

    Pour chaque ligne qui modifie une colonne indexée, il faut:
    - trouver l'entrée de la valeur courante dans l'index (blevel + block feuille, comme un accès par index)
    - marquer l'entrée comme deleted -> génération d'undo
    - trouver l'entrée de la nouvelle valeur dans l'index (blevel + block feuille, comme un accès par index)
    - rajouter l'entrée dans ce bloc -> génération d'undo
    - si le bloc feuille est plein (probabilité plus forte si un petit malin a cru bien faire en faisant des rebuild d'index réguliers) il y aura des splits de blocs qui peuvent amener un peu plus de blocs modifiés (et d'undo)

    Donc en première approximation, un delete ou insert va rajouter 3 ou 4 logical reads. Un update, le double. A comparer avec 1 logical read si il n'y a pas d'ndex.

    Cordialement,
    Franck.

  3. #3
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Bonjour Franck

    Merci pour cette réponse.
    Au-delà de l'approximation théorique, je cherche à effectuer une mesure effective (ou du moins m'en approcher le plus possible).

    Je n'ai pas trouvé dans un fichier de trace étendue d'informations qui me paraissent utiles à cette fin.
    Peut-être quelqu'un connaît-il un "event" magique à positionner pour obtenir des données là-dessus ?

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 999
    Billets dans le blog
    6
    Par défaut
    N'as tu pas dans le plan d'exécution, la possibilité d'avoir le détails des temps de chaque opération ?
    En récupérant ces plans et en les traitants tu devrais avoir une estimation...

    PS : j'ai pas oracle sous la main !
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    N'as tu pas dans le plan d'exécution, la possibilité d'avoir le détails des temps de chaque opération ?
    En récupérant ces plans et en les traitants tu devrais avoir une estimation...
    Bonjour, les plans d'exécutions ne montrent que l'accès aux données. Pas la maintenance des index, mview logs, des cascade constraints, etc.

  6. #6
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Citation Envoyé par Pomalaix Voir le message
    Bonjour à tous

    Disons qu'on fait un update sur une table, qui dure 30 secondes.
    Cet update touche de multiples colonnes indexées, donc les index correspondants sont mis à jour.

    Je cherche à déterminer le temps passé à mettre à jour les index, pour pouvoir dire :
    temps total d'update de la table : 30 secondes
    dont mise à jour des index : 20 secondes

    Bien entendu, je cherche une méthode plus subtile que de tester avec et sans index !

    Avez-vous une idée, parce que moi je sèche désespérément.

    Merci d'avance.
    Salut Richard,

    Par pure coïncidence quelqu'un a posé la même question très récemment dans otn

    https://community.oracle.com/message/14173069#14173069

    Comme indiqué par Jonathan Lewis et les autres tu peux te rapprocher de la réponse en analysant le contenu de la trace 10046. ASH (Active Session History) peut également donner un ordre d'idée en suivant l'object (l'index) dans les différents "sampling" faits par Oracle durant l'update.

    Bien Cordialement
    Mohamed Houri

  7. #7
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    Par pure coïncidence ...
    Mince, je suis démasqué !

    Salut Mohamed

    Je n'ai pas encore exploité les réponses données sur OTN, je les ai juste parcourues rapidement pour l'instant.

    Si on accepte l'approximation que le gros du temps de mise à jour de l'index est consommé lors des E/S physiques, alors la suggestion de Jonathan Lewis de les rechercher dans une trace étendue est une voie intéressante.
    En revanche, si tout est en cache de bout en bout, peut-être que dans les faits, on passe bien 70% du temps à mettre à jour les index, mais on ne détectera rien.

    Je note aussi avec intérêt la piste d'ASH.
    On aura la même restriction qu'avec la méthode précédente, et cette voie aura à mon avis une portée plus macroscopique que la précédente, étant donné la granularité grossière (toutes proportions gardées) de l'échantillonnage ASH.
    Si je m'intéresse à une exécution individuelle, c'est bien entendu la trace étendue qui sera pertinente. Si je veux une vision plus générale, comportementale, ASH me paraît pas mal.

    Juste pour la rigolade, j'ai aussi ouvert un ticket auprès du support Oracle. Fidèles à eux-mêmes, ils m'ont juste dit qu'il n'y avait pas moyen d'obtenir l'information que je recherchais.
    Heureusement qu'il y a la communauté !

    Merci à tous, et à suivre !

Discussions similaires

  1. swingworker comment retarder et synchroniser la mise à jour des champs du panel
    Par CobolProgrammator dans le forum EDT/SwingWorker
    Réponses: 1
    Dernier message: 01/09/2015, 00h01
  2. [Débutant] Mise à jour des données d'une BD(update) à l'aide de VB.net
    Par miracle11 dans le forum Général Dotnet
    Réponses: 1
    Dernier message: 21/06/2014, 03h03
  3. [AC-2003] problème de mise à jour des champs disponibles dans TCD
    Par patbeautifulday dans le forum IHM
    Réponses: 3
    Dernier message: 03/03/2010, 08h59
  4. Mise à jour des index lors d'un delete
    Par justine2401 dans le forum MySQL
    Réponses: 2
    Dernier message: 28/10/2008, 15h43
  5. Mise à jour des rendez vous dans Outlook
    Par pkrvz dans le forum VBA Access
    Réponses: 2
    Dernier message: 18/02/2008, 20h46

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