Blz ? Então, a primeira explicação que me vêm à mente é baseada no ** FATO ** 
de que, ao contrário do que os novatos pensam, ** NEM SEMPRE ** o acesso via 
índice é melhor / mais rápido / mais performático para TODOS os casos 
(https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:6749454952894
 tem um caso Clássico disso), E ao colocar um HINT vc ** ENGESSA **, vc ** 
FORÇA ** o CBO a usar o índice se possível, INDEPENDENTE de isso ser Bom ou 
Ruim... A minha Suposição é que nessa tabela com esse índice forçado o COUNT(*) 
é obrigado a ler todos (ou quase todos) os blocos do Índice (o que não acontece 
com o SQL SEM o COUNT), e devido ao FATO de que essa leitura é feita 
bloco-a-bloco, seria muito mais performático se obter os blocos todos de uma 
vez via FULL TABLE SCAN, cujo I/O é MULTIBLOCK, lendo Múltiplos Blocos de uma 
tacada só.... Essa diferença de performance entre ler uma larga porção de 
blocos via index (em single-block) VERSUS se ler essa mesma larga porção de 
blocos via TABLE SCAN (em multiblock) é o que estava por trás da diferença de 
performance no caso que indiquei e Suponho que é o que está por trás da sua 
situação, também : para PROVAR ou DESPROVAR, faça um trace+tkprof de uma sessão 
fazendo COUNT com o tal hint, de uma outra fazendo o mesmo COUNT ** sem ** o 
HINT e veja o que vc vai ver....
 
 Não é o que vc perguntou mas ** tenho ** que dizer, também : se as minhas 
suposições de que a coluna DTA_EXTRACAO é do tipo DATE ** E ** que há índice 
considerando essa coluna estão corretas, esse SQL apresenta uma ** Péssima 
Qualidade **, ele faz a proeza de numa só vez ele violar pelo menos DUAS best 
practices : ele permite CONVERSÂO IMPLÍCITA, ao comparar a string '03-aug-2016' 
com a coluna do tipo DATE dta_extracao, ** e ** como cereja do bolo ao mesmo 
tempo ele Também mete uma função na coluna indexada - AMBAS as caquinhas podem 
fazer um índice não ser usado/levado em conta, imagino que foi daí que veio o 
HINT, inclusive - aquela historinha, ao invés de consertar o SQL lixento neguim 
sai metendo HINTs... 
 
 SE for isso mesmo, a correção desse SQL é simples :

 SELECT COUNT(*)
  from stg_catalogo_status v 
 WHERE v.dta_extracao = between TO_DATE('03/08/2016 00:00:00', 'dd/mm/yyyy 
hh24:mi:ss')
                            and TO_DATE('03/08/2016 23:59:59', 'dd/mm/yyyy 
hh24:mi:ss');
                            
==> Essas simples alterações tanto eliminam a necessidade de função na coluna 
indexada(a TRUNC no caso, que suponho estava aqui para 'eliminar' a porção HORA 
da coluna DATE), quanto Também permite comparação de coluna DATE com valores 
DATE, yep ??

 []s
 
   Chiappa
  • [oracle... cristianojsan...@yahoo.com.br [oracle_br]
    • Re... Emerson dos Santos Gaudêncio emerson.fen...@gmail.com [oracle_br]
    • [o... jlchia...@yahoo.com.br [oracle_br]
      • ... jlchia...@yahoo.com.br [oracle_br]

Responder a