
Criei um aplicativo do tipo calendário no MS Access 2013 com SQL Server como back-end (cada dia no calendário é um subformulário). Cerca de 20 mesas estão conectadas usando a linha Call AttachDSNLessTable([details here])
. No local a velocidade é boa, mas quando tento acessá-lo por meio de uma VPN, leva cerca de 6 minutos para simplesmente carregar a tela inicial. E todo o resto leva pelo menos 5 vezes mais tempo para ser feito.
Desconheço opções alternativas. É possível tornar o banco de dados acessível pela internet? Isso aceleraria as coisas? Ou deveríamos aumentar a largura de banda da VPN? Qual é a minha melhor opção aqui? Obrigado.
Responder1
Sua arquitetura geral de aplicação (Acesso com tabelas vinculadas) provavelmente apresenta falhas para esse propósito. Provavelmente pode ser corrigido (principalmente), mas não sem alguma revisão.
A questão principal é que, quando o Access é o front-end, o próprio Access determina se pode enviar toda a consulta para processamento pelo SQLServer e muitas vezes chega à conclusão de que não pode, por isso muitas vezes executa a consulta sozinho, baixando o todo mesa. Isto é particularmente verdadeiro com Joins, especialmente se não houver uma chave primária forte em cada uma das tabelas em uso.
Aqui está o documento do MS Technet sobre desempenho para tabelas vinculadas de acesso com backend SQLServer:https://technet.microsoft.com/en-us/library/bb188204%28v=sql.90%29.aspx
A parte mais pertinente é:
A principal causa da degradação do desempenho da consulta é quando uma consulta que envolve tabelas muito grandes exige que todos os dados de uma ou mais tabelas sejam baixados para o cliente. Isso pode acontecer mesmo quando junções ou critérios parecem limitar o conjunto de resultados a um pequeno número de registros. Isso ocorre porque às vezes o mecanismo de banco de dados do Office Access determina que não é possível enviar uma consulta inteira ao SQL Server. Em vez disso, ele envia diversas consultas, geralmente incluindo consultas que solicitam todas as linhas de uma tabela, e depois combina ou filtra os dados no cliente. Se os critérios exigirem processamento local, mesmo as consultas que deveriam retornar apenas linhas selecionadas de uma única tabela poderão exigir que todas as linhas da tabela sejam retornadas.
- Usando os utilitários de diagnóstico JET/ODBC para determinar onde todo o trabalho está sendo feito.
- Usando Snapshot RecordSets no acesso sempre que possível.
- Envie lógica de consulta para o SQLServer com visualizações e procedimentos/funções armazenados.
- Estabeleça chaves e índices sólidos no SQLServer e certifique-se de que os índices sejam desfragmentados conforme necessário.
- Armazenando em cache dados comumente usados no Access.
O link acima contém muitos conselhos excelentes e detalhes técnicos para alguém na sua posição. Boa sorte!