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.
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


0