2008-11-17 38 views
21

Estoy lidiando con un DBA de Oracle en este momento, quien me ha enviado algunos perfiles que ha hecho. Uno de los términos en su informe es 'Buffer Gets', ¿alguna idea de lo que esto significa en realidad? Mi suposición es que los bytes se recuperaron de un búfer, pero realmente no tengo idea. Aquí está un ejemplo de salida:En Oracle, ¿a qué se refiere realmente 'Buffer Gets'?

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' 

También sería útil saber qué 'Obtiene por Exec' medios, ya que supongo que están relacionados? Soy un programador, pero no soy un DBA.

Respuesta

38

El almacenamiento de Oracle está organizado en bloques de un tamaño determinado (por ejemplo, 8k). Las tablas y los índices están formados por una serie de bloques en el disco. Cuando estos bloques están en memoria, ocupan un buffer.

Cuando Oracle requiere un bloque, hace que un buffer obtenga. Primero verifica si ya tiene el bloque que necesita en la memoria. Si es así, se usa la versión en memoria. Si no tiene el bloque en la memoria, lo leerá desde el disco en la memoria.

Así que un buffer get representa la cantidad de veces que Oracle tuvo que acceder a un bloque. Las lecturas podrían haberse satisfecho desde la memoria (los búferes) o haber resultado en un IO físico.

Como la IO física es tan costosa (en comparación con la memoria o la CPU) un enfoque para la optimización es concentrarse en la reducción de la memoria intermedia que se supone que fluirá para reducir la IO física.

+3

Sí - para añadir a eso, muchos modelos de costos de consultas se centran casi exclusivamente en el disco I/O, que búfer Obtiene es el modelado (no perfectamente, pero tan de cerca como pueda). Por lo tanto, debe ser una función de costo simple: "¿Qué tan cara es esta consulta, ignorando la CPU (que en su mayoría es insignificante)?" –

+0

Gracias por la muy buena respuesta, la única pregunta que queda en mi mente es, para los datos anteriores es 137,948,100 una gran cantidad de búfer obtiene para una consulta de selección que se llama 31,495 veces? ¿Puede este número indicar cosas como escaneo de tabla versus índice, etc.? – rustyshelf

+1

Me parece un número grande, pero no puedo decir sin saber cuánto trabajo está haciendo.Haga que su DBA haga un "plan de explicación" sobre la consulta y vea si tiene sentido para usted. –

11

Sólo para responder a una parte de su pregunta que no lo hizo WW:

"Obtiene por Exec" es simplemente el se divide por el número de ejecuciones de la declaración. Es posible que tenga una declaración que sea muy eficiente pero que se ejecute muchas veces; esto tendría un alto número de buffer total pero un bajo obtiene por ratio de exec.

-1

Quiero hacer un poco de consideración.

En primer lugar Dave Costa tiene razón, Buffer consigue para el ejecutivo es lo que realmente importa.

Con esos datos no podemos decir si son demasiado o no porque usted no dice cuántos registros extracto de su consulta

Si extrae registros 4000 puede que 4380 están bien Si extrae solamente 1 registro probablemente sean demasiado

Entonces, ¿cuántos registros?

Y más, ¿tiene un plan sql para ver? ¿Tiene un índice en fieldOne?

El índice correcto es el primer "secreto" para ajustar una consulta.

Sólo mi 2 centavos

+0

Esto probablemente debería ser un comentario y no una respuesta. –

Cuestiones relacionadas