Ich bin auf der Suche nach einer Möglichkeit in einer Oracle-Datenbank
die Transaktionen pro Minute (oder andere Zeiteinheit) zu ermitteln. Ich
habe bisher in den V$-Views und im Data-Dictionary gesucht, aber nichts
entsprechendes gefunden. Auch der (zugegebenermassen veraltete)
Enterprise-Manager, Version 1.2 hat mir diesbezüglich nicht weitergeholfen.
Hat jemand eine Idee? Oder vielleicht ein kleines Tool?
Andreas Franz
-----------------------------
Lineas Verkehrstechnik
Schloßstr. 8
38100 Braunschweig
mailto: Andrea...@lvt.lineas.de
Moin Andreas,
wenn es um die Frage geht, wieviele Inserts Deine Datenbank in Tabelle xyz
pro Sekunde schafft, hilft Dir vielleicht (ab Oracle 8)
dbms_utility.get_time.
Also (ungetestet) ungefähr so
declare
a number;
i number:=1;
max number:=1000;
begin
a:=dbms_utility.get_time;
loop
insert into xyz values (...);
i:=i+1;
exit when i = max;
end loop;
a:=dbms_utility.get_time-a;
dbms_output.put_line('Meine Datenbank schaft 1000 Inserts in
'||to_char(a)||' Hundertstel-Sekunden');
-- nicht die DB zumüllen
rollback;
end;
Gruß
Ulrik
Andreas Franz writes:
> Hallo zusammen!
> Ich bin auf der Suche nach einer Möglichkeit in einer Oracle-Datenbank
> die Transaktionen pro Minute (oder andere Zeiteinheit) zu ermitteln. Ich
> habe bisher in den V$-Views und im Data-Dictionary gesucht, aber nichts
> entsprechendes gefunden. Auch der (zugegebenermassen veraltete)
> Enterprise-Manager, Version 1.2 hat mir diesbezüglich nicht weitergeholfen.
> Hat jemand eine Idee? Oder vielleicht ein kleines Tool?
Die Frage höre ich von unseren Chefs auch häufiger :-)
Ich habe dazu mal folgende Überlegung angestellt:
Für jede Transaktion wird im Redo-Log die jeweilige System-Change-Number
(SCN) protokolliert, damit ein transaktionsgenaues Recovery möglich ist.
In V$LOG_HISTORY wird für nun eine Anzahl Redo-Logs die erste SCN in
diesem Log sowie der Zeitstempel des ersten Zugriffes abgelegt. Damit
läßt sich das Mittel der vergebenen SCNs über den Zeitraum bestimmen, in
dem jeweils ein Redo-Log aktiv war:
SELECT h1.first_time,
(h2.first_time - h1.first_time) * 1440 "MINUTES",
(h2.first_change# - h1.first_change#) "CHANGES",
(h2.first_change# - h1.first_change#) /
((h2.first_time - h1.first_time) * 1440) "TRANS/MIN"
FROM v$log_history h1,
v$log_history h2
WHERE h1.sequence# = h2.sequence# - 1;
Dies sollte in etwas die Anzahl der Transaktionen pro Zeiteinheit
ergeben. Die Zahl dürfte etwas über der Transaktionszahl aus der
Applikation liegen, da hier IMHO auch interne Oracle-Transaktionen
(z.B. Space-Management) mitgezählt werden.
Wie aussagekräftig die Zahl ist, hängt jetzt noch von der Anzahl der
Log-Switches ab, da bei wechselnder Belastung der DB ein Mittelwert über
24h sicher anders interpretiert werden sollte, als das Mittel über
10min.
Die sicherste Lösung dürfte allerdings immer noch das Mitzählen des
COMMIT aus der Applikation sein.
--
Stefan
Ich habe vergessen zu erwähnen, dass ich im laufenden Betrieb
die durchschnittliche Transaktionslast aller Anwender auf allen
Tabellen suche. Trotzdem vielen Dank!
Gruß,
Andreas
Hey, das schaut gut aus - geniale Idee!
Ich habe das gleich mal ausprobiert (Unter Oracle 7 heissen die
Attribute etwas anders, funktioniert aber genauso gut) und es liefert
recht brauchbare Ergebnisse.
> Dies sollte in etwas die Anzahl der Transaktionen pro Zeiteinheit
> ergeben. Die Zahl dürfte etwas über der Transaktionszahl aus der
> Applikation liegen, da hier IMHO auch interne Oracle-Transaktionen
> (z.B. Space-Management) mitgezählt werden.
Weisst Du, ob die interne Kommuniktaion bei Parallel-Server auch
darunter fällt? Wir haben einen OPS mit zwei Instanzen im Einsatz.
> Die sicherste Lösung dürfte allerdings immer noch das Mitzählen des
> COMMIT aus der Applikation sein.
Da stimme ich Dir voll und ganz zu, aber die Möglichkeit habe ich
leider nicht. Soll allerdings auch nur ein ungefährer Anhaltspunkt sein.
Gruß,
Andreas
select (a.value+b.value) "Num of Transaction"
from v$sysstat a, v$sysstat b
where a.statistic# = 4 and b.statistic#=5 ;
The above query returns total number of transaction (committed+rollbacked)
from the start of the instance.
If you want for a period, create a temp table and insert those values with
time stamp and compare them later.
Klaus
Andreas Franz <Andrea...@lvt.lineas.de> schrieb in im Newsbeitrag:
9c12in$2td$1...@orbit.lineas.de...
Andreas Franz writes:
>> Dies sollte in etwas die Anzahl der Transaktionen pro Zeiteinheit
>> ergeben. Die Zahl dürfte etwas über der Transaktionszahl aus der
>> Applikation liegen, da hier IMHO auch interne Oracle-Transaktionen
>> (z.B. Space-Management) mitgezählt werden.
> Weisst Du, ob die interne Kommuniktaion bei Parallel-Server auch
> darunter fällt? Wir haben einen OPS mit zwei Instanzen im Einsatz.
Bei OPS enstehen IMHO keine zusätzlichen Transaktionen durch die
Synchronisation. Die geschieht nur über Latches und Enqueues, die
unabhängig von Transaktionen arbeiten.
Die SCN ist allerdings eine Eigenschaft der Datenbank und nicht der
Instanz, so daß Du bei OPS auf zwei Instanzen trotzdem nur eine SCN
hast.
In V$LOG_HISTORY siehst Du auch die Redo-Logs beider Systeme, so
daß Du dann noch zusätzlich über die thread#-Spalte einschränken mußt,
damit Du nicht die Redo-Logs von verschiedenen Instanzen mit
unterschiedlichen Zeitstempeln vergleichst.
--
Stefan