segunda-feira, 30 de maio de 2016

Utilizando Hint's para performance das query's.

Olá galera, Vamos ver alguns Hint's que podem nos ajudar em nossas consultas. Muitas pessoas não gostam de utilizar, outras utilizam sempre, mas sempre é bom analisar sua query pra saber se irá otimizar seu tempo de resposta ou piora-lo. Pois é preciso conhecer e analisar, o que será melhor para o Oracle.

Temos vários hint's, "sugestões" algumas já obsoletas, mas vários que podem nos ajudar... eles são declarados como comentários.

Como por exemplo o first_rows, já me ajudou, mas é preciso fazer consultas analisando sua query, também com explan para verificar como o Oracle se comporta, esse hint ele força o uso de índice, para otimizador um caminho que retorna a 1º linha ou a quantidade de linhas que escolher mais rapidamente.

Exemplo:
select /*+ first_rows (500) */ coluna_1, coluna_2 from tabela;


O hint /*+ full_rows (tabela) */ força um scan completo na tabela, custo do acesso do índice e dos registros pode ser maior do que simplesmente ler a tabela inteira. Este hint também pode causar resultados inesperados, como varrer a tabela interia em ordem diferente da ordem de acesso, se for uma tabela com centenas de dados, não é aconselhável.

Exemplo:
select /*+ full_rows (tabela_user) */ coluna_1, coluna_2 from tabela_user where rownum <= 10;



A partir do Oracle 11g, temos uma view com mais de 250 Hint's v$sql_hint, se fosse de todo mau, não existiria mais.

Existem vários outros HINT's, mas entenda, sempre é bom se aprofundar no conhecimento, pois não têm uma receita de bolo, e sim uma melhor prática para cada caso. Vlw galera, qualquer dúvida é só compartilhar.

Referências: https://community.oracle.com/welcome

sexta-feira, 12 de fevereiro de 2016

Como deletar registros duplicados no Oracle.

É muito comum termos esse tipo de problema em nossas tabelas, então segue uma uma query bem simples para apagar estes registros:

Select para localizar duplicados


  
    select campo,campo1,count(*) 
     from tabela having count(*) > 1 
    group by campo,campo1 





Como deletar duplicados


  
      delete from tab p1 
   where rowid < (select max(rowid) 
                    from tab1 p2 
                   where p1.primary_key = p2.primary_key); 





Qualquer dúvida é só comentar
ou enviar um e-mail. Abraços.

Aumentando o tamanho da TABLESPACE

E aí galera, tudo bem ? Bom vamos lá, muitos profissionais se deparam com problemas quando o tamanho da TABLESPACE esgota, aí na hora vira um furdunço, e não dá pra fazer mais nada, então para um profissional não ter problemas como este:

"ORA-01653: unable to extend table SUPER.CLI_PROCESSSOS by 128 in tablespace LEGAL_DATA" "ORA-06512: at line 4"

 É necessário que ele faça um monitoramento delas, pelo Enterprise Manager ou através das santas query's como essa:


  
 SELECT D.TABLESPACE_NAME "Nome",DF.FILE_NAME "Local do Arq", D.STATUS "Status",          
        TO_CHAR((A.BYTES / 1024 / 1024),'99,999,990.900')      "Tamanho (M)",
        TO_CHAR(((A.BYTES-DECODE(F.BYTES,NULL,0,F.BYTES))/1024/1024),'99,999,990.900') "Usado (M)"
  FROM SYS.DBA_TABLESPACES D
 INNER JOIN SYS.DBA_DATA_FILES DF  ON DF.TABLESPACE_NAME  = D.TABLESPACE_NAME
 INNER JOIN SYS.SM$TS_AVAIL A      ON A.TABLESPACE_NAME   = D.TABLESPACE_NAME
  FULL OUTER JOIN SYS.SM$TS_FREE F ON F.TABLESPACE_NAME   = D.TABLESPACE_NAME
 ORDER BY D.TABLESPACE_NAME; 



Com o retorno, você pode remanejar espaço entre elas, como por exemplo, tirar de uma e colocar em outra com o comando: Diminuindo a TABLESPACE SATIDAT1.DBF.


  
alter database datafile 'C:\ORACLEXE\ORADATA\XE\SSJR\SATIDAT1.DBF' resize 100M



Aumentando o tamanho da TABLESPACE SSJRDAT1.DBF.


  
alter database datafile 'C:\ORACLEXE\ORADATA\XE\SSJR\SSJRDAT1.DBF' resize 300M



Qualquer dúvida ou sugestão comentem, ou mandem e-mail, Abraços.