# 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.
