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 :

Multiples requêtes techniques


Sujet :

Administration Oracle

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

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Points : 945
    Points
    945
    Par défaut Multiples requêtes techniques
    Bonjour,
    chez un de mes clients, je constate l'exécution de beaucoup de requêtes du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select * from
     (select null TABLE_CATALOG, ac.owner TABLE_SCHEMA, ac.table_name TABLE_NAME, 
      acc.column_name COLUMN_NAME, null COLUMN_GUID, null COLUMN_PROPID, 
      acc.position ORDINAL from all_constraints ac, all_cons_columns acc where 
      ac.owner = acc.owner and ac.table_name = acc.table_name and 
      ac.constraint_type = 'P' and ac.constraint_name = acc.constraint_name) 
      DBSCHEMA_PRIMARY_KEYS  WHERE TABLE_SCHEMA ...
    Elles sont exécutées par dizaines ou centaines et ce sont celles qui consomment le plus de temps CPU et surtout réseau (beaucoup de SQL*Net message from client).

    Toutes les requêtes applicatives s'exécutent très vite mais celles-ci (que ej qualifie de requêtes techniques) apparaissent en top dans awr.
    Elles proviennent de l'exécutable situé sur le poste client.

    La configuration est :
    client : 11.1.0.6 + OLEDB
    serveur : 11.2.0.2/Solaris 10

    D’où proviennent ces requêtes ?
    Comment limiter leur nombre d'exécution ?

  2. #2
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Je ne comprends pas bien votre question.
    D’où proviennent ces requêtes ?
    Vous le dites par vous même
    Elles proviennent de l'exécutable situé sur le poste client
    Comment limiter leur nombre d'exécution ?

    Ca c'est simple: ne pas les exécuter.

  3. #3
    Membre régulier
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Septembre 2010
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2010
    Messages : 73
    Points : 93
    Points
    93
    Par défaut
    Salut,

    Alors on formate le code en premier pour qu'il soit bien lisible :

    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
    SELECT * FROM
     (
    	SELECT 	NULL TABLE_CATALOG, 
    		ac.owner TABLE_SCHEMA, 
    		ac.table_name TABLE_NAME, 
      		acc.column_name COLUMN_NAME, 
    		NULL COLUMN_GUID, 
    		NULL COLUMN_PROPID, 
      		acc.position ORDINAL 
    	FROM 
    		all_constraints ac, 
    		all_cons_columns acc 
    	WHERE 
      		ac.owner = acc.owner 
    		AND ac.table_name = acc.table_name 
    		AND ac.constraint_type = 'P' 
    		AND ac.constraint_name = acc.constraint_name
    ) 
    DBSCHEMA_PRIMARY_KEYS 
    WHERE TABLE_SCHEMA = ...
    De ce que je vois, cette requete renvoit pour chaque schéma et toutes les tables du schéma la liste des colonnes qui constituent la clé primaire (de chaque table).

    Le filtre TABLE_SCHEMA = ... permet d'avoir le détail pour un schéma (un compte) donné.

    Cette requête exécutée plusieurs fois /seconde/minute/heure/jour provoque des soucis de perf, c'est sûre.

    Le client qui balance cette requête est une appli java ? .net ? ...

  4. #4
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Hello,

    Parfois des application utilisent ce genre de requête pour vérifier qu'un index existe afin d'optimiser la requête dynamique qui sera exécutée.

    Par exemple l'application T24 de témenos fait cela constamment...
    Pas une bonne chose mais pas le choix!

    Il est possible de contourner un peu en créant 2 tables privées à votre schéma en dupliquant les 2 vues systèmes puis en créant un synonyme local.
    Optimiser si besoin l'accès via un index.

    Ne pas oublier de rafraichir le contenu des table si modification de l'application.
    Et bien documenter le work-arround!
    jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

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

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Points : 945
    Points
    945
    Par défaut
    Citation Envoyé par alexisongagna Voir le message
    Le client qui balance cette requête est une appli java ? .net ? ...
    Je ne sais pas comment est conçue l'appli, elle requiert Provider Oracle pour OLE DB.
    On dirait que l'appli recherche pour chaque table accédée les composants des clés primaires.

    @jkofr : je vais essayer ton workaround

  6. #6
    Membre éclairé Avatar de jkofr
    Homme Profil pro
    Senior Consultant DBA (Trivadis SA)
    Inscrit en
    Octobre 2006
    Messages
    484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : Suisse

    Informations professionnelles :
    Activité : Senior Consultant DBA (Trivadis SA)
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 484
    Points : 724
    Points
    724
    Par défaut
    Hello,

    Voici un exemple, a toi de positionner les index utiles.
    Le bloc PL/SQL est requis car colonne de type LOB...

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
     
     
    Create table APPOWNER.APP_ALL_CONS_COLUMNS as select * from ALL_CONS_COLUMNS;
    create synonym APPOWNER.ALL_CONS_COLUMNS for APPOWNER.APP_ALL_CONS_COLUMNS;
     
     
    Create table APPOWNER.APP_ALL_CONSTRAINTS
    (
    OWNER                      VARCHAR2(30),
    CONSTRAINT_NAME            VARCHAR2(30) NOT NULL,
    CONSTRAINT_TYPE            VARCHAR2(1),
    TABLE_NAME        	       VARCHAR2(30) NOT NULL,
    SEARCH_CONDITION           LONG,
    R_OWNER                    VARCHAR2(30),
    R_CONSTRAINT_NAME          VARCHAR2(30),
    DELETE_RULE                VARCHAR2(9),
    STATUS                     VARCHAR2(8),
    DEFERRABLE                 VARCHAR2(14),
    DEFERRED                   VARCHAR2(9),
    VALIDATED                  VARCHAR2(13),
    GENERATED                  VARCHAR2(14),
    BAD                        VARCHAR2(3),
    RELY                       VARCHAR2(4),
    LAST_CHANGE                DATE,
    INDEX_OWNER                VARCHAR2(30),
    INDEX_NAME                 VARCHAR2(30),
    INVALID                    VARCHAR2(7),
    VIEW_RELATED               VARCHAR2(14)
    );
     
     
    declare
    Cursor GetData is Select * from all_constraints;
    lRec all_constraints%rowtype;
     
    Begin
    OPEN   GetData;
    LOOP
         FETCH GetData INTO lRec;
         EXIT WHEN GetData%NOTFOUND;
     
         Insert into APPOWNER.APP_ALL_CONSTRAINTS
            values
           (lRec.OWNER            ,
    				lRec.CONSTRAINT_NAME  ,
    				lRec.CONSTRAINT_TYPE  ,
    				lRec.TABLE_NAME       ,
    				lRec.SEARCH_CONDITION ,
    				lRec.R_OWNER          ,
    				lRec.R_CONSTRAINT_NAME,
    				lRec.DELETE_RULE      ,
    				lRec.STATUS           ,
    				lRec.DEFERRABLE       ,
    				lRec.DEFERRED         ,
    				lRec.VALIDATED        ,
    				lRec.GENERATED        ,
    				lRec.BAD              ,
    				lRec.RELY             ,
    				lRec.LAST_CHANGE      ,
    				lRec.INDEX_OWNER      ,
    				lRec.INDEX_NAME      , 
    				lRec.INVALID          ,
    				lRec.VIEW_RELATED);
    End Loop;
    Close GetData;
    commit;
    End;
    /
     
    create synonym APPOWNER.all_constraints for APPOWNER.APP_ALL_CONSTRAINTS;
    Jko
    OCM 11g, RAC and Performance & Tuning Expert 11g
    RMAN Backup & Recovery, Data Guard and Grid Control

  7. #7
    Expert éminent
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 821
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Suisse

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

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 821
    Points : 6 443
    Points
    6 443
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Citation Envoyé par 13thFloor Voir le message
    ce sont celles qui consomment le plus de temps CPU et surtout réseau (beaucoup de SQL*Net message from client).
    'SQL*Net message from client' n'est pas une consommation de ressource réseau. C'est le processus serveur qui attend d'avoir quelque chose à faire (attente 'un appel du client) -> aucune consommation de ressource.

    Ca n'empêche pas d'essayer de comprendre, mais l'impact n'est peut être pas si important...

    Cordialement,
    Franck
    Franck Pachot - Developer Advocate Yugabyte 🚀 Base de Données distribuée, open source, compatible PostgreSQL
    🗣 twitter: @FranckPachot - 📝 blog: blog.pachot.net - 🎧 podcast en français : https://anchor.fm/franckpachot

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

    Informations professionnelles :
    Activité : DBA Oracle freelance

    Informations forums :
    Inscription : Janvier 2005
    Messages : 670
    Points : 945
    Points
    945
    Par défaut
    La solution de Jko est intéressante et me permet de réduire considérablement le temps cpu.
    Je vais continuer à investiguer.

    Ce qui est casse pied c'est que pour 5' de temps, la base ne travaille que 30" et l'application client poireaute 2 à 3', avec un beau sablier et un écran blanc en attendant que les données ne s'affichent.

Discussions similaires

  1. Jointure multiple ou multiple requête?
    Par Just dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/08/2008, 09h12
  2. [MooTools] Multiples requêtes Ajax et performances
    Par ALkyD dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 15/01/2008, 11h11
  3. Multiple requête dans 1 seul TQUERY
    Par AODRENN dans le forum Bases de données
    Réponses: 2
    Dernier message: 12/06/2007, 10h41
  4. un formulaire pour de multiples requêtes
    Par jsbach dans le forum Langage
    Réponses: 3
    Dernier message: 30/05/2007, 09h47
  5. multiples requêtes ou procédure stockée ?
    Par grinder59 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 23/02/2007, 15h53

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