de Martin LE TARNEC

Índices parciales

Indexar los registros seleccionados


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.

Previous pageNext page

You can’t learn everything in one day. Subscribe the newsletter via E-Mail, Twitter or RSS to gradually catch up. Have a look at modern-⁠sql.com as well.

Acerca del autor

Foto de Markus Winand

Markus Winand es defensor del resurgimiento del SQL. Su misión es la de presentar a los desarrolladores la evolución de SQL en el siglo XXI. Es posible contratar a Markus según disponibilidad o como orador o consultor en winand.at.

Adquiere tu libro

Portada de “Rendimiento SQL explicado”: Ardilla corriendo en la hierba

La esencia del tuning de SQL en 200 páginas

Compra ahora
(libro de bolsillo y/o PDF)

Contratar a Markus

La manera más rápida y fácil de beneficiarse de su extenso conocimiento y experiencia.
Aprende más »

Entrar en contacto con Markus

Markus Winand en LinkedInMarkus Winand en XINGMarkus Winand en Twitter
“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 | Privacidad y RGPD | CC-BY-NC-ND 3.0 licencia