Oracle Types (tipos)

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
almir.jg
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 8
Registrado em: Qua, 20 Jan 2016 9:20 am

:?: Oracle object :?:
Ola amigos!

Estou iniciando um estudo para por em pratica algumas funcionalidades do Oracle, uma delas é Type Object. O volume de dados que trabalho é considerável (B.I.), para que o processo fique ágil optei por utilizar o Type Object disponibilizado pelo Banco Oracle.

Abaixo segue um exemplo:

Selecionar tudo

-- Criação do objeto (estrutura de dados)
Create Type OBJ_Teste
(Id number,
nome varchar2(50)
);

Selecionar tudo

-- Criação da tabela de dados
Create Type TBL_Teste is table of OBJ_Teste;

Como utilizo este objeto
:

Selecionar tudo

Declare
   xDataSet TBL_Teste := TBL_Teste();
   vNome Varchar2(50);
Begin
  -- Populando o objeto
   for x in (select /*+ Parallel  */id, nome from tabela_blablabla)
   loop
     xDataSet.Extend; -- incrementa um elemento no objeto
     xDataSet(xDataSet.Count) := OBJ_Teste(x.Id, x.Nome); -- Popula o DataSet baseado na estrutura do objeto
   end loop;
  -- Lendo o objeto (na memoria)
  select a.nome into vNome from [b]TABLE[/b](xDataSet) a where a.id = 45 -- Ou outro ID qualquer;
  dbms_output.put_line('Nome: '||vNome);
end;  
Até ai tudo bem! o objeto é criado e populado e se o volume de dados for pequeno é uma beleza, mas quando o volume de dados é grande e o objeto foi transformado em uma tabela ele será lido de forma FULL (Full table scan), isto deixa a pesquisa muito lenta, mesmo sendo em memoria.

Onde pega?
Um destes objetos possui cerda de 800.000 linhas e o cursor principal (para cada linha), fará uma pesquisa nestas 800k. Isto torna o objeto muito lento (mesmo estando em memória).

A pergunta: :idea: Existe alguma forma de se criar um índice como se fosse em uma table, para acessar um elemento baseado no conteúdo do elemento para que esta pesquisa fique mais rápida.?

Nota: O objetivo é criar um ação de pesquisa rápida, baseado no object type da oracle.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Fico meio apreensivo de deixar na memória um volume de dados tão grande.
Eu tentaria outras formas, tipo, criar uma tabela Global Temporary Table (não gera archives), ai você pode tentar usar um Hint APPEND, ou algum outro pra inserir.

Daí utilizar essa tabela e criar o índice no final.
É uma idéia... :roll:
souldeath
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 48
Registrado em: Qua, 25 Ago 2010 9:39 am
Localização: Limeira

almir.jg escreveu:

Selecionar tudo

-- Criação da tabela de dados
Create Type TBL_Teste is table of OBJ_Teste;
E se você criar assim?

Selecionar tudo

Create Type TBL_Teste is table of OBJ_Teste INDEX BY BINARY_INTEGER;
No loop não precisar usar o extend eu acho porque já estaria indexado, seria só passar o valor pra posição desejada:

Selecionar tudo

for x in (select /*+ Parallel  */id, nome from tabela_blablabla)
   loop
     xDataSet(xDataSet.Count) := OBJ_Teste(x.Id, x.Nome); -- Popula o DataSet baseado na estrutura do objeto
   end loop;
Precisa testar se isso deixaria mais rápido.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Majestic-12 [Bot] e 11 visitantes