Begriffserklärung - Lambertz

Werbung
CL
ambertz
onsulting
Rainer Lambertz, Kreuzstraße 54, 41564 Kaarst,
[email protected]
Begriffserklärung
Buffer gets
zeigt an, wieviele Daten aus dem Buffer für die Bearbeitung des
Statemants eingelesen wurden, um das result set zu ermitteln.
Dieser Wert wird z.B. in SQL*Plus ausgewiesen, wenn
AUTOTRACE eingeschaltet ist. Eine geringe Anzahl Buffer Gets
zeigt, daß nur eine geringe Datenmenge für das Result Set erforderlich war.
Cardinalität
Errechnet sich aus:
Gesamte Anzahl Datensätze einer Tabelle
--------------------------------------------------------------------------------------
DISTINCT_KEYS
Also im besten Fall ergibt sich der Wert 1 und im schlechtesten fall
die Anzahl der Datensätze der Tabelle.
Chained rows
treten auf, wenn bei einem INSERT oder UPDATE der verfügbare
Speicher nicht ausreicht, um die veränderten Daten im gleichen
Block zu speichern. Die Blockgröße ist abhängig von der Definition
DB_BLOCK_SIZE in der initSID.ora Datei. CHAINED ROWS können
häufig vermieden werden, wenn der Wert PCTFREE einer Tabelle
vergrößert wird. Ist ein Datensatz jedoch größer als das gesamte
Block, entsteht immer ein CHAINED ROW.
Beispiel: DB_BLOCK_SIZE ist für die Datenbank mit 4096 (Byte)
eingestellt und für eine Tabelle wurde PCTUSED mit 40 und
PCTFREE mit 10 festgelegt. Somit stehen maximal ca.3686 Bytes
an Speicherplatz für einen Block zur Verfügung. Nun werden drei
Records mit jeweils 1200 Byte in einem Block gespeichert. Erfolgt
ein UPDATE am ersten Datensatz, der um 390 Byte verlängert wird,
________________________________________________________________________________________
Seite 1 von 6
CL
ambertz
onsulting
Rainer Lambertz, Kreuzstraße 54, 41564 Kaarst,
[email protected]
ist der PCTFREE ist mit 410 Bytes groß genug um diese Änderung
im gleichen Block einzutragen. Für das gleiche UPDATE an den beiden anderen Datensätzen reicht der reservierte Platz nicht mehr aus.
Zwei CHAINED ROWS sind entstanden. Wäre PCTFREE mit 30
(1229 Bytes) bestimmt worden, hätte ORACLE nicht drei, sondern
nur zwei Datensätze der Größe 1200 Bytes in dieses Block eingetragen und die Satzerweiterung von gesamt 780 Bytes in dem
PCTFREE aufnehmen können.
Nicht immer kann durch einen vergrößerten Wert PCTFREE ein
CHAINED ROW vermieden werden.
Beispiel: Unter den gleichen Bedigungen wie in der vorherign
Darstellung soll nun ein Datensatz mit der Gesamtlänge von
9870 Byte eingetragen werden. Auch wenn PCTFREE auf 0 gesetzt wäre, reicht der verfügbare Speicherplatz in einem Block
nicht aus den Datensatz zu speichern.
Cost
Diese Maßzahl ist ein theoretischer Wert. Jeder Zugriffsmethode ist
ein Wert zugeordnet. Der schnellste Zugriff ist der auf eine Zeile via
ROWID, wogegen der langsamste ein TABLE ACCESS FULL ist.
Auch ohne genaue Werte zu kennen gilt (theoretisch):
geringe Kosten -
guter Zugriffspfad
hohe Kosten
-
schlechter Zugriffspfad
An diesen Kosten orientiert sich auch der Oracle Optimizer für die
Bestimmung des Explain Plan.
Jedoch gibt es unzählige Beispiele, wo trotz sehr hoher Kosten
eine schnellere Abarbeitung in der Datenbank erfolgt. Also Vorsicht!!
Consistened gets
ist die Maßzahl für verarbeitete Datensätze. Hiezu zählen physikalische Zugriffe genau wie Zugriffe aus der SGA. CONSISTENT
GETS geben in jedem Fall eine Übersicht über den wirklichen
Verlauf der Verarbeitung; im Gegensatz zu COST. Es gilt:
________________________________________________________________________________________
Seite 2 von 6
CL
ambertz
onsulting
Rainer Lambertz, Kreuzstraße 54, 41564 Kaarst,
[email protected]
Db block gets
Geringe Anzahl
-
schnelle Bearbeitung
hohe Anzahl
-
Bearbeitung war aufwendig und zeitkritisch
zeigt die Anzahl Blöcke, die als CONSISTENT GETS in den
CURRENT Mode übertragen wurden.
Db block changes
beschreibt die Anzahl dirty Blocks, welche durch INSERT, DELETE
oder UPDATE in der SGA (DB_BUFFER) verändert wurden.
DB_BLOCK_SIZE
Ist die Blockgröße, in der Oracle seine Daten innerhalb eines Extents und im Speicher verwaltet. Die Blockgröße für Oracle sollte
mit der des Betriebsystems übereinstimmen, da sonst die Anzahl
I/O nicht synchron mit der Oracle Datenverarbeitung erfolgt. Es
entsteht ein Datenüberhang. Die Blockgröße kann nur festgelegt
werden zum Zeitpunkt für den die Datenbank erstellt wird!
DB_FILE_MULTIBLOCK_READ_COUNT
Beschreibt die Anzahl Datenblöcke (er ist in der initSID.ora eingetragen) die für einen einzigen Lesezugriff zusammenhängend
gelesen werden. Diese Angabe wirkt nur für das Lesen von Tabellen. Ausnahme stellt der Index Zugriff "FAST FULL SCAN" dar.
Somit werden für einen Tabellenzugriff immer mehrere Blöcke
gelesen, außer die Tabelle beinhaltet weniger Blöcke als durch
den Parameter DB_FILE_MULTIBLOCK_READ_COUNT beschrieben sind.
Für diesen Parameter gibt es keine allgemeingültigen Richtwert.
Aber wurde er zu gering gewählt, werden wenige Datenblöcke mit
einem Lesezugriff in den Memory gelesen und jede weitere Anforderung führt zu einem I/O und damit im schlechtesten Fall zu
Wartezeiten. Aber auch eine zu großzügige Definition des Parameters DB_FILE_MULTIBLOCK_READ_COUNT kann dazu führen, daß der verfügbare Memory nicht ausreicht die für einen I/O
________________________________________________________________________________________
Seite 3 von 6
CL
ambertz
onsulting
Rainer Lambertz, Kreuzstraße 54, 41564 Kaarst,
[email protected]
gelieferten Datenmengen aufzunehmen. Übermäßiges "flash out"
ist die Folge.
Eine indirekte Aussage, ob dieser Parameter richtig oder falsch
gewählt wurde, ist zu erkennen an dem Wert
DB_FILE_SEQUENTIAL_READ in der View V$?????. Er sagt
aus, wie lange und oft Oracle warten mußte, den angeforderten
Block aus dem Datafile zu erhalten. Mit einem größeren Wert für
DB_FILE_MULTIBLOCK_READ_COUNT werden also mehere
Blöcke direkt in einem Lesevorgang in den DB_BUFFER übertragen. Fordert Oracle in einem CONSISTENT GET einen Block an,
ist es dann wahrscheinlicher, daß der Block schon im Memory
vorhanden ist.
Der Wert für DB_FILE_SEQUENTIAL_READ sollte möglichst 0
sein. In jedem Fall sollte er kleiner werden, wenn
DB_FILE_MULTI_READ_COUNT vergrößert wird.
Distinct Keys
Wird immer nur für einen Index angegeben und zeigt die Anzahl
Datensätze an, die mit einem Index Key erreicht werden können. Der
Wert beträgt für einen primary Key die Anzahl Rows der zugehörigen
Tabelle. Im schlechtesten Fall liegt der Wert bei eins und würde aussagen, daß für einen Index Key alle Sätze der Tabelle angesprochen
würden. Gewöhnlich wird der Wert des DISTINCT KEY jedoch berechnet. Z.B. sind in der Tabelle ADR_ADRESSEN 245591
NAME_ID’s vor:
SQL > select count( distinct name_id ) from adr_adressen;
COUNT(DISTINCT NAME_ID)
---------------------245591
1 row selected.
________________________________________________________________________________________
Seite 4 von 6
CL
ambertz
onsulting
Rainer Lambertz, Kreuzstraße 54, 41564 Kaarst,
[email protected]
Diese Werte werden von Oracle ermittelt, wenn ein Index mit Statistikwerten durch ANALYZE ermittelt wurden. In der View
ALL_INDEXES existiert eine Spalte mit dem Namen
DISTINCT_KEYS, in dem der Wert gespeichert ist. Abweichungen
zwischen dem errechneten Wert und dem Wert, wie er in der View
ALL_INDEXES eingetragen ist, entstehen durch die Art, wie die Statistikwerte ermittelt wurden. Nur mit der ANALYZE Option
COMPUTE liegen keine Abweichungen vor.
Oracle diese Arbeit leisten zu lassen, hat u.a. den Vorteil, daß
DISTINCT_KEYS für Indizes ermittelt werden, die aus mehreren Attributen bestehen.
Extents
Die Anzahl der EXTENTs spiegelt sich in der HIGH WATER
MARK wieder und umgekehrt. Die Anzahl EXTENTs einer Tabelle
verringert sich nicht durch das Löschen von Datensätzen in der
Tabelle, weil Oracle sich an der High Water Mark orientiert. EXTENTs können nicht explizit gelöscht werden, sondern verfallen
durch ein TRUNC auf die entsprechende Tabelle. Die Anzahl der
EXTENTs ergibt sich aus dem größten Datenvolumen, was zu irgend einem Zeitpunkt den Füllstand der Tabelle ausgemacht hat
(HIGH WATER MARK).
Execute Count
Gesamtanzahl aller SQL Aufrufen (User und recursive calls).
High Water Mark
ist eine Maßzahl für den letzten Datenblock einer Tabelle im letzten
Extent in der Datenbank der zu irgend einem Zeitpunkt einmal Daten
beinhaltet hat. Diese Marke wird selbst durch Löschen aller Datensätzen nicht herunter gesetzt, sondern bleibt bis zu einem
TRUNCATE oder DROP der Tabelle bestehen. Bei einen FULL
TABLE ACCESS Zugriff auf Daten einer Tabelle werden alle Blöcke
bis zur HIGH WATER MARK eingelesen; auch wenn sich im Extremfall nicht ein Datensatz in der Tabelle befindet. Die HIGH
________________________________________________________________________________________
Seite 5 von 6
CL
ambertz
onsulting
Rainer Lambertz, Kreuzstraße 54, 41564 Kaarst,
[email protected]
WATER MARK erhöht sich auch, wenn Daten in die Tabelle eingefügt werden und per ROLLBACK wieder entfernt wurden.
Zu beachten ist auch, dass die HIGH WATER MARK extrem in
die Höhe getrieben wird, wenn mehrere Prozesse gleichzeitig in
dieselbe Tabelle schreiben.
Recursive calls
werden z.B. in SQL*Plus angezeigt, wenn vor der Ausführung des
Statements AUTOTRACE ON gesetzt wurde. Recursive calls geben eine Aussage darüber, wie oft Statements implizit ausgeführt
wurden (entweder von Oracle oder Statements aus einer Procedure). Bei diesen Statements handelt es sich DLL Kommandos,
die genau wie alle anderen Statements geparsed werden müssen. Ein praktisches Beispiel für einen recursive call ist die Einbindung eines weiteren Extents. Aber auch, wenn ein Cursor für
ein Statement von Oracle während der Verarbeitung aus dem
Cache entfernt und immer wieder zu Ausführung geladen werden
muß. Auch der Zugriff auf das Data Dictonary äußert sich als recursive call. Die Anzahl der recursive calls sollte nach Möglichkeit
0 sein, wenn keine Proceduren, Funktionen eingesetzt wurden.
Trigger für Datentabellen produzieren auch Recursive Calls.
User Calls
sind Anforderungen durch Oracle dem User Sources bereitzustellen.
User Calls beinhalten Parse und Execute Anforderungen.
________________________________________________________________________________________
Seite 6 von 6
Herunterladen