Preenchimento automático de registros num banco de dados

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
tiagonascimento
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 28 Nov 2007 9:14 pm
Localização: Belém - PA

Para um projeto da faculdade, preciso implementar um banco de dados com 5 milhões de registros usando umas tabelas que o professor deu lá. Eu já tenho os relacionamentos e tudo, só preciso implementar o banco de dados no Oracle e fazer uma avaliação do desempenho dele a partir de uma consulta em SQL (tipo, o montante de recurso que ele vai consumir, o tempo que vai levar pra fazer a consulta, e coisa e tal). Como eu faço pra preencher esses 5 milhões de registros aleatoriamente? Existe algum script que possa fazer isso?
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

E ai Tiago, beleza?

Quais os campos da sua tabela?
Caso ela tenha alguns registros serviria pra você replicar esses registros qe já existem? Ou os dados que você fosse incluir poderia ser letras e números randomicos??

[]'s
tiagonascimento
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 28 Nov 2007 9:14 pm
Localização: Belém - PA

Fala, Cristiano! Valeu pela atenção, cara, eu estou precisando demais dessa ajuda.

A tabela é bem simples, tem quatro colunas: FUNCIONARIO, TELEFONE, CARGO , SALARIO.

As tabelas preenchidas e o banco de dados nem precisam ser mostrados para o professor, então os campos podem ser preenchidos aleatoriamente com uma string, um real, um string e um real, respectivamente. O objetivo é avaliar o desempenho do banco de dados. Eu só preciso de um jeito de preencher automaticamente os campos. com quaisquer valores.

Obrigado mais uma vez! Se tiver mais alguém que possa ajudar, eu agradeço !
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Opa e ai beleza?

segue ai um codigo q eu montei aqui, eu não testei, mas da uma olhada ai.!! :D

Selecionar tudo

 DECLARE
    v_FUNCIONARIO varchar2(256);
    v_TELEFONE    varchar2(256);
    v_CARGO       varchar2(256);
    v_SALARIO     varchar2(256);
    v_din         varchar2(15);
    vCOUNT        NUMBER(8);
BEGIN
    FOR X IN 1..5000000 LOOP
      select substr(replace(replace(replace(sysdate-x/24/60*3600,'/',''),' ',''),':',''),1,9) into v_din from dual;
      dbms_random.initialize(v_din);       
      v_FUNCIONARIO := to_char( abs( dbms_random.random-(x / 1) ) ); 
      dbms_random.terminate(); 
      
      select substr(replace(replace(replace(sysdate-x/24/60/3600,'/',''),' ',''),':',''),1,9) into v_din from dual;
      dbms_random.initialize(v_din);       
      v_TELEFONE := to_char( abs( dbms_random.random/x ) ); 
      dbms_random.terminate(); 
      
      dbms_random.initialize(v_din);       
      v_CARGO := to_char( abs( dbms_random.random/x/13/30/1800 ) ); 
      dbms_random.terminate(); 
      
      dbms_random.initialize(v_din);       
      v_SALARIO := to_char( abs( dbms_random.random/x/13/30-1800  )/1000000 ); 
      dbms_random.terminate(); 

      v_FUNCIONARIO := TRANSLATE(v_FUNCIONARIO,'0123456789','ABCDEFGHIJ');
      v_TELEFONE    := TRANSLATE(v_TELEFONE   ,'0123456789','FSIUHWEHUS');
      v_CARGO       := TRANSLATE(v_CARGO      ,'0123456789','OIXJVCOIJW');
     
      INSERT INTO TABELA VALUES (v_FUNCIONARIO, v_TELEFONE, v_CARGO, v_SALARIO)
      vCOUNT := vCOUNT+1;
      IF vCOUNT = 10000 THEN
         vCOUNT := 0;
         COMMIT;
      END IF;
    END LOOP;
end;
[]'s
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Segue uma outra solução (testada na versão 10g)

Selecionar tudo

insert into teste_carga
select dbms_random.string(chr(mod(rownum, 25) + 65), 20)
     , substr(lpad(abs(dbms_random.random), 8, '0'), 1, 8)
     , dbms_random.string(chr(mod(rownum, 25) + 65), 12)
     , to_number(substr(abs(dbms_random.random), 1, 8)) / 100
from   dual
connect by level <= 5000000;
tiagonascimento
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 28 Nov 2007 9:14 pm
Localização: Belém - PA

Obrigado, meus amigos, pela atenção e pelo seu tempo!
Se alguém tiver mais sugestões eu aceito, ok?

Um grande abraço!
tiagonascimento
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 28 Nov 2007 9:14 pm
Localização: Belém - PA

