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

use*_*589 2 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
Run Code Online (Sandbox Code Playgroud)

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

session 1:   Select a from t1
Session 2.   select b from t2
session 3.   select c from t3
Run Code Online (Sandbox Code Playgroud)

Gor*_*son 5

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

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

例如,您的查询可能很容易就是这样的情况:

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

ACE可以处理那些类型的查询,但它只能通过能够容纳一般情况来实现,并且可能以牺牲优化特定情况(如您的)为代价.

如果您确实需要在SQL Server上运行整个查询,那么您可以随时使用

  1. 在Access中创建传递查询,或
  2. 为该查询创建一个SQL Server VIEW,然后使用ODBC链接"表"到该VIEW(而不是链接到各个SQL Server表).

  • 很好的答案(+ upvote)正如您所知,这些ODBC表可以来自不同的数据源.奇怪的是一些"怪物"通过ODBC的8 +大表查询在Access服务器中接近即时工作 - 我试图找出(找到)JET用于将连接拆分为选择的标准,因为一些查询工作非常好.并且经常代替传递 - 将sql保存为VIEW sql并链接到它.这允许用SQL工具工具编辑/修改本机t-sql.这个简单的链接表不仅过滤得很好,而且与pass-through(只读)相比也是可更新的 (2认同)