Influence de la taille du package sur les performances ?
Bonjour,
Je rencontre depuis quelques jours des problèmes de performances aléatoire sur un projet.
Pour présenter de quoi il en retourne, je vous explique brievement ce qui se passe :
J'ai une base Oracle9i qu'on va appeler B1 et une base distante Oracle10g qu'on va appeler B2. J'ai créé un DBLink entre les 2 bases. La connection entre les 2 "reseaux" se fait via un VPN.
J'ai un package P1 dans la base B1 qui appel un Package P2 dans la base B2 via mon DBLink. (execute immediate 'P2.Mafonction@MONDB_LINK')
Dans 90% du temps, tout se passe tres bien et je constate des temps de réponse acceptable.
Dans 10% des cas, j'ai, au moment d'appeler la premiere fonction distante de P2 un retour de la fonction hyper tardif (de l'ordre de 40 secondes, voir parfois beaucoup beaucoup plus)
J'ai fais des tests dans tout les sens pour essayer de comprendre pourquoi parfois c'est lent (probleme de VPN, problème de locks, activité important de la base B1 ou B2 ...) mais rien n'explique mes problemes de lenteur qui arrivent de facon aleatoire.
J'ai constaté que le Package P2 est "gros" et j'ai decidé de le coupé en 2 pour voir si ca ne viendrait pas de la et bizarrement ca a l'air d'être mieux.
Donc j'aimerais savoir si il y a des limites de taille d'un package sur oracle ? Si oui lesquels ? Et si du coup mon probleme vient apriori de la et pas d'autre chose.
Si vous avez des idées elles sont les bienvenues.
D'avance merci.
Tenter de fixer le package sur la base 2 en mémoire
Bonjour,
Si on considère que la taille du package influe et que c'est son premier appel qui est long vous pouvez tenter de le "punaiser" en mémoire.
Je veux dire : Le grimper en mémoire au démarrage de l'instance et demander à Oracle de ne pas le décharger.
Cette approche est utilisée quand des programmes sont déchargés pour les raisons LRU et doivent être re-chargés avant exécution.
Il faut pour cela utiliser le package dbms_shared_pool qu'on invoque au démarrage de l'instance ou moyen d'un trigger on startup du genre :
Code:
1 2 3 4 5 6 7
|
Create Or Replace Trigger bdd_on_startup
After Startup On Database
-- 23/07/2003 - Mbo - Demande de chargement au démarrage de l'instance des objets listés
Begin
DBMS_SHARED_POOL.Keep ('mon_schéma.mon_package');
End; |
Evidemment il y a un peu de config :
- Vérifier la présence du package DBMS_SHARED_POOL sur l’instance
- Ce package est crée par le script ORACLE_HOME/rdbms/admin/dbmspool.sql
- Créer un synonyme public sur le package
Si on veut créer le trigger depuis un compte il faut lui attribuer connecté SYS des privilèges :
SELECT on v_$db_object_cache
EXECUTE on dbms_shared_pool (peut-être avec l'option grant. Essayer d'abord sans)
ADMINISTER DATABASE TRIGGER
Ensuite il faut vérifier le bon fonctionnement du trigger :
Lire la table sys.v_$db_object_cache après redémarrage de l’instance de base de données. Vérifier la valeur de PINS pour les objets "punaisés"
Vérifier le fichier d’alerte de l’instance après redémarrage à la recherche d’éventuelles erreurs provoquées par le déclencheur BDD_ON_STARTUP
Je ne sais pas ce que ça vaut en 10g mais en 9i ça marche bien (et le fichier dbmspool.sql est présent en 10g)
Pozzo