sql En Oracle, à quoi fait référence Buffer Gets?



(3)

Le stockage Oracle est organisé en blocs d'une taille donnée (par exemple 8k). Les tables et les index sont constitués d'une série de blocs sur le disque. Lorsque ces blocs sont en mémoire, ils occupent un tampon.

Quand Oracle requiert un bloc, il obtient un buffer . D'abord, il vérifie s'il a déjà le bloc dont il a besoin en mémoire. Si c'est le cas, la version en mémoire est utilisée. S'il n'a pas le bloc en mémoire alors il le lira du disque dans la mémoire.

Ainsi, un buffer get représente le nombre de fois qu'Oracle a dû accéder à un bloc. Les lectures auraient pu être satisfaites soit à partir de la mémoire (les tampons) ou ont abouti à une E / S physique.

Puisque l'E / S physique est si chère (par rapport à la mémoire ou à l'unité centrale), une approche de l'optimisation consiste à se concentrer sur la réduction du tampon, ce qui suppose que l'on va réduire les E / S physiques.

J'ai affaire à un DBA Oracle en ce moment, qui m'a envoyé un profilage qu'il a fait. L'un des termes de son rapport est «Buffer Gets», une idée de ce que cela signifie réellement? Ma conjecture est octets récupérés à partir d'un tampon, mais je n'ai aucune idée vraiment. Voici quelques exemples de sortie:

  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'

Il serait également pratique de savoir ce que signifie "Gets per Exec", car je suppose qu'ils sont liés? Je suis un programmeur, mais pas un DBA.


Answer #1

Je veux juste faire un peu de considération.

En premier Dave Costa a raison, Buffer obtient pour exec ce qui compte vraiment.

Avec ces données, nous ne pouvons pas dire si elles sont trop ou pas parce que vous ne dites pas combien d'enregistrements votre requête extrait

Si vous en extrayez 4000, peut-être que 4 380 sont ok Si vous n'en extrayez qu'un seul, ils sont probablement trop nombreux

Alors, combien d'enregistrements?

Et plus, avez-vous un plan sql à voir? Avez-vous un index sur fieldOne?

L'index de droite est le premier "secret" pour accorder une requête.

Juste mes 2 cents


Answer #2

Juste pour répondre à une partie de votre question que WW n'a pas:

"Gets per Exec" est simplement le nombre divisé par le nombre d'exécutions de l'instruction. Vous pourriez avoir une déclaration très efficace mais exécutée plusieurs fois; ceci aurait un nombre élevé de buffers totaux mais une valeur basse par rapport à exec.





oracle