FETCH FIRST n ROWS ONLY y OPTIMIZE FOR n ROWS

Las cláusulas OPTIMIZE FOR n ROWS y FETCH FIRST n ROWS ONLY de DB2 permiten optimizar una SELECT indicándole al DB2 el número de filas (n) que estimamos se van a obtener. La diferencia entre ambas es que con OPTIMIZE FOR se recuperan todas las filas que cumplan la condición de la SELECT y con FETCH FIRST sólo las n primeras.

IBM recomienda utilizar OPTIMIZE for 1 ROW siempre que se vaya recuperar un número reducido de filas (aunque sea superior a uno). De esta forma le indicamos a DB2 que intente evitar caminos de acceso que impliquen ordenaciones.

Ejemplo:

SELECT CAMPO1,
       CAMPO2,
       CAMPO3
FROM TABLA
WHERE CAMPO4  = :VARIABLE
FETCH FIRST 10 ROWS ONLY

Esta SELECT recuperará un máximo de 10 filas. Un intento de recuperar la número 11 devolverá un SQLCODE 100.

El FETCH FIRST implica también optimizar el camino de acceso para el mismo número de filas. Es decir, en el ejemplo anterior se asume por omisión un OPTIMIZE FOR 10 ROWS.

Cuando queramos hacer una optimización para un número inferior de filas, debemos indicarlo explícitamente. Por ejemplo, para optimizar la SELECT anterior siguiendo la recomendación de IBM:

SELECT CAMPO1,
       CAMPO2,
       CAMPO3
FROM TABLA
WHERE CAMPO4  = :VARIABLE
FETCH FIRST 10 ROWS ONLY
OPTIMIZE FOR 1 ROW

Cuando solo queramos optimizar la SELECT sin limitar el número de filas, basta con incluir el OPTIMIZE:

SELECT CAMPO1,
FROM TABLA
WHERE CAMPO2  = :VARIABLE
OPTIMIZE FOR 1 ROW

<

4 respuestas a «FETCH FIRST n ROWS ONLY y OPTIMIZE FOR n ROWS»

Deja un comentario