2008-11-17 15 views
21

Ich habe gerade mit einem Oracle DBA zu tun, der mir ein Profiling geschickt hat, das er gemacht hat. Einer der Begriffe in seinem Bericht ist "Buffer Gets", eine Idee, was das eigentlich bedeutet? Meine Schätzung ist Bytes aus einem Puffer abgerufen, aber ich habe keine Ahnung wirklich. Hier einige Beispiel-Ausgabe:In Oracle, was bedeutet "Buffer Gets" eigentlich?

Buffer Gets Executions Gets per Exec %Total Time (s) Time (s) Hash Value 
--------------- ------------ -------------- ------ -------- --------- ---------- 
    137,948,100  31,495  4,380.0 98.4 6980.57 6873.46 4212400674 
Module: JDBC Thin Client 
SELECT fieldOne, fieldTwo, fieldThree, fieldFour, fieldFive FROM TableExample 
WHERE fieldOne = 'example' 

Es wäre auch sehr nützlich sein, zu wissen, was ‚Ruft pro Exec‘ bedeutet, wie ich vermute, dass sie verwandt sind? Ich bin Programmierer, aber kein DBA.

Antwort

38

Oracle-Speicher ist in Blöcken einer bestimmten Größe (z. B. 8k) angeordnet. Tabellen und Indizes bestehen aus einer Reihe von Blöcken auf der Festplatte. Wenn diese Blöcke im Speicher sind, belegen sie einen Puffer.

Wenn Oracle einen Block benötigt, wird ein Puffer get. Zuerst überprüft es, ob es bereits den Block im Speicher hat. Wenn dies der Fall ist, wird die In-Memory-Version verwendet. Wenn der Block nicht im Speicher ist, liest er ihn von der Platte in den Speicher.

So stellt ein Puffer get die Anzahl dar, wie oft Oracle auf einen Block zugreifen musste. Die Lesevorgänge könnten entweder aus dem Speicher (den Puffern) erfüllt worden sein oder zu einem physischen IO geführt haben.

Da physisches IO so teuer ist (im Vergleich zu Speicher oder CPU), besteht ein Ansatz zur Optimierung darin, sich auf die Reduzierung von Puffer-Gets zu konzentrieren, von denen angenommen wird, dass sie die physische IO reduzieren.

+3

Ja - hinzufügen, dass auf, viele Abfrage Kostenmodelle fast ausschließlich auf Platte fokussieren I/O, die Puffer (nicht perfekt, aber so nah wie möglich) wird modelliert. Also, es soll eine einfache Kostenfunktion sein - "Wie teuer ist diese Abfrage, CPU zu ignorieren (was sowieso meistens vernachlässigbar ist)?" –

+0

Danke für die sehr gute Antwort, ist die einzige Frage, die mir in den Sinn ist, für die oben genannten Daten 137.948.100 ist eine hohe Anzahl von Puffer für eine ausgewählte Abfrage, die 31.495 mal aufgerufen wird? Kann diese Nummer Dinge wie Tabellen-Scan gegen Index usw. anzeigen? – rustyshelf

+1

Es scheint mir eine große Nummer zu sein, aber ich kann es nicht sagen, ohne zu wissen, wie viel Arbeit du machst.Bitten Sie Ihren DBA, einen "Explain Plan" für die Abfrage zu erstellen und zu überprüfen, ob er für Sie sinnvoll ist. –

11

Nur ein Teil Ihrer Frage zu antworten, dass WW nicht tat:

„Ruft pro Exec“ wird einfach die durch die Anzahl der Ausführungen der Anweisung geteilt wird. Sie könnten eine Aussage haben, die sehr effizient ist, aber viele Male ausgeführt wurde; Dies würde eine hohe Anzahl von Gesamtpuffer erhalten, aber eine niedrige bekommt pro Exec-Verhältnis.

-1

Ich möchte nur ein wenig Rücksicht nehmen.

Zuerst Dave Costa hat Recht, Buffer bekommt für Exec ist was wirklich zählt.

Mit diesen Daten können wir nicht sagen, wenn sie zu viel sind oder nicht, weil du nicht sagen, wie viele Datensätze Ihrer Anfrage Extrakt

Wenn Sie 4000 Datensätze zu extrahieren vielleicht sind 4380 ok Wenn Sie nur extrahieren 1 Rekord sie sind wahrscheinlich zu viel

Also, wie viele Datensätze?

Und mehr, haben Sie einen SQL-Plan zu sehen? Haben Sie einen Index zu fieldOne?

Der richtige Index ist das erste "Geheimnis" zum Optimieren einer Abfrage.

Just my 2 cents

+0

Dies sollte wahrscheinlich ein Kommentar und keine Antwort sein. –

Verwandte Themen