Porque max() nao usa o Indice no PLAN ?
Executando um simples SQL para recuperar o próximo código de uma tabela:
observei que o PLAN usado pelo FB1.5 é:
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...
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
Curtidas 0
Respostas
Afarias
30/10/2004
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+
para otimizar consultas com MAX vc deve ter índices DESC! -- ai sim o otimizador vai usá-lo!
T+
GOSTEI 0
Dopi
30/10/2004
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...
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
Afarias
30/10/2004
|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+
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
Dopi
30/10/2004
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...
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
Rodolpho123
30/10/2004
Vc pode usar uma qry no seu aplicativo assim:
e quando for exibir ao usuário:
Pois isto só irá te mostrar o próximo número do generator. Caso ele aceite, o FB/IB se emcaminha do resto...
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
Afarias
30/10/2004
|O Generator me impediria de alterar o Código...
na verdade não impediria. mas sempre iria incrementar.
T+
na verdade não impediria. mas sempre iria incrementar.
T+
GOSTEI 0
Dopi
30/10/2004
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...
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