Fórum Problemas para usar indice em sql #49725
07/03/2005
0
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
Curtir tópico
+ 0Posts
07/03/2005
Fsflorencio
select clientes.nome
from clientes
where clientes.codigo not in (´1´,´2´,´3´)
plan( clientes index(nome_do_indice) )
Gostei + 0
07/03/2005
Larry
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.
Gostei + 0
08/03/2005
Fsflorencio
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.
Gostei + 0
08/03/2005
Afarias
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+
Gostei + 0
08/03/2005
Larry
select clientes.nome from clientes where not exists ( select 1 from vendas where data<=:d1 and codcli = clientes.codigo)
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.
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)