繁体   English   中英

为什么在Access前端和SQL后端上使用复杂的SQL会比较慢?

[英]Why is complex SQL slow when used on Access front end and SQL Back-end?

我了解在具有多个join语句的复杂查询的情况下,最好使用直通查询。 我的困惑是当不对复杂的sql语句使用直通查询时会发生什么。

是因为ODBC驱动程序无法解析查询并且SQL Server无法理解查询并通过要由Access本身查询的网络管道发送所有数据,所以它很慢吗?

要么

它是否很慢,因为即使ODBC驱动程序可以解析SQL语句,它也要花费很多时间

首先,如果传递查询与ODBC驱动程序一起使用,则Access本身不会尝试解析该查询 ,而是仅通过ODBC驱动程序将其发送到数据库。 这样,就可以使用服务器可以理解的本地SQL方言提交查询。 这允许提交Access无法执行的专门和/或高度优化的查询。 此外,此类查询还可以引用未链接到Access的服务器表(和其他对象)。

对于“普通” Access查询(不是传递),Access数据库引擎将尝试根据其自身的功能来解析,解释和优化查询。 为此,Access将构造一个或多个查询,也将通过ODBC驱动程序将其发送到服务器。 从服务器收到数据后,它将对数据应用所有残留的联接和条件,以满足整体SQL语句- 这是由Access在本地完成的,独立于远程服务器

就像其他人评论的那样,有时Access可能足够聪明,可以指示远程服务器执行某些联接或应用某些条件(例如WHERE条件),但是Access引擎不够聪明,无法始终选择最佳优化。 当查询同时包含Access表和远程表的源表时,尤其如此。 这些限制正是为什么传递查询作为选项存在的原因,以便程序员可以干预将优化的查询发送到服务器,然后在以后使用其他Access查询执行其他联接和条件。

因此,任何发送到服务器的查询都必须通过ODBC驱动程序。 正确的是,ODBC驱动程序将对语句进行一些初始解析,以便它可以处理参数等,但是语句解析只是高效数据库操作的开始 数据库引擎存储有关索引,约束,关系等的详细信息。它使用此类元数据来有效地检索,合并和排序数据,但是它通过将元数据与表一起存储来实现。 因此,远程服务器将具有Access无法利用的所有元数据。 Access和SQL Server(以及任何其他RDBMS)具有不同的数据库引擎,并且不旨在交换基础元数据(例如,索引,约束-如前所述)。 值得注意的是,有时可以指定最少的信息(例如主键)来帮助Access更有效地使用远程表,但这实际上是最少的,并且不能提供有保证的高效数据操作。


为了回应有关“多年来的查询效率”的评论,...

事实是Access在很大程度上是一种较旧的技术,具有非常基本的关系数据库功能,主要为本地数据库构建。 它从未被设计为针对远程数据操作进行优化。 此外,Access和SQL Server(或任何其他RDBMS)的基础数据库引擎不兼容。 它们每个都有自己的存储数据和元数据的方式。 唯一的互操作性来自您所知道的SQL语句,并且在前面的段落中已进行了讨论。 没有标准的SQL术语来交换必要的复杂元数据以完全优化Access和远程服务器之间的查询,至少没有超出标准的JOINS和WHERE条件。

但是,期望这些年来的进展是完全合理的。 先进的数据库服务器(包括SQL Server)确实支持跨远程服务器复制数据表和其他对象的方法。 在这种情况下,可以设计出高效的查询,这些查询从分布在多个服务器上的表中请求数据。 因此,对进展的期望的最终答案将是替换诸如Access之类的旧技术,并实现更新,更复杂和功能强大的数据服务器。 这并不意味着对Access有轻微的影响,只是意味着即使在使用了很多年之后,Access也不会有太大变化。 新的数据存储和检索技术正在更新,而不是Access。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM