de Martin LE TARNEC.

Índices parciales


Hasta ahora, se ha hablado solamente de las columnas para agregar a los índices. Con los índices parciales (PostgreSQL) o filtrados (SQL Server), se pueden especificar qué registros serán indexados.

Atención

La base de datos Oracle tiene un enfoque particular para los índices parciales. La siguiente sección lo explicará completamente mientras esta sección está basado en el enfoque general.

DB2 no soporta los índices parciales, pero puede ser emulado como en la base de datos Oracle cuando se usa la característica EXCLUDE NULL KEYS.

Un índice parcial es muy útil para los filtros where comúnmente usados, que usan valores constantes, como un código de estado en el siguiente ejemplo:

SELECT message
  FROM messages
 WHERE processed = 'N'
   AND receiver  = ?

Las sentencias como esta son muy comunes en los sistemas de colas. La sentencia busca todos los mensajes no procesados para un destinatario particular. Los mensajes que ya han sido procesados raramente se usan. Si se necesitan, se puede tener acceso a ellos por un criterio más específico como la llave primaria.

Se puede optimizar esta sentencia con un índice de dos columnas. Considerando solamente esta sentencia, el orden de las columnas no importa porque no existe un rango de condición.

CREATE INDEX messages_todo
          ON messages (receiver, processed)

El índice satisface el objetivo, pero incluye muchos registros que nunca son buscados, en concreto todos los mensajes que ya se han procesados. Gracias a la escalabilidad logarítmica del índice, la sentencia es muy rápida, pero se desperdicia mucho espacio en disco.

Con un índice parcial, se puede limitar el índice para incluir solamente los mensajes no procesados. La sintaxis para este índice es sorprendentemente sencilla: un filtro where.

CREATE INDEX messages_todo
          ON messages (receiver)
       WHERE processed = 'N'

El índice contiene solamente los registros que cumplen con el filtro where. En este caso particular, se puede también eliminar la columna PROCESSED porque de todos modos, es siempre 'N'. Eso significa que el índice reduce su tamaño en dos dimensiones: verticalmente, porque contiene menos registros; horizontalmente, debido a la columna eliminada.

El índice es por lo tanto muy pequeño. Para una cola de mensaje, puede significar que el tamaño del índice es fijo, aunque la tabla crezca sin límite. El índice no contiene todos los mensajes, solamente los no procesados.

El filtro where de un índice parcial puede llegar a ser arbitrariamente complejo. La única limitación esencial está en las funciones: se pueden usar solamente las funciones deterministas, al igual que sucede en las otras partes de la definición del índice. SQL Server tiene, sin embargo, reglas más restrictivas y no permite las funciones ni el operador OR dentro de los predicados del índice.

Una base de datos podrá usar un índice parcial cada vez que el filtro where aparece en la sentencia.

Piénsalo

¿Qué peculiaridad tiene el índice más pequeño para la siguiente sentencia?

SELECT message
  FROM messages
 WHERE processed = 'N'

Si te gusta mi manera de explicar, te encantará mi libro.

Acerca del autor

Foto de Markus Winand

Markus Winand enseña eficientemente SQL, en casa y online. Minimiza el tiempo de desarrollo utilizando moderno SQL y optimiza el tiempo de ejecución con indexación inteligente. Para ello también ha publicado el libro SQL Performance Explained.

“Use The Index, Luke” de Markus Winand se halla bajo licencia Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Aspectos legales | Contacto | SIN GARANTÍA | Marcas | Privacy | CC-BY-NC-ND 3.0 licencia