我老化的 Access 2010 数据库现在非常缓慢且不稳定。所有表、查询和表单都存储在 Access 中,它无法处理我的部门(20 多个用户)的负载。我想到了使用SQL Server作为后端,并使用迁移助手迁移数据库。
现在,我的表已链接并存储在 SQL Server 中,但是当使用 Access 中的表单作为前端时,查询的加载时间比以前长得多。 (我假设因为查询仍然在 Access 中执行,加上从表中获取数据的网络连接延迟)
是否有一种简单/自动化的方法将查询移动到 SQL Server,以便 Access 中的表单使用它们,并且实际处理由 SQL Server 完成,以便前端只接收最终数据?这会减少我的总体查询和处理时间吗?
尝试将数据从 Access 迁移到 SQL Server 以减少加载时间和稳定性。由于查询仍然在 Access 而不是 SQL Server 中处理,查询现在需要更长的时间。查询太多且复杂,难以在 SQL Server 中轻松重写。
几乎所有情况下的通用解决方案都是简单地采用现有查询并将其粘贴到 Visual Studio 中。让查询正常工作。
然后创建一个新的 SQL Server 视图,并粘贴正在运行的 SQL。然后,您可以使用与客户端查询相同的名称保存视图。现在,从 ms-access 链接视图,并为其指定与现有查询相同的名称。
上述内容将带来出色的性能。
当然,这里你想采用类似医院的分诊方法。换句话说,您不需要转换所有此类查询,而是攻击最常使用且最慢的查询。
此外,对于编辑数据的表单,您可以继续将表单绑定到表(现在是链接表),并且当此类表单基于一个表时将此类表单转换为使用链接视图不会对性能有所帮助。
事实上,任何基于单个表的链接查询或链接视图往往都看不到性能改进。只有那些涉及多个表和联接的客户端查询需要转换为服务器端 SQL 视图。
另外,请记住以下几点:
docmd.OpenForm "frmInvoices",,,"InvoiceNum = 134343"
在上面,Access 是智能的,只会从网络管道中拉取一条记录。这包括表单直接绑定到链接表的情况。
但是,如果您打开的表单没有 where 子句,那么这首先就是问题所在。换句话说,如果您的设计从第一天开始就没有尝试限制提取到表单(或报告)中的数据,那么使用 SQL Server 对您没有帮助。如上所述,发票表可以有 100 万行,即使表单绑定到链接表,也只有一个记录沿着网络管道传输。
换句话说,大多数查询不会拉取所有数据来访问,而只会拉取您告诉它从 SQL Server 拉取的内容。
如果您的表单不限制从表中提取的数据,那么当然某些视图、传递查询,甚至使用 SQL 存储过程将有助于提高性能!
因此,Access 从 SQL Server 提取所有数据是一个普遍的都市神话。事实上,在大多数情况下,它只提取开发人员告诉 Access 首先提取的内容!
换句话说,好的性能就是好的设计。因此,应该不惜一切代价避免打开直接绑定到某个没有 where 子句的链接表的表单。 但是,如上所述,即使绑定到 SQL Server 上的链接表的现有表单也只会提取您告诉表单提取的行。当然,这假设您告诉该表单仅提取用户需要的数据(并且您通过使用 VBA 中 openform 命令的“where”子句来执行此操作)。
因此,最容易实现的目标应该是解决最慢的查询,十分之九的查询是复杂的查询,并且具有多个表连接。因此,这些是您在修复性能方面可以首先处理的领域。如上所述,创建一个与当前客户端查询同名的视图,然后链接到该视图(您必须删除或通常只是重新命名现有的客户端查询)。