为什么Access按表拆分JOIN查询,然后分别将它们传递给ODBC(SQL Server)?

时间:2014-06-12 20:24:01

标签: sql-server ms-access join

为什么Access 2013会采用如下完美的查询:

Select t1.A,t2.b,t3.c
from T1
Inner Join t2 on t2.a = t1.a
Inner Join t3 on t3.a = t1.a

并将其分解为3个不同的工作(会话)

session 1:   Select a from t1
Session 2.   select b from t2
session 3.   select c from t3

1 个答案:

答案 0 :(得分:5)

Microsoft Access(应用程序)使用Access数据库引擎(a.k.a" ACE",之前" Jet")来处理其查询。因此,它倾向于将表视为离散实体,就像SQL Server查询引擎对其自己的表一样。 (您可能会向SQL Server询问Table1 INNER JOIN Table2中的信息,但在查询的低级处理中,SQL Server引擎必须从各个表中提取数据。)

在您的特定情况下,当所有三个表都在SQL Server中时,ACE分别从每个表中提取信息可能会令人费解,并且将整个查询传递给SQL Server进行处理可能要高效得多。但是,给定的ODBC链接表可以由任意数量的数据库技术支持"具有广泛不同的功能和互操作性程度。

例如,您的查询可能就像以下情况一样容易:

  • [t1]是本地访问表,
  • [t2]是SQL Server上的ODBC链接表,
  • [t3]是CSV文件中的数据表。

ACE可以处理那些类型的查询,但它只能通过能够适应一般情况来实现,而这可能是以优化特定情况为代价的(例如你的)。

如果确实需要让整个查询在SQL Server上运行,那么您始终可以

  1. 在Access中创建pass-through query,或
  2. 为该查询创建一个SQL Server VIEW,然后使用ODBC Linked" Table"到该VIEW(而不是链接到各个SQL Server表)。