Algoritmo de coincidencia de índice disperso
Este tema es una discusión generalizada de cómo funciona el algoritmo de coincidencia de índice disperso.
La selección en la consulta debe ser un subconjunto de la selección en el índice disperso para que se utilice el índice disperso. Esta sentencia es verdadera si la selección se realiza junto con AND, OR o una combinación de los dos. Para la selección en la que todos los predicados se agrupan con AND, todos los predicados de selección WHERE especificados en el índice disperso también deben especificarse en la consulta. La consulta puede contener predicados AND adicionales. La selección para los predicados adicionales se realizará después de que se recuperen las entradas del índice disperso. Consulte los ejemplos A1, A2y A3 siguientes.
Ejemplo A1
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE COL1=10 and COL2=20 and COL3=30SELECT COL1, COL2, COL3, COL4
FROM MYLIB/T1
WHERE COL1=10 and COL2=20 and COL3=30Ejemplo A2
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE COL1=10 and COL2=20SELECT COL1, COL2, COL3, COL4
FROM MYLIB/T1
WHERE COL1=10 and COL2=20 and COL3=30Ejemplo A3
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE COL1=10 and COL2=20 and COL3=30SELECT COL1, COL2, COL3, COL4
FROM MYLIB/T1
WHERE COL1=10 and COL2=20Para la selección en la que todos los predicados se especifican juntos, todos los predicados de selección WHERE especificados en la consulta también deben especificarse en el índice disperso. El índice disperso puede contener predicados ORed adicionales. Toda la selección ORed de la consulta se ejecutará después de que las entradas se recuperen del índice disperso. Consulte los ejemplos O1, O2, andO3 siguientes.
Ejemplo O1
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE COL1=10 or COL2=20 or COL3=30SELECT COL1, COL2, COL3, COL4
FROM MYLIB/T1
WHERE COL1=10 or COL2=20 or COL3=30Ejemplo O2
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE COL1=10 or COL2=20 or COL3=30SELECT COL1, COL2, COL3, COL4
FROM MYLIB/T1
WHERE COL1=10 or COL2=20 Ejemplo O3
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE COL1=10 or COL2=20SELECT COL1, COL2, COL3, COL4
FROM MYLIB/T1
WHERE COL1=10 or COL2=20 or COL3=30Los ejemplos anteriores utilizaban una selección simple, todas las AND o todas las OR juntas. Estos ejemplos no son típicos, pero demuestran cómo se compara la selección del índice disperso con la selección de la consulta. Obviamente, cuanto más compleja sea la selección, más difícil será determinar la compatibilidad.
En el siguiente ejemplo T1, la constante 'MN' se ha sustituido por un marcador de parámetro para la selección de consulta. Al índice disperso se le aplicó la selección local de COL1='MN' cuando se creó. El algoritmo de coincidencia de índice disperso compara el marcador de parámetro con la constante 'MN' en el predicado de consulta COL1 =?. Verifica que el valor del marcador de parámetro es el mismo que la constante en el índice disperso; por lo tanto, se puede utilizar el índice disperso.
El algoritmo de coincidencia de índice disperso intenta coincidir donde los predicados entre el índice disperso y la consulta no son iguales. Un ejemplo es un índice disperso con un predicado SALARY > 50000 y una consulta con el predicado SALARY > 70000. El índice disperso contiene las filas necesarias para ejecutar la consulta. El índice disperso se utiliza en la consulta, pero el predicado SALARY > 70000 permanece como selección en la consulta (no se elimina).
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL3)
WHERE COL1='MN' or COL2='TWINS'SELECT COL1, COL2, COL3, COL4
FROM MYLIB/T1
WHERE COL1=? or COL2='TWINS' or COL3='WIN'En el ejemplo siguiente T2, las claves del índice disperso coinciden con los campos ORDER BY de la consulta. Para que el índice disperso satisfaga el orden especificado, el optimizador debe verificar que la selección de consulta es un subconjunto de la selección de índice disperso. En este ejemplo, se puede utilizar el índice disperso.
CREATE INDEX MYLIB/SPR1 on MYLIB/T1 (COL1, COL3)
WHERE COL1='MN' or COL2='TWINS'SELECT COL1, COL2, COL3, COL4
FROM MYLIB/T1
WHERE COL2='TWINS'
ORDER BY COL1, COL3