Oracle - Problema al hacer FETCH en un CURSOR

   
Vista:

Problema al hacer FETCH en un CURSOR

Publicado por Juan (3 intervenciones) el 31/08/2007 15:15:57
Hola, este es mi primer post, asi que voy a intentar ser lo mas claro posible, si me olvido de algo, por favor avisenme. Espero que puedan ayudarme.

La situacion es la siguiente:
Tengo un esquema que tiene una tabla llamada NOTICIAS, la cual tiene 3 indices de Oracle Text y 2 indices normales. Ademas, este esquema tiene un stored procedure que devuelve un cursor conteniendo notas de la tabla NOTICIAS. El cursor es el siguiente:

OPEN l_cursor FOR
SELECT /*+ FIRST_ROWS(50) */
(score (1) + score (2) + score (3)
) AS RANK, ID, TO_CHAR (dateinsert, 'dd/mm/yyyy')
FROM NOTICIAS
WHERE ( contains (resumen, v_palabra, 1) > 0
OR contains (insert, v_palabra, 2) > 0
OR contains (tema, v_palabra, 3) > 0
)
AND ouid = v_ouid
ORDER BY dateinsert DESC;

Tambien tengo un usuario de conexion que llama al stored procedure y recorre el cursor imprimiendo datos de las notas. El script es:

DECLARE
CUR SYS_REFCURSOR;
X NUMBER := 0;
TYPE TYP_C_TEMP IS RECORD (SCORE NUMBER, ID NUMBER, DATEINSERT VARCHAR2(10));
C_TEMP TYP_C_TEMP;

BEGIN
DBMS_OUTPUT.put_line ('BEGINS QUERYING' || ' ----> TIME: '|| SYSTIMESTAMP);

CUR:= FILNEWS.GET_ALL('BOMBA','C10','R');

DBMS_OUTPUT.put_line ('ENDS QUERYING' || ' ----> TIME: '|| SYSTIMESTAMP);
DBMS_OUTPUT.put_line ('STARTS FETCHING CURSOR' || ' ----> TIME: '|| SYSTIMESTAMP);

LOOP
FETCH CUR INTO C_TEMP;
X := X + 1;
EXIT WHEN CUR%NOTFOUND OR X = 10;
DBMS_OUTPUT.put_line ('RECORD NUMBER: ' || X || ' ----> TIME: '|| SYSTIMESTAMP);
END LOOP;

DBMS_OUTPUT.put_line ('FINISHES FETCHING CURSOR' || ' ----> TIME: '|| SYSTIMESTAMP);

END;
/

El problema es que cuando corro este script, desde el momento en que arranca a hacer el FETCH hasta que me imprime el primer valor, me tarda casi siempre mas de 7 segundos, es como si existiese un tiempo muerto.

Este es un ejemplo de un output de una corrida:

BEGINS QUERYING ----> TIME: 30/08/2007 12:02:27,612996000 PM -03:00
ENDS QUERYING ----> TIME: 30/08/2007 12:02:30,565031000 PM -03:00
STARTS FETCHING CURSOR ----> TIME: 30/08/2007 12:02:30,565102000 PM -03:00
RECORD NUMBER: 1 ----> TIME: 30/08/2007 12:02:37,123874000 PM -03:00
RECORD NUMBER: 2 ----> TIME: 30/08/2007 12:02:37,123985000 PM -03:00
RECORD NUMBER: 3 ----> TIME: 30/08/2007 12:02:37,124037000 PM -03:00
RECORD NUMBER: 4 ----> TIME: 30/08/2007 12:02:37,124086000 PM -03:00
RECORD NUMBER: 5 ----> TIME: 30/08/2007 12:02:37,124135000 PM -03:00
RECORD NUMBER: 6 ----> TIME: 30/08/2007 12:02:37,124183000 PM -03:00
RECORD NUMBER: 7 ----> TIME: 30/08/2007 12:02:37,124236000 PM -03:00
RECORD NUMBER: 8 ----> TIME: 30/08/2007 12:02:37,124283000 PM -03:00
RECORD NUMBER: 9 ----> TIME: 30/08/2007 12:02:37,124330000 PM -03:00
FINISHES FETCHING CURSOR ----> TIME: 30/08/2007 12:02:37,124377000 PM -03:00
PL/SQL procedure successfully completed.
Elapsed: 00:00:10:87

Si pueden ayudarme, estaria mas que agradecido.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema al hacer FETCH en un CURSOR

Publicado por Rodolfo Reyes (445 intervenciones) el 31/08/2007 19:01:33
Supongo que simplemente se tarda este tiempo para poder procesar los OR que estan en el query con el cual haces el cursos.

WHERE ( contains (resumen, v_palabra, 1) > 0
OR contains (insert, v_palabra, 2) > 0
OR contains (tema, v_palabra, 3) > 0

Al momento de hacer el primer Fecth, es cuando realmente se ejecuta el query para crear el cursor.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema al hacer FETCH en un CURSOR

Publicado por Juan (3 intervenciones) el 31/08/2007 20:12:02
Hola, primero gracias por responder, como puedo solucionar el tiempo ese?.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema al hacer FETCH en un CURSOR

Publicado por Rodolfo Reyes (445 intervenciones) el 03/09/2007 17:52:36
Podrias ver si creando tres querys los cuales los amarres con un UNION, te da mejor resultado.

SELECT /*+ FIRST_ROWS(50) */
(score (1) + score (2) + score (3)
) AS RANK, ID, TO_CHAR (dateinsert, 'dd/mm/yyyy')
FROM NOTICIAS
WHERE ( contains (resumen, v_palabra, 1) > 0
OR contains (insert, v_palabra, 2) > 0
OR contains (tema, v_palabra, 3) > 0
)
AND ouid = v_ouid
ORDER BY dateinsert DESC;

Por ejemplo:

SELECT /*+ FIRST_ROWS(50) */
(score (1) + score (2) + score (3)
) AS RANK, ID, TO_CHAR (dateinsert, 'dd/mm/yyyy')
FROM NOTICIAS
WHERE ( contains (resumen, v_palabra, 1) > 0
)
AND ouid = v_ouid
UNION
(
SELECT /*+ FIRST_ROWS(50) */
(score (1) + score (2) + score (3)
) AS RANK, ID, TO_CHAR (dateinsert, 'dd/mm/yyyy')
FROM NOTICIAS
WHERE contains (insert, v_palabra, 2) > 0
)
AND ouid = v_ouid
ORDER BY dateinsert DESC;
)
UNION
(
SELECT /*+ FIRST_ROWS(50) */
(score (1) + score (2) + score (3)
) AS RANK, ID, TO_CHAR (dateinsert, 'dd/mm/yyyy')
FROM NOTICIAS
WHERE contains (tema, v_palabra, 3) > 0
)
AND ouid = v_ouid
)
ORDER BY dateinsert DESC;

Realmente es cosa de ponerte a ver como puedes optimizar el query.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar