Optimización de Consultas

Documentos relacionados
Apunte de Procesamiento y Optimización de Consultas

Bases de Datos 2. Teórico

Procesamiento y Optimización de Consultas

CC42A: Bases de Datos Auxiliar: Optimizacion Consultas SQL

Procesamiento y Optimización de Consultas

Introducción al Álgebra Relacional

Bases de Datos Presentación de la Asignatura

SQL. Álgebra Relacional Selección y proyección Operaciones sobre conjuntos: unión, intersección, diferencia, producto Reunión natural

Jerarquía de Almacenamiento

TEMARIO. - Programa de teoría

OPTIMIZATION OF RELATIONAL JOIN ALGORITHMS FOR DATABASE TECHNOLOGIES OPTIMIZACIÓN DE ALGORITMOS DE JOIN RELACIONAL PARA TECNOLOGÍAS DE BASES DE DATOS

Contenido Sistemas de Información Gerencial

Sistemas de Gestión de Bases de Datos

Adquisición y Procesamiento de la Información

Catedra de Base de Datos

2. Programa de Estudio: (Técnico, Licenciatura(s)): Licenciado en Informática 3. Vigencia del plan:

Sistemas de Información II Tema 8. Estructuras de datos en memoria secundaria

UNIDAD 3 ASPECTOS ASOCIADOS CON BASES DE DATOS. Diseno Físico de Bases de Datos Objetivo. 2.2 Visión General del Procesamiento de Consultas

Diseño Conceptual de Bases de Datos. Un Enfoque de Entidades - Interrelaciones

Introducción a las Bases de Datos

8. Procesamiento y optimización de consultas

OPTIMIZACION DE CONSULTAS A BASES DE DATOS RELACIONALES

12. Procesamiento y Optimización de Consultas

Arquitectura de un data warehouse Funcionamiento detallado de un data warehouse

Organización de PostgreSQL. Manejo de Usuarios. Herramientas para Desarrollo

Almacenamiento y Recuperación de la Información

ESCUELA: UNIVERSIDAD DEL ISTMO

Ingeniería de Programa(s) Educativo(s): Software. Clave de la materia: IS201. UNIVERSIDAD AUTÓNOMA DE CHIHUAHUA Clave: 08MSU0017H

Catedra de Base de Datos

EXAMEN DE ESTRUCTURAS DE LA INFORMACIÓN (Junio de 2008)

Organización física de las bases de datos T

Programa de Asignatura Base de datos

INSTITUTO POLITÉCNICO NACIONAL

MICRODISEÑO CURRICULAR Ingeniería de Sistemas

ASIGNATURA: BASE DE DATOS I

Modelado de datos. Bibliografía. Representación de la información Modelos de datos Modelado semántico

UNIVERSIDAD CATÓLICA DEL NORTE PROGRAMA DE ESTUDIOS IDENTIFICACIÓN DE LA ASIGNATURA. Nombre: Estructuras de Datos y Archivos

Introducción a Evaluación y Optimización de Consultas

Ingeniero Técnico en Informática de Sistemas &DUiFWHU Troncal

Descripciones de los niveles de logro modificados (ALD, siglas en inglés) de la prueba de evaluación MCA en matemáticas Grados 5 a 8

División Académica de Informática y Sistemas

Estructura de los dispositivos de E/S.

Sistemas de archivos

Calculo Relacional de Tuplas. Lic. Andrea Manna

Tema 10. Indexación y asociación

CICLO ESCOLAR JULIO DICIEMBRE

id_trabajador nombre tarifa_hr tipo_de_oficio id_supv 1235 F. Aguilera 12,50 Electricista A. Calvo 13,75 Fontanero N.

BASES DE DATOS DSIC. Curso

Procesamiento de Consultas. Carlos A. Olarte BDII

Gestión de archivos. Gestión de archivos

Oracle Database 11g: Taller de Ajustes (Español)

TEMA I- Diseño Físico 1

Asignaturas, profesores, alumnos. Profesores, grupos, asignaturas, aulas

EJERCICIOS RESUELTOS DE ECUACIÓN DE LA RECTA. 1. Encuentre la pendiente de la recta que pasa por los puntos A 4,3

Gestión de Transacciones: Concurrencia y Recuperación

Algebra Relacional. Gestión y Modelación de Datos

