Ajuda - Otimização query

Tuning de Banco, Tuning de SQL, Ferramentas de tuning
Responder
marcus.asse
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 28 Fev 2013 10:49 am

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

A query é esta:

Selecionar tudo

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:

Selecionar tudo

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
Michel Pessoa
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Seg, 18 Nov 2013 2:24 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.

Selecionar tudo

select /*+ parallel(2) */ * from sms_safx42_spo;
Passse o feedback por favor.
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

É possível que o maior gargalo seja na gravação do arquivo e não na consulta em si.
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

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
souldeath
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 48
Registrado em: Qua, 25 Ago 2010 9:39 am
Localização: Limeira

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:

Selecionar tudo

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;
Responder
  • Informação
  • Quem está online

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