2008-12-08 101 views
2

无论何时每个表都链接到同一个SQL Server数据库中的一个表,我已经有了带有链接表的MS Access数据库。我有一个内部查询连接两个表(特别是我使用连接更新基于另一个表的表)。MS Access如何加入链接表(链接到相同的SQL Server数据库)?

问题是Access在进行连接之前是否“下载”所有表数据?或者是聪明的,并在SQL Server上加入?

查询是:

UPDATE TBL_INVOICE_CHARGES INNER JOIN TBL_ANI 
ON (TBL_INVOICE_CHARGES.CH_CUST_ID = TBL_ANI.ANI_CUST_ID) 
AND (TBL_INVOICE_CHARGES.CH_ANI = TBL_ANI.ANI_NZ_ANI) 
SET TBL_INVOICE_CHARGES.ANI_NOTES = TBL_ANI.ANI_NOTES; 

回答

0

我已经看了SQL事件探查器(不幸的是我没有实际的日志方便),这里是我的发现:

  • 它选择的所有记录两个表
  • 在一个每个记录表调用更新 所以这将是缓慢的。
2

可能的喷气将手离开整个事情到SQL Server,它会做一个索引联接,然后进行更新。换句话说,对于一个简单的查询,就像你的例子,它是所有的都在服务器上完成的,没有一个字节被拉过网络进行本地处理。

让Jet把整张桌子拉起来很容易。最简单的方法是在你的WHERE子句中放置一个Access表达式。下面是会导致它发生的例子:

WHERE Format(MyDate,"YYYY") = 2008 

整个表将不得不被拉到使Access可以在表中的所有日期运行Format()函数。此外,它将无法使用任何索引,因此会非常缓慢。对于Jet后端来说,速度也会很慢,因为它效率太低。正确的方法来写这个WHERE子句是:

WHERE MyDate Between #1/1/2008# And #12/31/2008# 

如果你写了一个保存Access查询,它将被移交到SQL Server进行处理(如果你的后端数据库的ODBC将派遣适当的分隔符引擎使用不同于Jet SQL使用的引擎)。

但是,如果你不做这种事情,你不可能遇到在线路上拉太多数据的问题。事实上,Jet实际上非常聪明,并且在尽可能多地通过线路发送查询方面做得非常好。例如,如果在SELECT语句中调用Access函数,则不带Access函数的底层选择将被发送到服务器,然后将在结果集的Access中执行函数。对于这个Access查询:

SELECT Format(MyDate,"MM-DD") 
    FROM MyTable 
    WHERE MyDate Between #1/1/2008# And #12/31/2008# 

喷气会将此服务器:一旦喷气机从服务器接收到的唯一符合条件的行

SELECT MyDate 
    FROM MyTable 
    WHERE MyDate Between #1/1/2008# And #12/31/2008# 

,只会然后格式化日期字段使用Access Format()函数。这也适用于JOIN,特别是在索引字段上的连接(尽管非索引字段连接也可能会被切换到服务器)。

现在,有时候Jet会猜错,结果是效率极低。在这些情况下,您可以在服务器上设置视图和存储过程,并使用传递查询来确保Jet的错误猜测将被避免。

相关问题