我知道,对于具有多个join语句的复杂查询,最好使用pass查询。我的困惑在于,当我们不使用对复杂sql语句的传递查询时,会发生什么。
是因为ODBC驱动程序不能解析查询,而SQL server无法理解查询并通过网络管道发送所有数据以由Access本身查询而导致的速度慢吗?
或
这是否很慢,因为即使ODBC驱动程序可以解析SQL语句,也需要很长时间才能这样做。
发布于 2018-12-09 07:06:45
首先,如果传递查询与ODBC驱动程序一起使用,则Access本身不尝试解析查询,而只是通过ODBC驱动程序将其发送到数据库。通过这种方式,可以使用服务器理解的本机SQL方言提交查询。这允许提交专门的和/或高度优化的查询,使Access无法执行它自己。此外,此类查询还可以引用未链接到Access的服务器表(和其他对象)。
在“正常”访问查询(而不是传递)的情况下,Access数据库引擎将尝试根据自己的功能解析、解释和优化查询。在此过程中,Access将构造一个或多个查询,它还将通过ODBC驱动程序向服务器发送这些查询。在从服务器接收数据后,它将对数据应用所有剩余的连接和条件,以满足整个SQL语句--这是通过本地访问完成的,而不依赖于远程服务器。
正如其他人所评论的那样,有时Access可能足够聪明,可以指示远程服务器执行某些连接或应用某些条件(例如,条件),但访问引擎不够聪明,无法始终选择最佳的优化。当查询包含来自访问表和远程表的源表时,情况尤其如此。这些限制正是传递查询作为选项存在的原因,这样程序员就可以干预将优化的查询发送到服务器,然后使用其他访问查询执行其他联接和条件。
因此,发送到服务器的任何查询都必须通过ODBC驱动程序。ODBC驱动程序将对语句进行一些初始解析,以便处理参数等,这是正确的,但语句解析只是高效数据库操作的开始。数据库引擎存储有关索引、约束、关系等的详细信息。它使用这些元数据来高效地检索、组合和排序数据,但是它通过将这些元数据与表一起存储来做到这一点。因此,远程服务器将在远程服务器上拥有访问无法利用的所有元数据。Access和SQL Server (和任何其他RDBMS)都有不同的数据库引擎,而不是像前面提到的那样用于交换底层元数据(例如索引、约束)。值得注意的是,有时可以指定最小的信息,比如主键,以帮助访问更有效地使用远程表,但这实际上是最小的,不能提供有保证的高效数据操作。
回应关于“这么多年后”查询效率的评论.
事实是,Access在很大程度上是一种较老的技术,它主要是为本地数据库构建的,具有非常基本的关系数据库功能。它从未被设计为适合远程数据操作的优化。此外,Access和SQL Server (或任何其他RDBMS)的底层数据库引擎不兼容。他们每个人都有自己的存储数据和元数据的方法。唯一的互操作性是通过SQL语句实现的,您知道这些语句,并在前面的段落中讨论过这些语句。没有标准的SQL术语来交换必要的复杂元数据,以充分优化Access和远程服务器之间的查询,至少不能超出标准联接和条件。
然而,期待这些年来的进展是完全合理的。高级数据库服务器--包括Server -确实支持在远程服务器之间复制数据表和其他对象的方法。在这种情况下,可以构建高效的查询,从分布在多个服务器上的表请求数据。因此,对进步预期的最终答案将是取代老的技术,如访问和实现更新的、更复杂和功能更强的数据服务器。这并不意味着轻微地反对访问,只是意识到访问将在许多年之后也不会有太大的变化。新的数据存储和检索技术正在更新,而不是访问。
https://stackoverflow.com/questions/53689205
复制相似问题