Bases de Datos SQL 1 SQL. Jorge Pérez R. Universidad de Talca, II Semestre 2006

UNIVERSIDAD DE SAN CARLOS DE GUATEMALA FACULTAD DE INGENIERIA ESCUELA DE CIENCIAS Y SISTEMAS PROGRAMA DEL CURSO ESTRUCTURA DE DATOS

UNIDAD EDUCATIVA COLEGIO SAN GABRIEL PLAN DE MEJORA Y REFUERZO ACADÉMICO

TÉCNICO SUPERIOR UNIVERSITARIO EN TECNOLOGÍAS DE LA INFORMACIÓN Y COMUNICACIÓN

UNIVERSIDAD NACIONAL DE RÍO CUARTO FACULTAD DE CIENCIAS EXACTAS, FÍSICO-QUÍMICAS Y NATURALES DEPARTAMENTO DE COMPUTACIÓN

BASES DE DATOS - SQL. Javier Enciso

Capítulo 12: Indexación y asociación

Complejidad computacional. Algoritmos y Estructuras de Datos I. Complejidad computacional. Notación O grande

GUÍA DOCENTE DE PROGRAMACIÓN, LINUX Y BASES DE DATOS

cilred.com GESTIÓN DE TRANSACCIONES

REPRESENTACIÓN INTERNA DE FICHEROS

Tema 4: Programación lineal

UNIVERSIDAD NACIONAL ABIERTA VICERRECTORADO ACADEMICO SUBPROGRAMA DISEÑO ACADÉMICO AREA INGENIERÍA CARRERA INGENIERÍA DE SISTEMAS PLAN DE CURSO

Recupero de Información a través de operaciones con conjuntos

TEORIA DE BASES DE DATOS. M. Sc. Cristina Bender Lic. Diana Gázquez

Transcripción:

Optimización de Consultas Ejercicios simples Base de Datos, DC-FCEyN-UBA Rosana Matuk 13 de octubre de 2016 Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 1 / 32

Esquema General 1 Introducción 2 Ejercicios simples de Optimización Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 2 / 32

Optimización de Consultas Objetivo Minimizar el tiempo de resolución de la consulta. Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 3 / 32

Algunos tiempos de latencia 1 2 1 Bertrand Meyer, Computing: Art, Magic, Science 2 https://gist.github.com/jboner/2841832 Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 4 / 32

Función de costo a minimizar Debido al gran tiempo de latencia del acceso al disco, en nuestro modelo simplificado, como unidad de costo utilizaremos los accesos a disco (tanto lecturas como escrituras). Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 5 / 32

Estructuras de datos que nos ayudarán a optimizar: ordenar e indexar Archivo sin orden (Heap) Indice Hash Indice Arbol B+ (unclustered) Archivo ordenado Indice Arbol B+ (clustered) Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 6 / 32

Ejemplo de Indice Arbol B + unclustered Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 7 / 32

Ejemplo de Indice Arbol B + clustered Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 8 / 32

Ejemplo Indice Arbol B + clustered, campo compuesto Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 9 / 32

Ejemplo de Indice Hash Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 10 / 32

Resumen Costos de Acceso (del apunte) Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 11 / 32

Cómo resolver un ejercicio de optimización? Pasos: 1 Entender la consulta 2 Pasar de SQL a Algebra Relacional 3 Armar árbol canónico 4 Aplicar heurísticas algebraicas 5 Armar plan de ejecución estimando costos 6 Calcular costos Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 12 / 32

Ejercicios simples de Optimización Idea de los ejercicios Calcular el costo de consultas pequeñas y simples, con un mismo esquema, cambiando de entorno para ver cómo influyen en los accesos a disco. Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 13 / 32

Datos Esquema a utilizar Medico(mId, nombre, especialidad, fechaingreso) Datos tamaño de bloque: 4096 bytes longitud de cada campo: 128 bytes cantidad de tuplas: 1000 Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 14 / 32

Algunos cálculos: longitud tupla M: L M = 128 bytes 4 (registros) = 512 bytes factor de bloqueo de M: FB M = tam_bloque/l M = 4096bytes/512bytes = 8tuplas/bloque cantidad de tuplas: T M = 1000tuplas cantidad de bloques: B M = T M /FB M + 1 = 1000tuplas/8tuplas/bloque + 1 = 126bloques 3 3 Sumamos un bloque adicional por si la relación M comenzase en un bloque semi-ocupado Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 15 / 32

