OTIMIZAR APLICACAO
Pessoal,
Tenho uma aplicação que abre uma view de um banco de dados, esse processo de abertura da view demora 18 segundos e toda vez que é feita alguma alteração em uma das tabelas do banco de dados preciso abrir o recordset novamente pra que as alterações tenham efeito e toda vez que mando abrir o recordset é preciso esperar 18 segundos e essa demora tem dificultado a aceitação da aplicação.
Alguém poderia me dar alguma sugestão de como otimizar essa aplicação?
Obrigada
Ana
Tenho uma aplicação que abre uma view de um banco de dados, esse processo de abertura da view demora 18 segundos e toda vez que é feita alguma alteração em uma das tabelas do banco de dados preciso abrir o recordset novamente pra que as alterações tenham efeito e toda vez que mando abrir o recordset é preciso esperar 18 segundos e essa demora tem dificultado a aceitação da aplicação.
Alguém poderia me dar alguma sugestão de como otimizar essa aplicação?
Obrigada
Ana
coloque a view ai pra gente ver
Essa é a view:
SELECT a.id_card, a.num_revisao AS revisao, a.dsc_folha AS folha, a.dsc_path, a.extensao, a.bloqueado, a.titulo, a.dsc_numerador AS numero, b.elaborador_cartao AS elaborador, c.verificador_cartao AS verificador, d.aprovador_cartao AS aprovador, e.categoria, e.path_principal, f.status, g.centrocusto, h.valor AS "of", a.dat_ctr_inclusao AS data_inclusao
FROM cartao a
JOIN elaborador_cartao b ON a.id_elaborador_cartao = b.id
JOIN verificador_cartao c ON a.id_verificador_cartao = c.id
JOIN aprovador_cartao d ON a.id_aprovador_cartao = d.id
JOIN categoria e ON a.id_categoria = e.id
JOIN status f ON a.id_status = f.id
JOIN centrocusto g ON a.id_centrocusto = g.id
LEFT JOIN campo_categoria j ON j.id_categoria = e.id
LEFT JOIN campo_categoria_of h ON a.id_card = h.id_cartao AND h.id_campo_categoria = j.id
SELECT a.id_card, a.num_revisao AS revisao, a.dsc_folha AS folha, a.dsc_path, a.extensao, a.bloqueado, a.titulo, a.dsc_numerador AS numero, b.elaborador_cartao AS elaborador, c.verificador_cartao AS verificador, d.aprovador_cartao AS aprovador, e.categoria, e.path_principal, f.status, g.centrocusto, h.valor AS "of", a.dat_ctr_inclusao AS data_inclusao
FROM cartao a
JOIN elaborador_cartao b ON a.id_elaborador_cartao = b.id
JOIN verificador_cartao c ON a.id_verificador_cartao = c.id
JOIN aprovador_cartao d ON a.id_aprovador_cartao = d.id
JOIN categoria e ON a.id_categoria = e.id
JOIN status f ON a.id_status = f.id
JOIN centrocusto g ON a.id_centrocusto = g.id
LEFT JOIN campo_categoria j ON j.id_categoria = e.id
LEFT JOIN campo_categoria_of h ON a.id_card = h.id_cartao AND h.id_campo_categoria = j.id
Altere os joins por Where, pois o join é mais lento que o where, isso já deve melhorar um pouco a perfomance, no caso los left joins não há como mudar.
Outra coisa você está povoando um grid com os dados certo? Então na hora de povoar, desative a propriedade .Redraw = False no inÃÂÂcio e .Redraw = True no final do carregamento, isso irá acelerar muito a velocidade. Essa propriedade é para MSFlexGrid, se usar outro tem que ver qual é a correspondente.
Depois que fiz isso, minhas consultas com 1000 registros carregam em 3 segundos. Para melhorar eu coloco uma ProgressBar para ajudar o usuário a saber o que ocorre.
Depois que fiz isso, minhas consultas com 1000 registros carregam em 3 segundos. Para melhorar eu coloco uma ProgressBar para ajudar o usuário a saber o que ocorre.
Seguindo a sugestão do Sr. Marcos tentei alterar a instrução trocando o join por where onde é possÃÂÂvel, mas dá erro informando q há um registro na tabela categoria que não é referenciado pela estrutura montada!
passe o código de como vc fez as mudanças...
Fiz a alteração de join para where:
SELECT a.id_card, a.num_revisao AS revisao, a.dsc_folha AS folha, a.dsc_path, a.extensao, a.bloqueado, a.titulo, a.dsc_numerador AS numero, b.elaborador_cartao AS elaborador, c.verificador_cartao AS verificador, d.aprovador_cartao AS aprovador, e.categoria, e.path_principal, f.status, g.centrocusto, h.valor AS "of", a.dat_ctr_inclusao AS data_inclusao
FROM cartao a, elaborador_cartao b, verificador_cartao c, aprovador_cartao d, categoria e, status f, centrocusto g
LEFT JOIN campo_categoria j ON j.id_categoria = e.id
LEFT JOIN campo_categoria_of h ON a.id_card = h.id_cartao AND h.id_campo_categoria = j.id
WHERE a.id_elaborador_cartao = b.id
AND a.id_verificador_cartao = c.id
AND a.id_aprovador_cartao = d.id
AND a.id_categoria = e.id
AND a.id_status = f.id
AND a.id_centrocusto = g.id
O erro é apontado onde está em negrito
There is an entry for table "e", but it cannot be referenced from this part of the query
SELECT a.id_card, a.num_revisao AS revisao, a.dsc_folha AS folha, a.dsc_path, a.extensao, a.bloqueado, a.titulo, a.dsc_numerador AS numero, b.elaborador_cartao AS elaborador, c.verificador_cartao AS verificador, d.aprovador_cartao AS aprovador, e.categoria, e.path_principal, f.status, g.centrocusto, h.valor AS "of", a.dat_ctr_inclusao AS data_inclusao
FROM cartao a, elaborador_cartao b, verificador_cartao c, aprovador_cartao d, categoria e, status f, centrocusto g
LEFT JOIN campo_categoria j ON j.id_categoria = e.id
LEFT JOIN campo_categoria_of h ON a.id_card = h.id_cartao AND h.id_campo_categoria = j.id
WHERE a.id_elaborador_cartao = b.id
AND a.id_verificador_cartao = c.id
AND a.id_aprovador_cartao = d.id
AND a.id_categoria = e.id
AND a.id_status = f.id
AND a.id_centrocusto = g.id
O erro é apontado onde está em negrito
There is an entry for table "e", but it cannot be referenced from this part of the query
Fiz a alteração de join para where:
SELECT a.id_card, a.num_revisao AS revisao, a.dsc_folha AS folha, a.dsc_path, a.extensao, a.bloqueado, a.titulo, a.dsc_numerador AS numero, b.elaborador_cartao AS elaborador, c.verificador_cartao AS verificador, d.aprovador_cartao AS aprovador, e.categoria, e.path_principal, f.status, g.centrocusto, h.valor AS "of", a.dat_ctr_inclusao AS data_inclusao
FROM cartao a, elaborador_cartao b, verificador_cartao c, aprovador_cartao d, status f, centrocusto g, categoria e,
LEFT JOIN campo_categoria j ON j.id_categoria = e.id
LEFT JOIN campo_categoria_of h ON a.id_card = h.id_cartao AND h.id_campo_categoria = j.id
WHERE a.id_elaborador_cartao = b.id
AND a.id_verificador_cartao = c.id
AND a.id_aprovador_cartao = d.id
AND a.id_categoria = e.id
AND a.id_status = f.id
AND a.id_centrocusto = g.id
Tenta desta maneira e veja se funciona.
SELECT a.id_card, a.num_revisao AS revisao, a.dsc_folha AS folha, a.dsc_path, a.extensao, a.bloqueado, a.titulo, a.dsc_numerador AS numero, b.elaborador_cartao AS elaborador, c.verificador_cartao AS verificador, d.aprovador_cartao AS aprovador, e.categoria, e.path_principal, f.status, g.centrocusto, h.valor AS "of", a.dat_ctr_inclusao AS data_inclusao
FROM cartao a, elaborador_cartao b, verificador_cartao c, aprovador_cartao d, status f, centrocusto g, categoria e,
LEFT JOIN campo_categoria j ON j.id_categoria = e.id
LEFT JOIN campo_categoria_of h ON a.id_card = h.id_cartao AND h.id_campo_categoria = j.id
WHERE a.id_elaborador_cartao = b.id
AND a.id_verificador_cartao = c.id
AND a.id_aprovador_cartao = d.id
AND a.id_categoria = e.id
AND a.id_status = f.id
AND a.id_centrocusto = g.id
Tenta desta maneira e veja se funciona.
Marcos,
Tentei executar a instrução conforme vc alterou e ocorre o seguinte erro:
There is an entry for table "a", but it cannot be referenced from this part of the query
O item que contém o erro é:
LEFT JOIN campo_categoria_of h ON a.id_card = h.id_cartao AND h.id_campo_categoria = j.id
Tentei executar a instrução conforme vc alterou e ocorre o seguinte erro:
There is an entry for table "a", but it cannot be referenced from this part of the query
O item que contém o erro é:
LEFT JOIN campo_categoria_of h ON a.id_card = h.id_cartao AND h.id_campo_categoria = j.id
vc pode substituir o left join por
WHERE a.id_elaborador_cartao = b.id (+)
WHERE a.id_elaborador_cartao = b.id (+)
Tópico encerrado , respostas não são mais permitidas