Frage

Vielleicht ist dies normal, aber in meiner Oracle 11g Datenbank Ich sehe Programmierer mit Oracle SQL Developer regelmäßig mehr als 100 MB kombiniert UGA und PGA-Speicher verbrauchen. Ich würde gerne wissen, ob das normal ist und was kann dagegen getan werden. Unsere Datenbank ist auf der 32-Bit-Version von Windows 2008, so dass die Speicherbeschränkungen eine zunehmende Besorgnis worden sind. Ich verwende die folgende Abfrage die Speichernutzung zu zeigen:

SELECT e.SID, e.username, e.status, b.PGA_MEMORY
FROM v$session e
LEFT JOIN 
   (select y.SID, y.value pga, 
      TO_CHAR(ROUND(y.value/1024/1024),99999999) || ' MB' PGA_MEMORY 
   from v$sesstat y, v$statname z 
   where y.STATISTIC# = z.STATISTIC# and NAME = 'session pga memory') b
ON e.sid=b.sid
WHERE (PGA)/1024/1024 > 20
ORDER BY 4 DESC;

Es scheint, dass die Ressourcennutzung jederzeit nach oben geht eine Tabelle in sqldeveloper geöffnet wird, sondern auch dann, wenn es geschlossen ist, der Speicher geht nicht weg. Das Problem ist noch schlimmer, wenn die Tabelle sortiert wird, während es offen war, als dass noch mehr Speicher zu verwenden scheint. Ich verstehe, wie diese Speicher verwenden würde, während es Sortieren und vielleicht sogar, während sie noch offen ist, aber auf den Einsatz Speicher, nachdem es geschlossen ist, scheint mir falsch. Kann jemand bestätigen das?

Update: Ich entdeckte, dass meine Zahlen waren weg wegen nicht zu verstehen, dass die die UGA in der PGA unter dedizierten Server-Modus gespeichert. Dies macht die Zahlen niedriger, als sie waren, aber das Problem bleibt, dass SQL Developer scheint übermäßige PGA zu verwenden.

War es hilfreich?

Lösung

Vielleicht SQL Developer schließt nicht die Cursor es geöffnet hatte. Also, wenn Sie eine Abfrage ausführen, die eine Million Zeilen und SQL Developer holt nur die ersten 20 Zeilen von dort sortiert, muss er den Cursor offen halten, sollten Sie nach unten scrollen und holen möchten.

So muss es einige der PGA-Speicher mit der Art des Cursors Bereich zugeordnet noch verbunden halten (es wird beibehalten Sortierbereich genannt), solange der Cursor geöffnet ist und EOF nicht erreicht (end-of-Abruf).

Wählen Sie eine Sitzung, und führen Sie:

select sql_id,operation_type,actual_mem_used,max_mem_used,tempseg_size
from v$sql_workarea_active
where sid = &SID_OF_INTEREST

Dies sollte zeigen, ob einige Cursor noch mit ihrem Speicher offen gehalten werden ...

Andere Tipps

Verwenden Sie automatische Speicherverwaltung? Wenn ja, würde ich nicht Sorgen über den PGA-Speicher verwendet.

Siehe docs:

Automatische Speicherverwaltung: http: / /download.oracle.com/docs/cd/B28359_01/server.111/b28310/memory003.htm#ADMIN11011

MEMORY_TARGET: http://download.oracle .com / docs / cd / B28359_01 / server.111 / b28320 / initparams133.htm

Gibt es einen Grund, warum Sie 32-Bit-Oracle verwenden? Die neueste Hardware unterstützt 64-Bit.

Oracle, vor allem mit AMM, wird jedes Bit der Speicher auf der Maschine, die Sie geben verwenden. Wenn es nicht einen Grund hat, um de-Speicher zuweisen es nicht so tun wird. Es ist das gleiche mit Stauraum: wenn Sie 20 GB von Benutzerdaten löschen, dass der Raum nicht an das Betriebssystem zurückgegeben wird. Oracle wird daran festhalten, wenn Sie explizit die Tabellen verdichten.

Ich glaube, ein einfacher Test Ihre Sorgen lindern soll. Wenn es 32 Bit ist, und jede SQL Developer-Sitzung wird mit 100 MB + RAM, dann würden Sie brauchen nur ein paar hundert Sitzungen öffnen Sie ein low-memory Problem zu verursachen ... wenn es wirklich ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top