可能的喷气将手离开整个事情到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的错误猜测将被避免。