可能的噴氣將手離開整個事情到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的錯誤猜測將被避免。