Bonjour,

J'ai une instance sous 9iR2 et je souhaite diminuer l'impact de jobs de purge lancé par des utilisateurs, pour cela j'ai fait un plan d'exécution qui ne semble pas fonctionner ...

Je souhaite reduire l'activité CPU d'un user nommé "PURGES" présent dans un consumer_group "BATCH" à 20% maximum. mais en lançant sous l'autorité de ce user un simple bloc pl/sql qui effectue une simple boucle infinie, je constate que la CPU Oracle de ma machine avoisine les 100%%..

Merci pour vos idées ? ...

-------------------------------------

Voici la création de mon PLAN 'test' :

-------------------------
-- Suppression du PLAN --
-------------------------

begin
dbms_resource_manager.clear_pending_area;
dbms_resource_manager.create_pending_area;
dbms_resource_manager.delete_plan_cascade(plan => 'PRODUCTION_PLAN');
dbms_resource_manager.validate_pending_area;
dbms_resource_manager.submit_pending_area;
end;
/


-----------------------
-- Creation du Plan ---
-----------------------

begin
dbms_resource_manager.clear_pending_area;
dbms_resource_manager.create_pending_area;

dbms_resource_manager.create_plan( plan => 'PRODUCTION_PLAN'
,comment => 'Plan de production standard OLTP et Batch'
);

dbms_resource_manager.create_consumer_group(
consumer_group => 'OLTP'
,comment => 'Les comptes de prod'
,cpu_mth => 'ROUND-ROBIN'
);

dbms_resource_manager.create_consumer_group(
consumer_group => 'BATCH'
,comment => 'Les comptes de batch'
,cpu_mth => 'ROUND-ROBIN'
);

/*******************************************************/
/** Définition des directives de consommation du plan **/
/*******************************************************/

dbms_resource_manager.create_plan_directive(
plan => 'PRODUCTION_PLAN'
,group_or_subplan => 'OLTP'
,comment => 'Défintion des valeurs CPU pour la prod'
,cpu_p1 => 70
);

dbms_resource_manager.create_plan_directive(
plan => 'PRODUCTION_PLAN'
,group_or_subplan => 'BATCH'
,comment => 'Défintion des valeurs CPU pour les batchs'
,cpu_p1 => 20
,cpu_p2 => 80
);

dbms_resource_manager.create_plan_directive(
plan => 'PRODUCTION_PLAN'
,group_or_subplan => 'OTHER_GROUPS'
,comment => 'Défintion des valeurs CPU pour les users'
,cpu_p1 => 10
,cpu_p2 => 20
,cpu_p3 => 100
);

dbms_resource_manager.validate_pending_area;
dbms_resource_manager.submit_pending_area;

end;
/


-------------------------------------------
-- Affectation des utilisateurs au plan ---
-------------------------------------------

begin
dbms_resource_manager.clear_pending_area;
dbms_resource_manager.create_pending_area;

dbms_resource_manager_privs.grant_switch_consumer_group(grantee_name=>'APPSERVER', consumer_group=>'OLTP' , grant_option=>false);
dbms_resource_manager_privs.grant_switch_consumer_group(grantee_name=>'PURGES' , consumer_group=>'BATCH', grant_option=>false);
dbms_resource_manager.set_initial_consumer_group(user=>'APPSERVER', consumer_group=>'OLTP');
dbms_resource_manager.set_initial_consumer_group(user=>'PURGES' , consumer_group=>'BATCH');

dbms_resource_manager.validate_pending_area;
dbms_resource_manager.submit_pending_area;
end;
/

------------------------------------------------
-- Mise en place de la politique d'execution ---
------------------------------------------------

ALTER SYSTEM SET RESOURCE_MANAGER_PLAN='PRODUCTION_PLAN';

-- FIN --

Et voici le bête programme de test

CREATE OR REPLACE PROCEDURE PURGES."TEST" IS
i_test BINARY_INTEGER;
BEGIN
i_test:=0;
LOOP
i_test:=i_test+1;
dbms_output.put_line('i_test==' || i_test);
END LOOP;
dbms_output.put_line('terminaison');
END;
/

Et à priori le plan est bien pris en compte :

SQL> show parameter resource_man
NAME TYPE VALUE
----------------------------------------------
resource_manager_plan string PRODUCTION_PLAN