Si escribimos un SELECT a una tabla que tiene columnas de tipo BLOB ¿cómo afectan a la velocidad de respuesta esas columnas?

Las columnas de tipo BLOB son muy útiles para guardar textos largos, fotografías, canciones, vídeos, etc. pero recuperar esa cantidad masiva de bytes puede hacer demorar mucho a nuestras consultas, entonces ¿qué podemos hacer para tener una buena velocidad de respuesta?

Primero, tener a las columnas de tipo BLOB en una tabla separada, exclusiva para ella. Por ejemplo, tenemos una tabla llamada PRODUCTOS y otra tabla relacionada llamada PRODUCTOSFOT, y en esta última tabla guardaremos las fotografías de los productos.

Segundo, si en una columna de tipo BLOB no se guardarán (aún, por lo menos) datos. ¿Es preferible que su valor sea NULL o que su valor sea un espacio en blanco?

Para no tener que escribir COALESCE(MiColumnaBLOB, ”) alguna gente prefiere guardar un espacio en blanco en la columna BLOB, ¿es esa una buena práctica?

No. Y la razón es que si el Firebird encuentra un NULL en una columna de tipo BLOB entonces ya sabe que no hay datos para esa columna y continúa con su siguiente tarea. Pero si hay cualquier valor distinto de NULL entonces ese valor distinto de NULL es un puntero a una página que guarda BLOBs. Por lo tanto debe visitar esa página para recuperar el contenido que encuentre en ella y que corresponde a la fila actual. Y aunque ese contenido sea un simple espacio en blanco tuvo que visitar igualmente a esa página.

En tablas que tienen pocas filas ese constante ir y venir entre las páginas de datos y las páginas BLOB no afectará mucho a la velocidad de respuesta de las consultas, pero en tablas que tienen cientos de miles o millones de filas ya es otro tema pues allí sí que será notoria la diferencia.

Por lo tanto, para que las columnas de tipo BLOB no hagan demorar mucho a los SELECTs:

  1. Esas columnas deben encontrarse en una tabla separada
  2. Si aún no se guarda algo en ellas, su valor debe ser NULL

Artículos relacionados:

Usando columnas de tipo BLOB

Guardando las columnas BLOB en tablas separadas

Almacenamiento de las columnas de tipo BLOB

Un stored procedure para conocer el tamaño total de los BLOB

Entendiendo las páginas de la Base de Datos

Eligiendo el tamaño adecuado de las páginas de la Base de Datos

¿Cómo las bases de datos de Firebird aumentan de tamaño?

El índice del blog Firebird21

El foro del blog Firebird21