2010-03-06 1 views
2

J'utilise Oracle 9.2x pour effectuer des manipulations de données xmltype.Oracle xmltype extraire la fonction ne jamais libérer/récupérer la mémoire jusqu'à la fermeture de la session

La table est aussi simple que tabls (xml sys.xmltype), avec 10000 lignes stockées. Maintenant, j'utilise un curseur pour boucler chaque ligne, faisant alors comme

table.xml.extract('//.../text()','...').getStringVal(); 

Je remarque l'instance oracle et l'UGA/pga garder l'allocation de mémoire par l'exécution de xmltype.extract() fonction, jusqu'à ce que l'exécution de la mémoire disponible de la machine, même si le dbms_session.free_unused_user_memory() est exécuté par appel de extract().

Si la session est fermée, la mémoire utilisée par l'instance Oracle retourne immédiatement comme avant l'exécution.

Je me demande comment libérer/désallouer la mémoire allouée par la fonction d'extraction dans la même session?

Merci.

- John

Répondre

2

des variables PL/SQL et les objets instanciés sont quelques-uns dans la mémoire de la session, ce qui est la raison pour laquelle votre programmation frappe la PGA plutôt que l'âge gestationnel. Sans connaître le contexte, il nous est difficile de vous donner des conseils spécifiques. Le conseil général serait de considérer comment vous pourriez réduire l'empreinte des variables dans votre PL/SQL.

Par exemple, vous pouvez inclure le extract() dans l'instruction SQL plutôt que de le faire en PL/SQL; Récupérer seulement les données que vous voulez est toujours une chose efficace à faire. Une autre possibilité serait d'utiliser BULK COLLECT avec la clause LIMIT pour réduire la quantité de données que vous manipulez à un moment donné. Une troisième approche pourrait être de supprimer totalement le PL/SQL et d'utiliser simplement du SQL pur. Le SQL pur est beaucoup plus efficace que la commutation entre SQL et PL/SQL, car sets are better than RBAR. Mais comme je l'ai dit, parce que vous ne nous avez pas dit plus sur ce que vous essayez d'accomplir, nous ne pouvons pas dire si votre BOUCLE DE CURSEUR est appropriée.

Questions connexes