Précédent   Forum du club des développeurs et IT Pro > Bases de données > Oracle > Administration
Administration Forum d'entraide sur l'administration du serveur Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 13/12/2012, 18h10   #1
13thFloor
Membre chevronné
 
Avatar de 13thFloor
 
Homme
DBA Oracle freelance
Inscription : janvier 2005
Messages : 579
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 46
Localisation : France

Informations professionnelles :
Activité : DBA Oracle freelance

Informations forums :
Inscription : janvier 2005
Messages : 579
Points : 789
Points : 789
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 :
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 ?
13thFloor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2012, 09h24   #2
mnitu
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 4 159
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
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 : 4 159
Points : 8 083
Points : 8 083
Je ne comprends pas bien votre question.
Citation:
D’où proviennent ces requêtes ?
Vous le dites par vous même
Citation:
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 03
Vieux 14/12/2012, 10h21   #3
alexisongagna
Membre du Club
 
Alexis ONGAGNA
Inscription : septembre 2010
Messages : 64
Détails du profil
Informations personnelles :
Nom : Alexis ONGAGNA
Âge : 32

Informations professionnelles :
Secteur : Finance

Informations forums :
Inscription : septembre 2010
Messages : 64
Points : 55
Points : 55
Salut,

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

Code :
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 ? ...
alexisongagna est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 16/12/2012, 23h26   #4
jkofr
Membre éprouvé
 
Avatar de jkofr
 
Homme Jacques Kostic
Senior Consultant DBA (Trivadis SA)
Inscription : octobre 2006
Messages : 369
Détails du profil
Informations personnelles :
Nom : Homme Jacques Kostic
Âge : 44
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2006
Messages : 369
Points : 482
Points : 482
Envoyer un message via MSN à jkofr
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
__________________
OCP 11g, RAC and Performance & Tuning Expert 11g
RMAN Backup & Recovery, Data Guard and Grid Control
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 09h35   #5
13thFloor
Membre chevronné
 
Avatar de 13thFloor
 
Homme
DBA Oracle freelance
Inscription : janvier 2005
Messages : 579
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 46
Localisation : France

Informations professionnelles :
Activité : DBA Oracle freelance

Informations forums :
Inscription : janvier 2005
Messages : 579
Points : 789
Points : 789
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
13thFloor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 10h16   #6
jkofr
Membre éprouvé
 
Avatar de jkofr
 
Homme Jacques Kostic
Senior Consultant DBA (Trivadis SA)
Inscription : octobre 2006
Messages : 369
Détails du profil
Informations personnelles :
Nom : Homme Jacques Kostic
Âge : 44
Localisation : Suisse

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

Informations forums :
Inscription : octobre 2006
Messages : 369
Points : 482
Points : 482
Envoyer un message via MSN à jkofr
Hello,

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

Code :
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
__________________
OCP 11g, RAC and Performance & Tuning Expert 11g
RMAN Backup & Recovery, Data Guard and Grid Control
jkofr est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/12/2012, 20h07   #7
pachot
Expert Confirmé
 
Avatar de pachot
 
Homme Franck Pachot
Consultant DBA en Suisse (Trivadis SA)
Inscription : novembre 2007
Messages : 1 055
Détails du profil
Informations personnelles :
Nom : Homme Franck Pachot
Âge : 42
Localisation : Suisse

Informations professionnelles :
Activité : Consultant DBA en Suisse (Trivadis SA)
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : novembre 2007
Messages : 1 055
Points : 3 018
Points : 3 018
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
__________________
Comment fournir un plan d'exécution avec les statistiques d'exécution: ici
pachot est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 19/12/2012, 08h50   #8
13thFloor
Membre chevronné
 
Avatar de 13thFloor
 
Homme
DBA Oracle freelance
Inscription : janvier 2005
Messages : 579
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 46
Localisation : France

Informations professionnelles :
Activité : DBA Oracle freelance

Informations forums :
Inscription : janvier 2005
Messages : 579
Points : 789
Points : 789
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.
13thFloor est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h35.


 
 
 
 
Partenaires

Hébergement Web