Sim, as estatísticas são atualizadas automaticamente 1 vez por dia (se tiver alteração de registros, claro), só não respondi ainda porque não estudei como ver o tipo de estatística (chiappa me pediu isso).
Em 4 de fevereiro de 2014 19:01, Milton Bastos Henriquis Jr. < miltonbas...@gmail.com> escreveu: > > > Vc está pelo menos com estatísticas atualizadas? > Quando vejo algum tipo de lentidão, é a primeira coisa que verifico. > > > > > Em 4 de fevereiro de 2014 14:23, Yuri Menon <yuri.me...@gmail.com>escreveu: > > >> >> Chiappa, terei de fazer todo um estudo para responder seus >> questionamentos (tendo em vista que nunca ouvi falar nem de E-ROW, por >> exemplo), mas responderei, ok? >> >> Milton, de imediato você sabe me responder se é possível reduzir o tempo >> dessa consulta utilizando algum procedimento no qual eu não precise alterar >> a estrutura da consulta SQL? Ou você precisa que eu responda primeiro as >> perguntas do chiappa? obs: não tenho acesso a programação da ferramenta >> entende? Por isso, se me pedirem para eu colocar um HINT no meio dessa SQL >> não vai ser possível, já se pedirem para eu criar um índice, vai ser >> tranquilo porque acesso ao banco eu tenho. >> >> >> Em 4 de fevereiro de 2014 13:31, Milton Bastos Henriquis Jr. < >> miltonbas...@gmail.com> escreveu: >> >> >>> >>> Como eu imaginava! Por isso lá no meu primeiro e-mail eu perguntei >>> quantos registros tinha no total dessa tabela. >>> >>> Vc tá retornando 12858 registros, num universo de 71933. É uma >>> porcentagem muito alta. >>> Não vale a pena usar índice, por isso o Oracle está fazendo full scan. >>> >>> Mas por que ele usa índice quando pede só essa coluna? >>> Porque os próprios valores que vc quer já estão no índice - e daí fica >>> muito menos custoso consultar apenas a estrutura de índice, pois nela já >>> contém todos os valores que vc quer. >>> >>> >>> Em 4 de fevereiro de 2014 11:28, Yuri Menon <yuri.me...@gmail.com>escreveu: >>> >>> >>>> >>>> Banco: >>>> Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit >>>> Production >>>> PL/SQL Release 11.2.0.3.0 - Production >>>> >>>> CORE 11.2.0.3.0 Production >>>> >>>> TNS for 64-bit Windows: Version 11.2.0.3.0 - Production >>>> >>>> NLSRTL Version 11.2.0.3.0 - Production >>>> >>>> >>>> Fábio Prado, explain plan do SELECT * FROM TMOV WHERE CODCXA = '401609' >>>> >>>> >>>> Plan hash value: 235420782 >>>> >>>> >>>> -------------------------------------------------------------------------- >>>> >>>> | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time >>>> | >>>> -------------------------------------------------------------------------- >>>> >>>> >>>> | 0 | SELECT STATEMENT | | 12936 | 4737K| 1377 (1)| >>>> 00:00:17 | >>>> >>>> >>>> |* 1 | TABLE ACCESS FULL| TMOV | 12936 | 4737K| 1377 (1)| >>>> 00:00:17 | >>>> -------------------------------------------------------------------------- >>>> >>>> >>>> Explain Plan do SELECT CODCXA FROM TMOV WHERE CODCXA = '401609': >>>> >>>> Plan hash value: 3125576660 >>>> >>>> ------------------------------------------------------------------------------------ >>>> >>>> | Id | Operation | Name | Rows | Bytes | Cost >>>> (%CPU)| Time | >>>> ------------------------------------------------------------------------------------ >>>> | 0 | SELECT STATEMENT | >>>> | 12936 | 90552 | 34 (0)| 00:00:01 | >>>> |* 1 | INDEX RANGE SCAN| IDX_TMOV_CODCXA | 12936 | 90552 | 34 >>>> (0)| 00:00:01 | >>>> >>>> ------------------------------------------------------------------------------------ >>>> >>>> >>>> Outras consultas: >>>> SQL>SELECT COUNT(1) FROM TMOV >>>> 71933 >>>> >>>> SQL>SELECT COUNT(1) FROM TMOV WHERE CODCXA = '401609' >>>> 12858 >>>> >>>> SQL>SELECT DISTINCT CODCXA FROM TMOV >>>> 44 resultados >>>> >>>> >>>> >>>> Muito obrigado >>>> pessoal, estou lendo e compreendendo (o que é mais importante, claro) todas >>>> as respostas. >>>> >>>> >>>> >>>> Em 3 de fevereiro de 2014 22:54, <jlchia...@yahoo.com.br> escreveu: >>>> >>>> >>>>> >>>>> Colega, tudo jóia ? Sim, ainda estou vivo , e de vez em quando ainda >>>>> passo por aqui :) >>>>> >>>>> Sobre as suas perguntas , seguinte : NÃO, não é verdade que >>>>> Obrigatoriamente um SELECT * "força" um full-table scan, e para a idéia de >>>>> que seria preciso indexar todas as colunas para que um SELECT * usar >>>>> índice, a resposta é : bullshit, bobeira, absurdo, ridículo, siiim ?? >>>>> Aliàs, antes de demonstrar, vamos pensar juntos : um índice ** não >>>>> ** acelera uma consulta por magia de unicórnio ou pó de pirlimpimpim : >>>>> entre outras coisas (como a questão de organização interna que permite >>>>> busca por 'poda' de valores), o fato é que um índice simplesmente é uma >>>>> "tabela reduzida", que tem só as colunas-chave e o rowid de cada linha, >>>>> assim é por isso que uma busca no índice é mais rápida, o índice é >>>>> MUITÍSSIMO MENOR, né ?? Vc não acha que se vc criar um índice com TODAS as >>>>> colunas da tabela, vc não acaba tendo uma estrutura de tamanho + ou - >>>>> similar à da tabela ??? Que vantagem Maria leva ???? >>>>> >>>>> Segundo ponto : o RDBMS Oracle (ao menos desde a versão 8i, mas >>>>> principalmente a partir do 9i) largou mão de otimização RBO e adotou a >>>>> CBO, >>>>> ie : ele ** não ** adivinha, ** não ** usa "regras" para decidir se usa ou >>>>> não o índice, se é mais vantajoso ler a tabela de uma vez ou se é melhor >>>>> ler o índice : ele usa as ESTATÍSTICAS que indicam quantos registros serão >>>>> retornadas ao se filtrar por cada coluna COM o valor indicado no WHERE, >>>>> okdoc ?? >>>>> ENTÃO, necessariamente se o seu índice não está sendo usado, MUITO >>>>> RPOVAVELMENTE o valor que vc informou retorna uma grande qtdade de linhas >>>>> e >>>>> então compensa mais partir pro FTS, ** OU ** as estatísticas não registram >>>>> a distribuição de dados corretas.... >>>>> >>>>> A minha demonstração (num banco 10.2.0.5 EE no caso) : >>>>> >>>>> => crio a tabela e preencho com dados : >>>>> >>>>> SQL> set lines 200 pages 50000 >>>>> >>>>> SQL> create table TAB_TESTE as (select * from dba_objects where 1=2); >>>>> >>>>> Tabela criada. >>>>> >>>>> SQL> alter table TAB_TESTE parallel 4; >>>>> >>>>> SQL> insert /*+ APPEND */ into TAB_TESTE (select * from dba_objects); >>>>> >>>>> 51496 linhas criadas. >>>>> >>>>> SQL> commit; >>>>> >>>>> Commit concluido. >>>>> >>>>> SQL> insert /*+ APPEND */ into TAB_TESTE (select * from dba_objects); >>>>> >>>>> 51496 linhas criadas. >>>>> >>>>> SQL> commit; >>>>> >>>>> Commit concluido. >>>>> >>>>> >>>>> ==> okdoc , vamos ter na coluna indexada um valor RARO, que traz >>>>> POUQUÍSSIMAS linhas, e assim vale a pena ser recuperado por índice : >>>>> >>>>> >>>>> SQL> insert into TAB_TESTE (owner) values('CHIAPPA'); >>>>> >>>>> 1 linha criada. >>>>> >>>>> >>>>> SQL> commit >>>>> 2 ; >>>>> >>>>> Commit concluido. >>>>> >>>>> => crio o índice : >>>>> >>>>> SQL> create index IDX_TESTE_OWNER on TAB_TESTE(owner); >>>>> >>>>> Indice criado. >>>>> >>>>> ====> Óia isso : select * usando o índice : >>>>> >>>>> SQL> set autotrace on >>>>> SQL> select * from TAB_TESTE where owner='CHIAPPA'; >>>>> >>>>> OWNER >>>>> ------------------------------ >>>>> OBJECT_NAME >>>>> >>>>> -------------------------------------------------------------------------------- >>>>> SUBOBJECT_NAME OBJECT_ID DATA_OBJECT_ID OBJECT_TYPE >>>>> ------------------------------ ---------- -------------- >>>>> ------------------- >>>>> CREATED LAST_DDL TIMESTAMP STATUS T G S >>>>> -------- -------- ------------------- ------- - - - >>>>> CHIAPPA >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> >>>>> Plano de Execuc?o >>>>> ---------------------------------------------------------- >>>>> Plan hash value: 1974746346 >>>>> >>>>> >>>>> -------------------------------------------------------------------------------- >>>>> --------------- >>>>> >>>>> | Id | Operation | Name | Rows | Bytes >>>>> | Cost (%C >>>>> PU)| Time | >>>>> >>>>> >>>>> -------------------------------------------------------------------------------- >>>>> --------------- >>>>> >>>>> | 0 | SELECT STATEMENT | | 1 | 177 >>>>> | 2 >>>>> (0)| 00:00:01 | >>>>> >>>>> | 1 | TABLE ACCESS BY INDEX ROWID| TAB_TESTE | 1 | 177 >>>>> | 2 >>>>> (0)| 00:00:01 | >>>>> >>>>> |* 2 | INDEX RANGE SCAN | IDX_TESTE_OWNER | 1 | >>>>> | 1 >>>>> (0)| 00:00:01 | >>>>> >>>>> >>>>> -------------------------------------------------------------------------------- >>>>> --------------- >>>>> >>>>> >>>>> Predicate Information (identified by operation id): >>>>> --------------------------------------------------- >>>>> >>>>> 2 - access("OWNER"='CHIAPPA') >>>>> >>>>> Note >>>>> ----- >>>>> - dynamic sampling used for this statement >>>>> >>>>> >>>>> Estatistica >>>>> ---------------------------------------------------------- >>>>> 9 recursive calls >>>>> 0 db block gets >>>>> 74 consistent gets >>>>> 1 physical reads >>>>> 0 redo size >>>>> 1354 bytes sent via SQL*Net to client >>>>> 492 bytes received via SQL*Net from client >>>>> 2 SQL*Net roundtrips to/from client >>>>> 0 sorts (memory) >>>>> 0 sorts (disk) >>>>> 1 rows processed >>>>> >>>>> ==> agora a contra-prova : um valor do índice que SEI que é repetido >>>>> milhares de vezes : >>>>> >>>>> SQL> select * from TAB_TESTE where owner='SYS'; >>>>> >>>>> ..... >>>>> >>>>> SYS >>>>> /a7359489_XDBServletContainer >>>>> 38589 JAVA CLASS >>>>> 08/07/13 08/07/13 2013-07-08:17:21:51 VALID N N N >>>>> >>>>> SYS >>>>> oracle/xdb/spi/XDBResource >>>>> 38590 JAVA CLASS >>>>> 08/07/13 08/07/13 2013-07-08:17:21:51 VALID N N N >>>>> >>>>> SYS >>>>> oracle/xdb/spi/Resource >>>>> 38591 JAVA CLASS >>>>> 08/07/13 08/07/13 2013-07-08:17:21:51 VALID N N N >>>>> >>>>> SYS >>>>> /734d62fb_XDBContextFactory >>>>> 38592 JAVA CLASS >>>>> 08/07/13 08/07/13 2013-07-08:17:21:51 VALID N N N >>>>> >>>>> SYS >>>>> /827b8b61_XDBResourceContext >>>>> 38593 JAVA CLASS >>>>> 08/07/13 08/07/13 2013-07-08:17:21:51 VALID N N N >>>>> >>>>> SYS >>>>> oracle/xdb/spi/XDBNameParser >>>>> 38594 JAVA CLASS >>>>> 08/07/13 08/07/13 2013-07-08:17:21:51 VALID N N N >>>>> >>>>> SYS >>>>> /8d00b602_XDBNamingEnumeration >>>>> 38595 JAVA CLASS >>>>> 08/07/13 08/07/13 2013-07-08:17:21:51 VALID N N N >>>>> >>>>> >>>>> 45920 linhas selecionadas. >>>>> >>>>> >>>>> Plano de Execuc?o >>>>> ---------------------------------------------------------- >>>>> Plan hash value: 3685423756 >>>>> >>>>> >>>>> -------------------------------------------------------------------------------- >>>>> ------------------------------- >>>>> >>>>> | Id | Operation | Name | Rows | Bytes | Cost >>>>> (%CPU)| Time >>>>> | TQ |IN-OUT| PQ Distrib | >>>>> >>>>> >>>>> -------------------------------------------------------------------------------- >>>>> ------------------------------- >>>>> >>>>> | 0 | SELECT STATEMENT | | 35537 | 6142K| 87 >>>>> (0)| 00:00:02 >>>>> | | | | >>>>> >>>>> | 1 | PX COORDINATOR | | | | | >>>>> | | | | >>>>> >>>>> | 2 | PX SEND QC (RANDOM)| :TQ10000 | 35537 | 6142K| 87 >>>>> (0)| 00:00:02 >>>>> | Q1,00 | P->S | QC (RAND) | >>>>> >>>>> | 3 | PX BLOCK ITERATOR | | 35537 | 6142K| 87 >>>>> (0)| 00:00:02 >>>>> | Q1,00 | PCWC | | >>>>> >>>>> |* 4 | TABLE ACCESS FULL| TAB_TESTE | 35537 | 6142K| 87 >>>>> (0)| 00:00:02 >>>>> | Q1,00 | PCWP | | >>>>> >>>>> >>>>> -------------------------------------------------------------------------------- >>>>> ------------------------------- >>>>> >>>>> >>>>> Predicate Information (identified by operation id): >>>>> --------------------------------------------------- >>>>> >>>>> 4 - filter("OWNER"='SYS') >>>>> >>>>> Note >>>>> ----- >>>>> - dynamic sampling used for this statement >>>>> >>>>> >>>>> Estatistica >>>>> ---------------------------------------------------------- >>>>> 33 recursive calls >>>>> 0 db block gets >>>>> 1759 consistent gets >>>>> 6 physical reads >>>>> 708 redo size >>>>> 2352373 bytes sent via SQL*Net to client >>>>> 34163 bytes received via SQL*Net from client >>>>> 3063 SQL*Net roundtrips to/from client >>>>> 1 sorts (memory) >>>>> 0 sorts (disk) >>>>> 45920 rows processed >>>>> >>>>> SQL> >>>>> >>>>> Tá-ráhhh : sacou o lance ?? NO exemplo acima, o CBO estava com as >>>>> informações corretas, então ele FEZ a coisa certa nos dois casos , sim ?? >>>>> Veja aí no SEU caso a qualidade da estimativa feita pelas >>>>> estatísticas, esse é o primeiro passo QUASE SEMPRE, ok ? Pra isso : >>>>> >>>>> - PERGUNTE pra quem saiba qual é a distribuição de dados esperada >>>>> para o valor em questão >>>>> - COMPARE essa informação com a estimativa do CBO : >>>>> https://blogs.oracle.com/optimizer/entry/how_do_i_know_if mostra uma >>>>> opção Fácil para isso, via Plano de Execução extendido.... >>>>> >>>>> []s >>>>> >>>>> Chiappa >>>>> >>>>> >>>> >>> >> > >