web-dev-qa-db-fra.com

Différence entre l'accès à la table par index rowid BATCHED et l'accès à la table par index rowid

J'utilise EXPLAIN PLAN dans la base de données Oracle sur une simple instruction SELECT juste pour découvrir comment cela fonctionne. Dans une sortie d'EXPLAIN PLAN, il est mentionné table access by index rowid et dans l'autre il y a table access by index rowid BATCHED. Quelle est la différence entre eux?

10
T.Poe

La documentation ne contient qu'une seule phrase sur ce sujet:
https://docs.Oracle.com/database/121/TGSQL/tgsql_optop.htm#GUID-4180BA97-3E2C-41F9-B282-4FB3FF9532CB

L'accès BATCHED montré à l'étape 1 signifie que la base de données récupère quelques identifiants de ligne de l'index, puis tente d'accéder aux lignes dans l'ordre des blocs pour améliorer la clustering et réduire le nombre de fois que la base de données doit accéder à un bloc.

Considérons un exemple ci-dessous de l'index (simplifié)

+-------------+------------------+
| index value | block nbr-rowid  |
+-------------+------------------+
|      1      |   015-000123     |
|      2      |   034-000527     |
|      3      |   088-000285     |
|      4      |   015-000889     |
|      5      |   088-000632     |
........
........

Dans la méthode "normale" (non groupée), Oracle récupère les lignes dans l'ordre déterminé par l'index:

  1. récupère le bloc 15, puis récupère la ligne 015-000123 de ce bloc
  2. récupère le bloc 34, puis récupère la ligne 034-000527 de ce bloc
  3. récupère le bloc 88, puis récupère la ligne 088-000285 de ce bloc
  4. récupère le bloc 15 (à nouveau) , puis récupère la ligne 015-000889 de ce bloc
  5. récupère le bloc 88 (à nouveau) , puis récupère la ligne 088-000632 de ce bloc

Dans la méthode par lots, Oracle récupère quelques entrées de l'index, puis les trie d'abord par le nombre de blocs, puis traite les entrées dans l'ordre déterminé par le nombre de blocs:

  1. récupère le bloc 15, puis récupère les lignes 015-000123 et 015-000889 de ce bloc
  2. récupère le bloc 34, puis récupère la ligne 034-000527 de ce bloc
  3. récupère le bloc 88, puis récupère les lignes 088-000285 et 088-000632 de ce bloc

Comme vous le voyez dans cet exemple, les blocs n'ont été récupérés que 3 fois au lieu de 5, donc un certain nombre de lectures de blocs à partir du disque a été réduit - certains blocs n'ont été lus qu'une seule fois au lieu de deux (ou plus) fois.

13
krokodilko