我在 MS Access 2013 上构建了一个日历类型的应用程序,以 SQL Server 作为后端(日历上的每一天都是一个子表单)。大约有 20 个表通过线路连接Call AttachDSNLessTable([details here])
。现场速度很好,但当我尝试通过 VPN 访问它时,仅加载主屏幕就需要大约 6 分钟。其他所有事情至少要花 5 倍的时间才能完成。
我不知道还有其他选择。是否可以通过互联网访问数据库?这样会加快速度吗?或者我们应该增加 VPN 的带宽?我最好的选择是什么?谢谢。
答案1
您的通用应用程序架构(带链接表的 Access)可能不适用于此目的。它可能(大部分)可以修复,但必须进行一些修改。
关键问题是,当 Access 作为前端时,Access 本身会确定是否可以提交整个查询以供 SQLServer 处理,并且经常得出无法提交的结论,因此它经常通过下载整个表来执行查询。对于连接来说尤其如此,特别是如果每个正在使用的表上都没有强主键的话。
以下是有关使用 SQLServer 后端访问链接表的性能的 MS Technet 文档:https://technet.microsoft.com/en-us/library/bb188204%28v=sql.90%29.aspx
最相关的一点是:
查询性能下降的主要原因是涉及非常大的表的查询要求将一个或多个表中的所有数据下载到客户端。即使联接或条件似乎将结果集限制为少量记录,也可能发生这种情况。发生这种情况的原因是 Office Access 数据库引擎有时确定它无法将整个查询提交给 SQL Server。相反,它会提交多个查询,通常包括请求表中所有行的查询,然后在客户端上合并或筛选数据。如果条件要求本地处理,即使是应该只返回单个表中选定行的查询也可能要求返回表中的所有行。
- 使用 JET/ODBC 诊断实用程序来确定所有工作正在哪里完成。
- 尽可能在访问中使用快照记录集。
- 使用视图和存储过程/函数将查询逻辑推送到 SQLServer。
- 在 SQLServer 中建立可靠的键和索引,并确保根据需要对索引进行碎片整理。
- 在 Access 中缓存常用数据。
上面的链接为处于您这种境地的人提供了许多很好的建议和技术细节。祝您好运!