scattered vs sequential

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.



