2008-12-08 97 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的錯誤猜測將被避免。

相關問題