Cursor Lento - Query executa rápido, cursor demora retorno

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

Pessoal, boa tarde

Minha dúvida é a seguinte:

Quado executo a query abaixo, ela retorna 16 linhas em 0,749 segundos.

Selecionar tudo

SELECT view1.* 
FROM   view1 
WHERE (nome LIKE '%MARIA%' ) 
AND (STATUS < 99  ) AND (DATA >= SYSDATE - 365) 
AND  (view1.CIDADE BETWEEN 1 AND 9999999999999999 )

Quando é chamada pela proc, o cursor demora 3 minutos para retornar os dados, a query executa normalmente, porém a lentidão esta no momento de abir o cursor. Fiz um teste na proc pelo plsql developer, executa rapido, mas quando clico para abrir o cursor o problema ocorre.

Selecionar tudo

OPEN C_RES FOR
SELECT view1.* 
FROM   view1 
WHERE (nome LIKE '%MARIA%' ) 
AND (STATUS < 99  ) AND (DATA >= SYSDATE - 365) 
AND  (view1.CIDADE BETWEEN 1 AND 9999999999999999 )
Sendo "C_RES" OUT SYS_REFCURSOR de uma proc

Alguém sabe como corrigir esse problema de lentidão no retorno do cursor???

Obrigado.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Olá Moloukos,

Notei que você colocou um "SELECT *" na declaração do seu cursor.

Pode complementar seu tópico com estas informações?

A) Quantidade de colunas retornada pelo cursor;
B) Algum datatype diferente retornado pelo cursor (ex: BLOB,CLOB);
C) Quantidade de linhas retornadas pelo cursor;

Acho que estas informações ajudariam o pessoal aqui do fórum a lhe dar sugestões.

Abraços,

Sergio
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

Bom dia Sérgio.

Seguem as respostas dos questionamentos:

a) O cursor retorna 34 colunas
b) Os datatypes retornados são: NUMBER(10), NVARCHAR2(70) e DATE
c) Com o filtro utilizado na pesquisa, a query retorna 16 linhas.

Salientando que fiz o teste no banco de pré-produção e a demora não acontece. O problema ocorre somente no banco de produção.

Obrigado.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Maloukos,

Mas comparando PRODUCAO x PRE-PRODUCAO, é uma cópia idêntica no que se refere à :

A) Massa de dados;
B) Sistema Operacional
C) Release Banco?
D) Single Instance e Rac?
E) Explain Plan

Estou fazendo estas perguntas mais para que os foristas possam ter subsídios para análise. Pode ser até que outros foristas possam ter outras linhas de abordagem para seu caso.

At.

Sergio
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

Sérgio,

O dump do banco de produção para pré-prod foi feito ontem.

A) Os dados estão iguais até ontem.
B) Sistema operacional igual
C) Mesma release
D) Os dois estão no RAC
E) Explain Plan igual nas duas bases

Tem idéia do que pode ser?

Rebuild nas tabelas, refazer os indexes?

Att.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

OIa Moloukos,

Se você abrisse nos dois ambientes o SQLPLUS .. e gerasse um spool com os resultados do SELECT deste cursor, o tempo para geração completa do resultado seria igual?

Das colunas retornadas por este cursor, por acaso alguma delas é um função customizada PL/SQL que retorna valores?

Talvez atualizar as estatísticas (DBMS_STATS) fosse interessante. Também seria interessante avaliar se os parâmetros de inicialização apresentam os mesmos valores. Se as tablespaces (ex: TEMP) apresentam os mesmos tamanhos.

At.

Sergio
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

Boa tarde Sérgio.

Fiz o teste gerando o spool e o tempo entre a geração do banco de pré-prod e prod não foi muito grande. Acredito que o de produção tenha demorado um pouco mais por conta do acesso, quantidade de pessoas utilizando.

A unica função utilizada neste cursor é :

Selecionar tudo

 CEIL(SYSDATE - v.DTA_EDT) AS DIAS.
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

A base de pré-prod é cópia física da base PROD. As tablespaces são iguais, estatísticas iguais, tudo igual.
O que muda é a concorrência, e a quantidade de usuários ativos.
terencecosta
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Ter, 14 Abr 2015 9:25 am

Prezados,

Estou exatamente com o mesmo problema, ao executar a query o retorno é muito rápido mas quando executada a mesma para retornar pelo cursor o tempo é 200x maior.

Acharam alguma solução para o problema?
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

Continuamos com o problema. Não conseguimos encontrar a solução.
maxwbh
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 21 Out 2014 5:16 pm
Localização: Belo Horizonte - MG
Maxwell da Silva Oliveira
(31) 9325.7479/ 9474.8854
maxwbh@gmail.com
http://lnkd.in/PkcQ5y

Moloukos,
a concorrência é um grande fator que deixa a performasse bem baixa;
Outra diferença são os índices, em pre-prod. foram recriados?
Veja como esta o plano de acesso em produção, nomeie os campos isto ajuda no momento de criação do cursor.
Responder
  • Informação