Frage zur Performance

Ich verwende Oracle8i und folgendes Konstrukt:

while( anzahl 

Kann folgende Anpassung die Performance signifikant steigern?



    
    while( anzahl 
    
    Oder anders formuliert: ist die COMMIT-Operation im ersten Fall teurer?
    
    Danke und Gruß Markus

Hallo,

probiers doch einfach aus.

SET TIMING ON

oder besser ist sogar: mit der Stoppuhr.

SELECT sysdate from dual;

hier kommt deine prozedur rein

SELECT sysdate from dual;

Da Oracle asynchron auf die Platte schreibt, sollte das COMMIT nicht so furchtbar teuer sein. (Evtl. ein zusätzlicher Eintrag in die REDO-LOGS)

Gruß

Peter

Da Oracle asynchron auf die Platte schreibt, sollte das COMMIT
nicht so furchtbar teuer sein. (Evtl. ein zusätzlicher Eintrag
in die REDO-LOGS)

Ich analysiere aktuell eine Software, welche praktisch via auto-commit Datensätze importiert. Auf dem DB-Server entsteht dabei viel i/o-wait, wodurch der Import sehr langsam wird. Ein Kollege mach die vielen Commits dafür verantwortlich, da wesentlich mehr Plattenzugriffe stattfinden.

Nun steht die Frage im Raum, ob durch weniger Commits der Durchsatz wesentlich gesteigert werden kann oder ob die Platte im DB-Server einfach nur langsam ist.
Die Datenbank selbst ist eine Testdatenbank und mit 6 Inserts/Sekunde auch ohne Tuning schon sehr langsam.

Gruß Markus

Hallo,

die Oracle schreibt nicht nach jedem Commit in die Datenbank. Sondern die DB macht alles im Speicher. Schreiboperationen erfolgen in die REDO-LOGS. Eine Schreiboperation ist gültig, sobald diese in den Redo log eingetragen ist. Das Schreiben in die Datenbank macht ein anderer Prozeß nebenher.

Kurz: es könnte - bei einfachen Inserts - einen Faktor 2 ausmachen, da auch das Commit geschrieben werden muss.

Wenn Du die Performance verbessern willst:

  1. Analyze Table über die DB laufen lassen.
  2. Benutze Bindevariable (Wenn Du das nicht eh schon tust.) Dann muss nämlich das Statement nicht immer wieder kompiliert werden, sondern befindet sich in der SGA. (Die 9i macht das schon von alleine)

gruß

Peter

1 Like

Hi!

Kurz: es könnte - bei einfachen Inserts - einen Faktor 2
ausmachen, da auch das Commit geschrieben werden muss.

in die dirty buffers … bei der namensgebung hat sich oracle ja ziemlich angestrengt :smile:

Wenn Du die Performance verbessern willst:

  1. Analyze Table über die DB laufen lassen.
  2. Benutze Bindevariable (Wenn Du das nicht eh schon tust.)
    Dann muss nämlich das Statement nicht immer wieder kompiliert
    werden, sondern befindet sich in der SGA. (Die 9i macht das
    schon von alleine)

läuft die DB im Archive-Modus?
zusätzlich: befinden sich indizes und constraints auf der tabelle, die die performance kaputt machen?
treten außergewöhnliche locks auf?
wird die tabelle während des inserts benutzt?
wie schaut’s mit den freien bereichen der tablespaces aus? auch der system-tablespaces (undo und temp)

fragen, fragen, fragen

Grüße,
Tomh

Danke!

Kurz: es könnte - bei einfachen Inserts - einen Faktor 2
ausmachen, da auch das Commit geschrieben werden muss.

Danke, das wollte ich hören!

Gruß Markus

läuft die DB im Archive-Modus?
zusätzlich: befinden sich indizes und constraints auf der
tabelle, die die performance kaputt machen?
treten außergewöhnliche locks auf?
wird die tabelle während des inserts benutzt?
wie schaut’s mit den freien bereichen der tablespaces aus?
auch der system-tablespaces (undo und temp)

Danke für deinen Einsatz! Es sind definitiv die Logfiles.
Zum Testen steht mir nur eine Suboptimale DB zur Verfügung. Da hier bereits die Inserts langsam waren, zielte die Frage eher darauf, was auf einem produktiven System zu erwarten ist.
Im Allgemeinen bringt mich diese langsame DB weiter, wenn ich sie an die Grenzen bringen. Zur Lösung der konkreten Fragestellung war sie dieses mal aber nicht dienlich…

Gruß Markus