Escenario 1: selección por rango usando HeapFile SELECT * FROM Médico M WHERE "1/1/90" <= fechaingreso AND fechaingreso <= "1/1/91" En álgebra relacional: π (σ 1/1/90 fechaingreso 1/1/91 (M)) Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 16 / 32

Escenario 1: selección por rango usando HeapFile SELECT * FROM Médico M WHERE "1/1/90" <= fechaingreso AND fechaingreso <= "1/1/91" En álgebra relacional: π (σ 1/1/90 fechaingreso 1/1/91 (M)) Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 16 / 32

Escenario 1: selección por rango usando HeapFile π (σ 1/1/90 fechaingreso 1/1/91 (M)) Árbol canónico con su plan de ejecución: Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 17 / 32

Escenario 1: selección por rango usando HeapFile La relación M está organizada internamente como un HeapFile. Por lo tanto sus registros están desordenados. Entonces para ver el costo de una selección por rango hay que recorrer el archivo completo linealmente (file scan). Costo de búsqueda: B M = 126 bloques. Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 18 / 32

Escenario 1: selección por rango usando HeapFile La relación M está organizada internamente como un HeapFile. Por lo tanto sus registros están desordenados. Entonces para ver el costo de una selección por rango hay que recorrer el archivo completo linealmente (file scan). Costo de búsqueda: B M = 126 bloques. Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 18 / 32

Escenario 1: selección por rango usando HeapFile La relación M está organizada internamente como un HeapFile. Por lo tanto sus registros están desordenados. Entonces para ver el costo de una selección por rango hay que recorrer el archivo completo linealmente (file scan). Costo de búsqueda: B M = 126 bloques. Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 18 / 32

Escenario 1: selección por rango usando HeapFile La relación M está organizada internamente como un HeapFile. Por lo tanto sus registros están desordenados. Entonces para ver el costo de una selección por rango hay que recorrer el archivo completo linealmente (file scan). Costo de búsqueda: B M = 126 bloques. Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 18 / 32

Escenario 2: Selección por rango usando índice árbol B + clustered Datos: Misma consulta. Costo de acceso al índice de 3 bloques. Indice sobre el atributo fechaingreso. Asumimos que entre el 1/1/90 y el 1/1/91 ingresaron 200 médicos. Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 19 / 32

Escenario 2: Selección por rango usando índice árbol B + clustered Datos: Misma consulta. Costo de acceso al índice de 3 bloques. Indice sobre el atributo fechaingreso. Asumimos que entre el 1/1/90 y el 1/1/91 ingresaron 200 médicos. Como tenemos un índice que coincide con la clave de búsqueda cambia el plan de ejecución: Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 20 / 32

Escenario 2: Selección por rango usando índice árbol B + clustered Costos? Recordemos que... Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 21 / 32

