Jet 很可能会将整个事情交给 SQL Server,SQL Server 将执行索引连接,然后执行更新。换句话说,对于像您的示例这样的简单查询,它全部在服务器上完成,没有一个字节通过网络拉出用于本地处理。
让 Jet 拉整张桌子很容易。最简单的方法是将 Access 表达式放在 WHERE 子句中。这是一个会导致它发生的示例:
WHERE Format(MyDate,"YYYY") = 2008
必须拉出整个表格,以便 Access 可以对表格中的所有日期运行 Format() 函数。此外,它不能使用任何索引,因此会非常慢。使用 Jet 后端也会很慢,仅仅是因为它效率太低。编写此 WHERE 子句的正确方法是:
WHERE MyDate Between #1/1/2008# And #12/31/2008#
如果您在已保存的 Access 查询中写入,它将被移交给 SQL Server 进行处理(如果您的后端数据库引擎使用的分隔符与 Jet SQL 使用的分隔符不同,则 ODBC 将发送适当的分隔符)。
但是,如果您不这样做,则不太可能遇到通过网络传输过多数据的问题。事实上,Jet 非常聪明,并且在通过网络发送尽可能多的查询以进行处理方面做得非常好。例如,如果您在 SELECT 语句中调用 Access 函数,则不带 Access 函数的底层选择将被发送到服务器,然后这些函数将在 Access 中对结果集执行。对于此访问查询:
SELECT Format(MyDate,"MM-DD")
FROM MyTable
WHERE MyDate Between #1/1/2008# And #12/31/2008#
Jet 会将其发送到服务器:
SELECT MyDate
FROM MyTable
WHERE MyDate Between #1/1/2008# And #12/31/2008#
一旦 Jet 从服务器接收到符合条件的行,它只会使用 Access Format() 函数格式化日期字段。这也适用于 JOIN,尤其是索引字段上的连接(尽管非索引字段连接也可能会移交给服务器)。
现在,有时 Jet 确实猜错了,最终效率低得令人难以置信。在这些情况下,您可以在服务器上设置视图和存储过程,并使用直通查询来确保避免 Jet 的错误猜测。