Performance do Order By

Tuning de Banco, Tuning de SQL, Ferramentas de tuning
Responder
Avatar do usuário
Marciel
Rank: Analista Sênior
Rank: Analista Sênior
Mensagens: 158
Registrado em: Qui, 03 Mai 2007 10:12 am
Localização: Vitória - ES
Sabe qual o cúmulo da ignorância, da apatia e da ira?
Não sei, não quero saber e tenho raiva de quem sabe.

Bom dia,

Tenho uma view que extrai dados de arquivos XML guardados num campo de uma tabela. A view é relativamente rápida pelo volume de informações processadas. Porém, se for adicionada uma cláusula "order by" em algum campo do XML no SQL, a pesquisa demora tanto a ponto de ser inviável.

Exemplo demonstrativo do caso:

Selecionar tudo

CREATE OR REPLACE VIEW VW_DEMO AS
SELECT TABELA.CODIGO
       XTAB.CAMPO
  FROM TABELA,
       XMLTABLE ('//root/campo' PASSING TABELA.XML COLUMNS
                 CAMPO VARCHAR2 (50) PATH '/campo/text()') XTAB:

SELECT * FROM VW_DEMO;  --executa em menos de 1 segundo
SELECT * FROM VW_DEMO ORDER BY CODIGO; --executa em menos de 1 segundo
SELECT * FROM VW_DEMO ORDER BY CAMPO; --leva vários minutos
Como melhorar essa situação?
Avatar do usuário
fbifabio
Moderador
Moderador
Mensagens: 199
Registrado em: Ter, 22 Fev 2011 1:51 pm
Localização: São Paulo - SP
Contato:
Fábio Prado
www.fabioprado.net

Marciel,

A ordenação consome muitos recursos do BD e a melhor recomendação para otimizar o SQL é evitá-la. Nunca pesquisei para entender o porquê de demorar mais em XML, mais sei que isso é normal. Quando eu era desenvolvedor, eu nunca fazia ordenação nas minhas instruções SQL, visões etc. Eu retornava os dados para a aplicação do modo em que elas vinham do BD e fazia a ordenação diretamente na aplicação. Ordenar os dados na aplicação geralmente é mais rápido que ordenar no BD.

[]s
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Pessoal,

É uma dúvida minha, específica para este caso:

E se, ao invés da view, você criar uma temp, populá-la com o valor essa view (criar uma procedure popula_temp, por exemplo) sem ordenação e, depois fazer um select na temp, ordenado?

Abraço,

Trevisolli
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 3 visitantes