Fórum Porque max() nao usa o Indice no PLAN ? #47817
30/10/2004
0
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
Curtir tópico
+ 0Posts
01/11/2004
Afarias
para otimizar consultas com MAX vc deve ter índices DESC! -- ai sim o otimizador vai usá-lo!
T+
Gostei + 0
01/11/2004
Dopi
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...
Gostei + 0
01/11/2004
Afarias
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+
Gostei + 0
01/11/2004
Dopi
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...
Gostei + 0
01/11/2004
Rodolpho123
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...
Gostei + 0
01/11/2004
Afarias
na verdade não impediria. mas sempre iria incrementar.
T+
Gostei + 0
01/11/2004
Dopi
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...
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)