- Este tópico contém 3 respostas, 3 vozes e foi atualizado pela última vez 14 anos, 10 meses atrás por
Anônimo.
-
AutorPosts
-
7 de maio de 2011 às 12:46 am #99107
Anônimo
Senhores,
estou com uma tremenda dúvida. Estou precisando fazer uma query em uma tabela que tem 13 milhões de registros mas estou me deparando com um problema. É uma query simples :SELECT ST.C FROM TABLE_ABC ST
WHERE ST.A IS NOT NULL
AND LENGTH(ST.B) = 11Observações:
A coluna A é um índíce no qual a pessoa que criou isso permitiu os valores nulos no índice, ou seja, 70% dos valores são nulos
A coluna B e C também são índices. Sendo que o índice C é único.Estou procurando usar o índice da coluna A .
Alguém tem alguma dica em um caso desses ?
Obrigado e abraços!!
7 de maio de 2011 às 2:22 am #99108burga
ParticipantePra que usar o índice? A performance da consulta está tão ruim assim? Se usar o índice ela pode piorar, e muito provavelmente vai piorar.
Usar um índice pra retornar 30% de registros de uma tabela não parece ser uma boa idéia, o normal é quando se espera menos de 10% do total de registros da tabela.
Mas se ainda assim quiser testar, utilize hints pra tentar forçar o uso do índice. Algo como:
SELECT /*+ index(ST NOME_DO_INDICE) */ ST.C
FROM TABLE_ABC ST
WHERE ST.A IS NOT NULL
AND LENGTH(ST.B) = 11Quanto aos outros índices, não interessa se eles existem pois:
1. o índice de B não será usado de qualquer forma pois você está usando a coluna em uma função;
2. o índice de C também não será usado pois não existe condição na consulta pra essa coluna.Tente estudar a diferença entre o FULL TABLE SCAN e a utilização de INDICES em consultas. Nem sempre usar um vai fazer a performance da consulta melhorar…
8 de maio de 2011 às 4:06 am #99110CleitonHanzen
ParticipanteComo sempre o Burga com precisão cirúrgica nos seus comentários….hehehe
A metodologia que sigo é até menor, se for retornar mais que 20% dos registros da tabela, já vale a pena fazer FTS, caso contrário a utilização de um índice realmente torna o resultado mais rápido.
Agora, uma pergunta que sempre faço para os desenvolvedores: Pq cargas d’agua vc quer retornar tantos registros??? DÚVIDO que em algum relatório ou sistema, retornar mais de 10 mil registros seja algo que sirva pra análise de alguma coisa (estou desconsiderando as regras de negócio aqui, mas nunca vi uma exigência dessas)…..
Outro detalhe que vale a pena salientar, desde o Oracle 10g, o otimizador leva em consideração utilizar as colunas do “meio” de um índice, fazendo o acesso que chamamos de Index Skip Scan, então não necessariamente existe a necessidade de criar um índice específico para cada coluna…. 😉
9 de maio de 2011 às 4:43 pm #99114Anônimo
Meu caro, infelizmente aqui na empresa ainda estamos penando no Oracle 9i com compatible do 8. Acredita?
Então, minha finalidade é buscar um erro que ocorreu em produção. Não será para relatório.
Na sexta-feira forcei o uso do índice essa query demorou 26 minutos em Pré produção.
Vou tentar fazer por FTS.Obrigado pela ajuda de vocês.
Abraços
[quote=”CleitonHanzen”:2na5vwwv]Como sempre o Burga com precisão cirúrgica nos seus comentários….hehehe
A metodologia que sigo é até menor, se for retornar mais que 20% dos registros da tabela, já vale a pena fazer FTS, caso contrário a utilização de um índice realmente torna o resultado mais rápido.
Agora, uma pergunta que sempre faço para os desenvolvedores: Pq cargas d’agua vc quer retornar tantos registros??? DÚVIDO que em algum relatório ou sistema, retornar mais de 10 mil registros seja algo que sirva pra análise de alguma coisa (estou desconsiderando as regras de negócio aqui, mas nunca vi uma exigência dessas)…..
Outro detalhe que vale a pena salientar, desde o Oracle 10g, o otimizador leva em consideração utilizar as colunas do “meio” de um índice, fazendo o acesso que chamamos de Index Skip Scan, então não necessariamente existe a necessidade de criar um índice específico para cada coluna…. 😉 [/quote]
-
AutorPosts
- Você deve fazer login para responder a este tópico.