MS Access 中通过 ODBC 连接 MS SQL 表的查询非常慢

Posted

技术标签:

【中文标题】MS Access 中通过 ODBC 连接 MS SQL 表的查询非常慢【英文标题】:Very slow queries in MS Access with joined MS SQL table via ODBC 【发布时间】:2019-08-29 16:02:26 【问题描述】:

当我想将 Access 前端应用程序与 MSSQL Server 中的一些链接表(通过 ODBC)一起使用时,最好的解决方案是什么?

这对我来说的困难在于我必须使用具有许多多个连接的复杂查询(以及从查询中调用的函数)。 由于两个数据库之间的连接,它非常非常慢(并且某些表中有很多数据,2 GB Access mdb限制是MSSQL DB升级的原因)。

由于连接的 Access 表,直通查询没有帮助。 使用 OPENDATASOURCE('Microsoft.ACE.OLEDB.12.0'... 在 SQL Server 中它仍然很慢。我尝试使用 MSSQL 中的 WHERE 子句的 ODBC 链接视图,但它 看起来和整张桌子一样慢。

我必须将所有连接的 Access 表移动到 MSSQL DB 并将所有查询转换为 Pass-Through?有没有其他解决办法?

【问题讨论】:

无论您如何切片,跨系统连接都会非常缓慢。链接表对于性能来说真的很糟糕。我会将您的 Access 表移动到 SQL Server 并在一个数据库中获取您的所有数据。 在很多情况下,代替 PT 查询,我建议您创建一个视图服务器端,然后链接该视图。这种设置往往是工作量最少的,并且可以使用打开表单或打开报表的“where”子句过滤生成的链接表。因此,您会发现它们比 PT 查询报告甚至表格更有效。 【参考方案1】:

我必须将所有连接的 Access 表移动到 MSSQL DB

是的,当然。

并将所有查询转换为 Pass-Through?

不一定,只有那些仍然很慢的。

“正常”INNER JOIN 查询,仅使用来自一个服务器数据库的链接表,由 Access 和 ODBC 驱动程序以一种在服务器上处理所有内容的方式处理。它们应该(或多或少)与在服务器上运行(或作为传递查询)时一样快。

只有“复杂”的查询,尤其是涉及多个 INNER 和 OUTER JOIN 的查询,不会这样工作。您会注意到在链接表上运行时它们仍然很慢。这些需要更改为传递查询。


编辑:我刚刚注意到

从查询调用的函数

您不能从 PT 查询中调用 VBA 函数,当从链接 MSSQL 表上运行的 Access 查询中调用它们时,它们会再次降低性能(因为它们必须在本地处理)。

您需要学习在 MSSQL 中创建视图,可能还需要学习用户定义的函数和/或存储过程。 从长远来看,您会发现视图实际上比 PT 查询更易于管理。

【讨论】:

以上是关于MS Access 中通过 ODBC 连接 MS SQL 表的查询非常慢的主要内容,如果未能解决你的问题,请参考以下文章

ODBC 连接凭据如何存储在 MS Access 中? [关闭]

MS Access中的ODBC连接失败

从 MS Access 中的 ODBC 连接中提取 UID

JDBC 驱动程序 MS Access 连接

MS Access 选择多个连接

与 Oracle SQL Developer 的 MS Access ODBC 连接