Skip to main content

Command Palette

Search for a command to run...

scattered vs sequential

Updated
3 min readView as Markdown
scattered vs sequential
C
Hola mundo! Soy Carmen. En mi camino como DBA, con particular interés en Oracle, nace este blog para documentar los pequeños aprendizajes y compartirlos con todos los que por una razón u otra han acabado aqui. No busco inventar o descubrir nada nuevo, pero si algo he aprendido en estos años es que a veces la clave no está en qué comunicas, sino el cómo, asique te animo a leer algún post mientras disfrutas de un buen café. Actualmente cuento con 3 años de experiencia, con formación en administración de bases de datos y en desarrollo de SQL en Oracle principalmente. Mis próximos pasos? Una gran incógnita por ahora, entre posts y cafés los descubriremos juntos.

Hola hola, hace mucho de la última vez que publiqué un post, eso no significa que haya estado parada, a verces todos necesitamos un tiempo de reflexión para volver con más ganas y más preguntas que respuestas.

En mi nuevo camino, aprendiendo a leer e interpretar métricas de informes Stackpack y AWR (quizás haga algún post sobre esto más adelante) , hoy les traigo un poco de teoría, y como estos son apuntes tanto para vosotros, curiosos lectores, como para mi, aqui os dejo un poco de información que quizás os sea útil en algún momento.

La pregunta del verano:

✨ cuál es la diferencia entre db_scattered_read, db_file_sequential_read y direct_path_read ? ✨

La respuesta más corta podría ser:

  • db_scattered_read y db_file_sequential_read son eventos de espera generados por lecturas de tablas mediante "full table scan" y lecturas a tablas a partir de un índice, que devuelven un gran número de filas, respectivamente.

  • direct_path_read es una lectura de bloques desde disco a la PGA (área de memoria del proceso) sin cargar y almacenar estos bloques en el buffer cahe de la SGA.

Ahora bien, vamos a desarrollar esto un poco más, para los más curiosos y hambrientos de conocimiento.

db_scattered_read* y *db_file_sequential_read

Lo primero a tener en cuenta es que "scattered" y "sequencial" NO hace referencia a cómo se lee fisicamente el db_file, si no, a qué se hace con esas lecturas físicas

  • Sequencial es una lectura secuencial de bloques independientes. Hasta que no recupera un bloque, no va al siguiente secuencialmente (normalmente implica acceso por índice). Un valor alto de db_sequential_read puede indicar:

    • demasiados excesos fila a fila

    • nested loops excesivos

    • índices malos

    • sql ejecutándose millones de veces

    • I/O lento

  • Scattered es un lectura de multibloque. Esto significa que en una misma operación se leen varios bloques contiguos y los almacena de manera dispersa en el buffer cache, en bloques no contiguos (normalmente indica un Full Table Scan). Un alto valor en db_scattered_read puede indicar:

    • Full Table Scans sobe tablas muy grandes

    • Falta de índices

    • Planes de ejecución ineficientes

direct_path_read

Como su nombre indica, son lecturas de bloques directamente desde el disco a la PGA del proceso, sin pasar por la Buffer Cache del SGA.

Es común encontrarlo en:

  • Grandes Full Tables Scans

  • Operaciones paralelas

  • Procesos de RMAN (backups y restores)

  • Hash Joins que procesan grandes volúmenes de datos

Oracle utiliza el direct_path_read cuando estima que cargar los bloques en la buffer cache tendría poco beneficio final, ya que una consulta que lea millones de bloques una única vez desplazaría datos en la cache que sí podrían reutilizar otros procesos.