Escenario 2: Selección por rango usando índice árbol B + clustered Pasos a seguir para calcular el costo: Usamos el índice clustered sobre fechaingreso. Recorremos el índice en busca del primer valor que cumpla con el criterio de selección, bajando niveles en el árbol hasta llegar a la hoja donde se encuentra el puntero al primer bloque de datos (costo: 3 bloques). Leemos en orden (los datos están ordenados físicamente de acuerdo a fechaingreso) (costo: T /FB M + 1 = 200 tuplas/8 tuplas/bloque + 1 = 26 bloques. Costo total: 29 bloques Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 22 / 32

Escenario 2: Selección por rango usando índice árbol B + clustered Pasos a seguir para calcular el costo: Usamos el índice clustered sobre fechaingreso. Recorremos el índice en busca del primer valor que cumpla con el criterio de selección, bajando niveles en el árbol hasta llegar a la hoja donde se encuentra el puntero al primer bloque de datos (costo: 3 bloques). Leemos en orden (los datos están ordenados físicamente de acuerdo a fechaingreso) (costo: T /FB M + 1 = 200 tuplas/8 tuplas/bloque + 1 = 26 bloques. Costo total: 29 bloques Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 22 / 32

Escenario 2: Selección por rango usando índice árbol B + clustered Pasos a seguir para calcular el costo: Usamos el índice clustered sobre fechaingreso. Recorremos el índice en busca del primer valor que cumpla con el criterio de selección, bajando niveles en el árbol hasta llegar a la hoja donde se encuentra el puntero al primer bloque de datos (costo: 3 bloques). Leemos en orden (los datos están ordenados físicamente de acuerdo a fechaingreso) (costo: T /FB M + 1 = 200 tuplas/8 tuplas/bloque + 1 = 26 bloques. Costo total: 29 bloques Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 22 / 32

Escenario 2: Selección por rango usando índice árbol B + clustered Pasos a seguir para calcular el costo: Usamos el índice clustered sobre fechaingreso. Recorremos el índice en busca del primer valor que cumpla con el criterio de selección, bajando niveles en el árbol hasta llegar a la hoja donde se encuentra el puntero al primer bloque de datos (costo: 3 bloques). Leemos en orden (los datos están ordenados físicamente de acuerdo a fechaingreso) (costo: T /FB M + 1 = 200 tuplas/8 tuplas/bloque + 1 = 26 bloques. Costo total: 29 bloques Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 22 / 32

Escenario 2: Selección por rango usando índice árbol B + clustered Pasos a seguir para calcular el costo: Usamos el índice clustered sobre fechaingreso. Recorremos el índice en busca del primer valor que cumpla con el criterio de selección, bajando niveles en el árbol hasta llegar a la hoja donde se encuentra el puntero al primer bloque de datos (costo: 3 bloques). Leemos en orden (los datos están ordenados físicamente de acuerdo a fechaingreso) (costo: T /FB M + 1 = 200 tuplas/8 tuplas/bloque + 1 = 26 bloques. Costo total: 29 bloques Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 22 / 32

Escenario 3: selección por igualdad usando HashTable SELECT * FROM Médico M WHERE especialidad = "traumatología" Datos del ejercicio: índice HashTable sobre el atributo especialidad, el MBxB i = cantidad máxima de bloques que ocupa un bucket del índice i (basado en hashing) es 4 asumimos que hay 100 traumatólogos Pasamos la consulta a álgebra relacional: π (σ especialidad= traumatologia (M)) Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 23 / 32

Escenario 3: selección por igualdad usando HashTable SELECT * FROM Médico M WHERE especialidad = "traumatología" Datos del ejercicio: índice HashTable sobre el atributo especialidad, el MBxB i = cantidad máxima de bloques que ocupa un bucket del índice i (basado en hashing) es 4 asumimos que hay 100 traumatólogos Pasamos la consulta a álgebra relacional: π (σ especialidad= traumatologia (M)) Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 23 / 32

Escenario 3: selección por igualdad usando HashTable π (σ especialidad= traumatologia (M)) Árbol canónico con su plan de ejecución: Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 24 / 32

Escenario 3: selección por igualdad usando HashTable La tabla de hash era: Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 25 / 32

Escenario 3: selección por igualdad usando HashTable Pasos a seguir para calcular el costo: identificar el bucket correspondiente (asumimos costo 0), recorrer todos los bloques del bucket para encontrar los punteros que se corresponden con las tuplas que coinciden con la clave buscada: MBxB i en peor caso (costo 4), acceder tantos bloques de datos como tuplas busquemos, para lo cual hay que leer todos los bloques apuntados por el bucket que coinciden con la clave buscada. Peor caso: cada tupla está en un bloque distinto (costo 100), costo total: 104 Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 26 / 32

Escenario 3: selección por igualdad usando HashTable Pasos a seguir para calcular el costo: identificar el bucket correspondiente (asumimos costo 0), recorrer todos los bloques del bucket para encontrar los punteros que se corresponden con las tuplas que coinciden con la clave buscada: MBxB i en peor caso (costo 4), acceder tantos bloques de datos como tuplas busquemos, para lo cual hay que leer todos los bloques apuntados por el bucket que coinciden con la clave buscada. Peor caso: cada tupla está en un bloque distinto (costo 100), costo total: 104 Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 26 / 32

Escenario 3: selección por igualdad usando HashTable Pasos a seguir para calcular el costo: identificar el bucket correspondiente (asumimos costo 0), recorrer todos los bloques del bucket para encontrar los punteros que se corresponden con las tuplas que coinciden con la clave buscada: MBxB i en peor caso (costo 4), acceder tantos bloques de datos como tuplas busquemos, para lo cual hay que leer todos los bloques apuntados por el bucket que coinciden con la clave buscada. Peor caso: cada tupla está en un bloque distinto (costo 100), costo total: 104 Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 26 / 32

Escenario 3: selección por igualdad usando HashTable Pasos a seguir para calcular el costo: identificar el bucket correspondiente (asumimos costo 0), recorrer todos los bloques del bucket para encontrar los punteros que se corresponden con las tuplas que coinciden con la clave buscada: MBxB i en peor caso (costo 4), acceder tantos bloques de datos como tuplas busquemos, para lo cual hay que leer todos los bloques apuntados por el bucket que coinciden con la clave buscada. Peor caso: cada tupla está en un bloque distinto (costo 100), costo total: 104 Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 26 / 32

Escenario 3: selección por igualdad usando HashTable Pasos a seguir para calcular el costo: identificar el bucket correspondiente (asumimos costo 0), recorrer todos los bloques del bucket para encontrar los punteros que se corresponden con las tuplas que coinciden con la clave buscada: MBxB i en peor caso (costo 4), acceder tantos bloques de datos como tuplas busquemos, para lo cual hay que leer todos los bloques apuntados por el bucket que coinciden con la clave buscada. Peor caso: cada tupla está en un bloque distinto (costo 100), costo total: 104 Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 26 / 32

Escenario 4: selección por rango usando HashTable Qué pasa si tuviésemos una consulta con este tipo de índice, pero por rango? Debemos evaluar el caso, ya que el índice hash es probable que no nos sirva, o que no sea óptimo. Para poder utilizar un índice hash se deben proveer todos los valores de búsqueda. Notar que en una búsqueda por rango no siempre se pueden saber todos los valores posibles comprendidos, ya que en algunos casos pueden ser infinitos. Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 27 / 32

Escenario 5: cuando todo está en el índice Tenemos la consulta: SELECT fechaingreso FROM Médico M WHERE especialidad = "traumatología" Y un índice árbol B + clustered sobre los atributos <Especialidad,FechaIngreso>, que tiene un costo de acceso de 4 bloques. Es decir que el índice está físicamente ordenado por especialidad, y adentro de ese atributo por fechaingreso. Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 28 / 32

Escenario 5: cuando todo está en el índice Gráficamente: Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 29 / 32

Escenario 5: cuando todo está en el índice Pasos a seguir: leemos 4 bloques (la altura del árbol) luego debemos leer N hojas (cantidad de fechas ingreso que cumplen con especialidad traumatología ). Esto puede aumentarnos la cantidad de bloques en memoria. Por simplicidad para los cálculos, asumimos que se lee 1 hoja. costo total: 4 Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 30 / 32

Escenario 5: cuando todo está en el índice Pasos a seguir: leemos 4 bloques (la altura del árbol) luego debemos leer N hojas (cantidad de fechas ingreso que cumplen con especialidad traumatología ). Esto puede aumentarnos la cantidad de bloques en memoria. Por simplicidad para los cálculos, asumimos que se lee 1 hoja. costo total: 4 Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 30 / 32

Escenario 5: cuando todo está en el índice Pasos a seguir: leemos 4 bloques (la altura del árbol) luego debemos leer N hojas (cantidad de fechas ingreso que cumplen con especialidad traumatología ). Esto puede aumentarnos la cantidad de bloques en memoria. Por simplicidad para los cálculos, asumimos que se lee 1 hoja. costo total: 4 Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 30 / 32

Escenario 5: cuando todo está en el índice Pasos a seguir: leemos 4 bloques (la altura del árbol) luego debemos leer N hojas (cantidad de fechas ingreso que cumplen con especialidad traumatología ). Esto puede aumentarnos la cantidad de bloques en memoria. Por simplicidad para los cálculos, asumimos que se lee 1 hoja. costo total: 4 Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 30 / 32

Fin de la clase de Ejercicios Simples de Optimización Tarea para el hogar Estudien el Apunte de Optimización subido en la página. Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 31 / 32

Bibliografía Referencias Apunte de Optimización de la materia. Abraham Silberschatz, Henry F. Korth, S.Sudarshan, "Database System Concepts", Sexta Edición, McGraw-Hill, 2011. Ramez Elmasri, Shamkant Navathe, "Fundamentals of Database Systems", Sexta Edición, Pearson, 2011. Rosana Matuk (DC-FCEyN-UBA) Optimización 13 de octubre de 2016 32 / 32