GARANTIR DESCONTO

Fórum Porque max() nao usa o Indice no PLAN ? #47817

30/10/2004

0

Executando um simples SQL para recuperar o próximo código de uma tabela:

select max(CODPRODUTO) as ULTCOD from PRODUTO


observei que o PLAN usado pelo FB1.5 é:
PLAN (PRODUTO NATURAL)


Sendo CODPRODUTO a Chave Primaria do arquivo, porque o Otmizador de Query não utiliza o Indice da Chave Primaria para agilizar a consulta ?

Fica lógico que o último registro usando o Indice da Chave Primaria será sempre o maior... Há como ´instruir´ o PLANo de consulta para usar o Indice da Chave Primária ?

Certamente essa instrução com o order em NATURAL ficará cada vez mais lenta quando o arquivo crescer...


Dopi

Dopi

Responder

Posts

01/11/2004

Afarias

pq um MAX precisa achar o maior VALOR e sendo assim um índice ASC não é de qualquer ajuda visto q se tem q ler até o final!

para otimizar consultas com MAX vc deve ter índices DESC! -- ai sim o otimizador vai usá-lo!


T+


Responder

Gostei + 0

01/11/2004

Dopi

Hummm... falou quem entende do assunto... ;-)

Obrigado Farias, vou experimentar mudar o indice...

Mas qual é a maneira mais comum para se recuperar o último código de uma chave primaria ? O uso do max() nesse caso é o correto ? Essa operação (buscar o próximo código) deve ser comum em aplicações C/S...


Responder

Gostei + 0

01/11/2004

Afarias

|Obrigado Farias, vou experimentar mudar o indice...

vc não precisa necessariamente mudar, pode apenas adicionar outro índice para o mesmo campo sendo DESC


|Mas qual é a maneira mais comum para se recuperar o último código de
|uma chave primaria ? O uso do max() nesse caso é o correto ? Essa
|operação (buscar o próximo código) deve ser comum em aplicações
|C/S...

Se vc apenas quer ver o último código MAX está perfeito. Se vc quer isso para poder incrementá-lo, então está indo no caminho errado -- códigos incrementais em C/S devem ser implementados com GENERATORS (no caso do IB/FB)


T+


Responder

Gostei + 0

01/11/2004

Dopi

A ideia é deixar o usuário modificar o Código sugerido caso ele assim deseje. Mas sempre sugerir o próximo código para facilitar a inclusão de novos registros.

O Generator me impediria de alterar o Código...

Estou fazendo um sistema que irá receber dados de sistemas anteriores... nesse caso pode ser que o usuário deseje manter os código antigos...


Responder

Gostei + 0

01/11/2004

Rodolpho123

Vc pode usar uma qry no seu aplicativo assim:
Select gen_id(o_seu_generator,0) from rdb$database

e quando for exibir ao usuário:
IBquery.Open;
Edit1.Text := IBQuery1GEN_ID.Value + 1;

Pois isto só irá te mostrar o próximo número do generator. Caso ele aceite, o FB/IB se emcaminha do resto...


Responder

Gostei + 0

01/11/2004

Afarias

|O Generator me impediria de alterar o Código...

na verdade não impediria. mas sempre iria incrementar.


T+


Responder

Gostei + 0

01/11/2004

Dopi

Realmente, usando um indice DESCENDING no campo Chave deu certo...

CREATE DESCENDING INDEX ´ULTCODPRODUTO´ ON ´PRODUTO´(´CODPRODUTO´);

Os Genarators iriam sempre somar 1 no valor, e iriam se perder quando o usuário modificasse o código para um valor maior que o do Genarator. Usando o indice ficou prático e rápido agora o comando:

select max(CODPRODUTO) as ULTCOD from PRODUTO

funciona rápido... Obrigado...


Responder

Gostei + 0

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

Aceitar