Aprenda PL/SQL

Ajuda - Otimização query

Tuning de Banco, Tuning de SQL, Ferramentas de tuning
  

Mensagemem Ter, 05 Mai 2015 5:27 pm

Boa Tarde.
Gostaria de uma ajuda se possível para um possível tuning de uma query simples, sem filtros.

A query é esta:

Código: Selecionar todos
select * from sms_safx42_spo;


O problema desta query é que ela retorna em torno de 10 milhões de registros, o resultado dela estou gravando em um arquivo via utl_file.

Segue plano de execução:

Código: Selecionar todos
SELECT STATEMENT REMOTE, GOAL = ALL_ROWS   Id=0   Operation=SELECT STATEMENT   Cost=8105   CPU cost=3727389226   Bytes=1682697087
TABLE ACCESS FULL   Id=1   Operation=TABLE ACCESS   Cost=8105   CPU cost=3727389226   Bytes=1682697087


Existe alguma forma de melhora-la?

Detalhe: esta tabela é acessada via db_link
marcus.asse

Mensagemem Seg, 25 Mai 2015 3:23 pm

Boa tarde,

Minha dica é você utilizar um hint. O Hint que vou sugerir divide o processamento em mais de um núcleo de processamento. No exemplo abaixo estou colocando em 2 núcleos.

Código: Selecionar todos
select /*+ parallel(2) */ * from sms_safx42_spo;


Passse o feedback por favor.
Michel Pessoa

Mensagemem Sex, 24 Jul 2015 8:33 am

É possível que o maior gargalo seja na gravação do arquivo e não na consulta em si.
DanielNN
Localização: Fortaleza - CE

att,

Daniel N.N.

Mensagemem Seg, 27 Jul 2015 3:24 pm

Fala brother, blzinha?


Não sei se já resolveu o seu problema (caso positivo, posta a solução aqui pra gente), porém, vale dar uma olhada no caso do db_link.

Uma dica seria você salvar esse txt, executar o script no seu "_spo" e, depois transferir o txt. Teria como?

Se não puder, consegue trazer esses registros, de X em X linhas, em uma tabela local e, desta tabela resolver a exportação do arquivo?

Abraço,

Trevisolli
Trevisolli
Localização: Araraquara - SP

Abraço,

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

Mensagemem Seg, 19 Out 2015 12:31 pm

Talvez esse problema já tenha sido resolvido, mas vou deixar minha contribuição, como o Trevisolli comentou no post acima sobre trazer os registros de X em X linhas, pensei na utilização do bulk collect.
Dessa forma é possível retornar vários registros em um único fetch, tem um porém, esse recurso usa mais memória, então é importante verificar qual o tamanho X de linhas a trazer por fetch.

Segue um código de exemplo que eu fiz:

Código: Selecionar todos
PROCEDURE TESTE AS
    --
    CURSOR curOrders is
      select order_id,
             order_date,
             order_mode,
             customer_id,
             order_status,
             order_total,
             sales_rep_id,
             promotion_id,
             warehouse_id,
             delivery_type,
             cost_of_delivery,
             wait_till_all_available,
             delivery_address_id,
             customer_class,
             card_id,
             invoice_address_id
      from   orders;
    --
    TYPE tblOrders is table of orders%ROWTYPE INDEX BY PLS_INTEGER;
    clOrders       tblOrders;
    --
    vLimit PLS_INTEGER := 4000;
    --
  BEGIN
    --
    open curOrders;
      --
      loop
        --
        fetch curOrders
        bulk  collect into clOrders
        limit vLimit;
        --
        dbms_output.put_line(to_char(clOrders.count));
        --
        exit when clOrders.count < vLimit;
        --
      end loop;
      --
    close curOrders;
    --
  END TESTE;
souldeath
Localização: Campinas



Voltar para DBA Tuning

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante