Puede crear un índice basado en expresión para mejorar el
rendimiento de las consultas que utilizan predicados de expresión de columna.
Acerca de esta tarea
A diferencia de un índice simple, un índice basado en expresiones utiliza valores de clave que se transforman mediante una expresión que se especifica cuando se crea el índice. Pero, Db2 no siempre puede utilizar un índice basado en expresión. Por ejemplo, es posible que Db2 no pueda utilizar un índice en la expresión para consultas que contengan varias uniones externas, vistas materializadas y expresiones de tabla materializadas.
Db2 no utiliza un índice basado en expresión para consultas que utilizan cursores estáticos sensibles.
Procedimiento
Para que Db2 pueda utilizar un índice basado en expresión, utilice los siguientes métodos:
- Cree un índice basado en expresión para las consultas que contengan
predicados que utilicen expresiones de columna.
- Vuelva a escribir las consultas que contengan varias uniones externas de manera que un predicado que pueda satisfacerse mediante un índice en una expresión esté en un bloque de consultas distinto al de las uniones externas.
Por ejemplo,
Db2 no puede utilizar un índice basado en expresión para el predicado UPPER en la consulta siguiente:
SELECT ...
FROM T1
LEFT OUTER JOIN T2
ON T1.C1 = T2.C1
LEFT OUTER JOIN T3
ON T1.C1 = T3.C1
WHERE UPPER(T1.C2, 'EN_US') = 'ABCDE'
Pero, puede volver a escribir la consulta para que Db2 pueda utilizar un índice basado en expresión para el predicado UPPER colocando la expresión UPPER en un bloque de consulta independiente de las uniones externas, tal como se muestra en la consulta siguiente:
SELECT ...
FROM (
SELECT C1
FROM T1
WHERE UPPER(T1.C2, 'EN_US') = 'ABCDE'
) T1
LEFT OUTER JOIN T2
ON T1.C1 = T2.C1
LEFT OUTER JOIN T3
ON T1.C1 = T3.C1
- Reescriba las consultas que contengan vistas materializadas y expresiones
de tabla para que los predicados que puedan sacar partido de un índice basado
en expresión se codifiquen dentro de la vista o la expresión de tabla.
Por ejemplo, en la consulta siguiente tal como está escrita, la expresión de la tabla X se materializa debido a la palabra clave DISTINCT y
Db2 no puede utilizar un índice basado en expresión para el predicado UPPER:
SELECT ...
FROM (
SELECT DISTINCT C1, C2 FROM T1
) X
, T2
WHERE X.C1 = T2.C1
AND UPPER(X.C2, 'En_US') = 'ABCDE'
Pero, se puede habilitar Db2 para que utilice un índice basado en expresión para el predicado UPPER reescribiendo la consulta para que el predicado UPPER se codifique dentro de la expresión de tabla, tal como se muestra en el ejemplo siguiente:
SELECT ...
FROM (
SELECT DISTINCT C1, C2 FROM T1
WHERE UPPER(T1.C2, 'En_US') = 'ABCDE'
) X
, T2
WHERE X.C1 = T2.C1
