GARANTIR DESCONTO

Fórum Problemas para usar indice em sql #49725

07/03/2005

0

Oi,

To com o seguinte problema:

Nesta consula:
select clientes.nome
from clientes
where clientes.codigo in (´1´,´2´,´3´)

o indice do codigo é usado e aparece no plan analyser do ibexpert com apenas 3 leituras.

Ja nesta consulta:
select clientes.nome
from clientes
where clientes.codigo not in (´1´,´2´,´3´)

Ou nesta (que é oque preciso):
select clientes.nome
from clientes
where clientes.codigo not in (select codcli from vendas where data<=:d1 group by codcli)

o indice do codigo na tabela clientes não é usado (plan natural) e o numero de leituras é igual a quantidade de clientes cadastrados.

Tem como melhorar issso?


Larry

Larry

Responder

Posts

07/03/2005

Fsflorencio

Se vc informar o plano talvez fique mais rápido ex:

select clientes.nome
from clientes
where clientes.codigo not in (´1´,´2´,´3´)
plan( clientes index(nome_do_indice) )


Responder

Gostei + 0

07/03/2005

Larry

Se vc informar o plano talvez fique mais rápido ex: select clientes.nome from clientes where clientes.codigo not in (´1´,´2´,´3´) plan( clientes index(nome_do_indice) )


Se eu usar:
where clientes.codigo in (´1´,´2´,´3´)
o plano fica:
PLAN (CLIENTES INDEX (RDB$PRIMARY11,RDB$PRIMARY11))

Porem, se eu usar:
where clientes.codigo in (´1´,´2´,´3´)
PLAN (CLIENTES INDEX (RDB$PRIMARY11,RDB$PRIMARY11))
Executa com succeso.

Mas, se eu usar:
where clientes.codigo NOT in (´1´,´2´,´3´)
PLAN (CLIENTES INDEX (RDB$PRIMARY11,RDB$PRIMARY11))
Dao o seguinte erro:
index cannot be used in the specified plan
.
index RDB$PRIMARY11 cannot be used in the specified plan.


Larry.


Responder

Gostei + 0

08/03/2005

Fsflorencio

Estranho, né?

Fiz um teste em uma tabela semelhante e ele exige plan NATURAL, e não aceita nenhum índice para isto.

Naum entendí pq ele está usando duas vezes o índice RDB$PRIMARY11.

Vc está usando qual banco de dados e qual versão? Uso Firebird 1.5.


Responder

Gostei + 0

08/03/2005

Afarias

|Estranho, né?

Não é estraho é *normal*

Veja, qual o valor de um índice quando NÃO se quer alguns valores?? Claro q o banco *sempre* terá de ler todos os registros para perguntar se aquele valor não é o q não se deseja.

Índices são usados para ir a um registro *conhecido*, não tem como ir até um *desconhecido*.


SQL é como a [i:c620d7cb60]comunicação[/i:c620d7cb60], vc tem a resposta de acordo com a pergunta. Neste caso, o q fazemos é mudar (melhorar) a ´pergunta´, por exemplo:


select clientes.nome 
from clientes 
where not exists (
  select 1 from vendas where data<=:d1 and codcli = clientes.codigo) 


tendo em vendas índices em Data e CodCli, esta consulta é *muito* eficiente, fazendo basicamente 1 leitura (em vendas) para cada cliente.


T+


Responder

Gostei + 0

08/03/2005

Larry

|Estranho, né? Não é estraho é *normal* Veja, qual o valor de um índice quando NÃO se quer alguns valores?? Claro q o banco *sempre* terá de ler todos os registros para perguntar se aquele valor não é o q não se deseja. Índices são usados para ir a um registro *conhecido*, não tem como ir até um *desconhecido*. SQL é como a [i:c194f26ab1]comunicação[/i:c194f26ab1], vc tem a resposta de acordo com a pergunta. Neste caso, o q fazemos é mudar (melhorar) a ´pergunta´, por exemplo:
select clientes.nome 
from clientes 
where not exists (
  select 1 from vendas where data<=:d1 and codcli = clientes.codigo) 
tendo em vendas índices em Data e CodCli, esta consulta é *muito* eficiente, fazendo basicamente 1 leitura (em vendas) para cada cliente. T+


Oi,

Valeu pela explicação e realmente faz sentido o NOT não usar indice.
Esta consulta que voce enviou realmente é mais rapida, fazendo muito menos leituras na tabela de vendas.
Ficou show!

Obrigado.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar