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
>>>>
>>>>
>>>
>>
>  
>

Responder a