Cristiano, eu aproveitei o teu código e fiz algumas alterações pra chegar no que eu queria. Dá uma olhada em como ficou:

Selecionar tudo

CREATE TABLE TAB_TIAGO (
	FUNCIONARIO VARCHAR2(255),
	TELEFONE VARCHAR2(255),
	CARGO VARCHAR2(255),
	SALARIO NUMBER(38)
)
TABLESPACE TBS_TIAGO;

DECLARE 
	TYPE T_FUNCIONARIO IS VARRAY(500) OF TAB_TIAGO.FUNCIONARIO%TYPE;
	TYPE T_TELEFONE IS VARRAY(500) OF TAB_TIAGO.TELEFONE%TYPE;
	TYPE T_CARGO IS VARRAY(500) OF TAB_TIAGO.CARGO%TYPE;
	TYPE T_SALARIO IS VARRAY(500) OF TAB_TIAGO.SALARIO%TYPE;
		
    v_FUNCIONARIO varchar2(256); 
    v_TELEFONE    varchar2(256); 
    v_CARGO       varchar2(256); 
    v_SALARIO     varchar2(256); 
    
    VFUNCIONARIO T_FUNCIONARIO;
    VTELEFONE T_TELEFONE;
    VCARGO T_CARGO;
    VSALARIO T_SALARIO;
    
    v_din         varchar2(15); 
    vCOUNT        NUMBER(8); 
BEGIN 
    FOR X IN 1..20 LOOP 
    
	    vfuncionario:= t_funcionario();
			vtelefone := t_telefone();
			vcargo := t_cargo();
			vsalario := t_salario();
    
    	FOR Y IN 1..500 LOOP
	      select substr(replace(replace(replace(sysdate-x/24/60*3600,'/',''),' ',''),':',''),1,9) into v_din from dual; 
	      dbms_random.initialize(v_din);        
	      v_FUNCIONARIO := to_char( abs( dbms_random.random-(x / 1) ) ); 
	      dbms_random.terminate(); 
	      
	      select substr(replace(replace(replace(sysdate-x/24/60/3600,'/',''),' ',''),':',''),1,9) into v_din from dual; 
	      dbms_random.initialize(v_din);        
	      v_TELEFONE := to_char( abs( dbms_random.random/x ) ); 
	      dbms_random.terminate(); 
	      
	      dbms_random.initialize(v_din);        
	      v_CARGO := to_char( abs( dbms_random.random/x/13/30/1800 ) ); 
	      dbms_random.terminate(); 
	      
	      dbms_random.initialize(v_din);        
	      v_SALARIO := to_char( abs( dbms_random.random/x/13/30-1800  )/1000000 ); 
	      dbms_random.terminate(); 
	
	      begin
	      VFUNCIONARIO.EXTEND();
	      VTELEFONE.EXTEND();
	      VCARGO.EXTEND();
	      VSALARIO.EXTEND();
	      
	      VFUNCIONARIO(Y) := TRANSLATE(v_FUNCIONARIO,'0123456789','ABCDEFGHIJ'); 
	      VTELEFONE(Y) := TRANSLATE(v_TELEFONE   ,'0123456789','FSIUHWEHUS'); 
	      VCARGO(Y) := TRANSLATE(v_CARGO      ,'0123456789','OIXJVCOIJW'); 
	      VSALARIO(Y) := V_SALARIO;
	      exception
	      	when others then
	      		null;
	      end;
	      
      END LOOP;
      
      FORALL I IN 1..500 INSERT INTO TAB_TIAGO VALUES (VFUNCIONARIO(I), VTELEFONE(I), VCARGO(I), VSALARIO(I));
      
      COMMIT; 
    END LOOP; 
end;
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Legal Tiago, é isso ai!! :D

demorou muito pra rodar o script??

[]'s
tiagonascimento
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Qua, 28 Nov 2007 9:14 pm
Localização: Belém - PA

Cristiano, demorou bastante. Com cinco milhões de registros, demorou 12 horas e meia pra fazer a consulta. Isso num Pentium 4 HT com 512 MB de memória. O nível de atividade do processador ficou em 100% o tempo todo, pensei que ia fundir o coitado do computador. Mas foi ótimo, aprendi um monte de coisas.
Valeu cara, fiquei feliz em usar o forum e saber que tem sempre alguém disposto a ajudar.

Um grande abraço!
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

você penso em criar um indice ??
pra testa se muda muita coisa em fazer uma consulta com ou sem o indice =D
se tiver mais 12 horas livre, cria o indice e faiz o select denovo =x
Responder
  • Informação
  • Quem está online

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