2011-06-20 46 views
0

我目前正在使用拆分FE和BE在Access 2007中開發應用程序。 FE位於網絡共享的本地。爲了消除在網絡上使用鏈接表時發現的一些問題,我嘗試通過使用ADO的VBA,在應用程序首次使用cn.Execute「INSERT INTO TempTable1 SELECT * FROM LinkedTable1「和cn.Execute」INSERT INTO TempTable2 SELECT * FROM LinkedTable2「。Access 2007 First cn.Execute語句非常慢

LinkedTable1有45,552條記錄,LinkedTable2有45,697條記錄。

第一個execute語句需要50-85秒的地方。然而,第二個執行語句不超過9秒。這些時間是一致的。爲了試圖看看其中一個表是否存在問題,我已經改變了代碼中的語句順序,並且時間仍然相同(第一個執行時間太長,第二個執行時間非常長快速)。 (作爲一個方面說明,我也使用CurrentDB.Execute命令嘗試了DAO,結果沒有任何不同)。如果第一條語句處理的記錄多於第二條,那麼對我來說這是有意義的,但儘管數量很少,但第二個表有比第一個更多的記錄!

有沒有人有任何建議,爲什麼發生這種情況和/或如何得到這第一次執行語句加快?

在此先感謝! ww

+0

您在網絡上的鏈接表遇到了什麼問題?如果它的網絡帶寬至少爲10Mbps,那麼Access鏈接表訪問應該會很好。 –

回答

0

您在兩個臨時表上定義了哪些索引以及主鍵定義?在數據被追加時更新索引可能是一個表更慢的原因之一。

+0

結構相同,包括索引。這兩個表都沒有定義主鍵。我嘗試在插入之前從臨時表中刪除所有索引。多次試驗表明,第一次插入增加了10秒,第二次插入沒有增加。所以我仍然看着第一個50s和第二個7s。 – wsw

+0

這兩個表都沒有主鍵?這就是問題所在 - 你需要一個主鍵來避免把整個桌子拉過來。真正的數據庫從來沒有沒有PK的表,實際上,即使它們只是替代鍵,這些鍵在表中存儲的數據的一部分沒有任何意義。 –

0

我的猜測是,有兩個來源爲差異:

  1. 初始創建時執行的第一個INSERT語句遠程LDB文件。這在第一個SQL命令中顯示爲開銷,當它實際上通過兩者持續存在時。緩存:該文件可能足夠小,以至於Jet/ACE在第一次操作期間通過網線(標題和元數據以及所請求的數據頁)拉動大塊文件,這樣數據就會少得多當發出第二個命令時,不在本地存儲器中。

我的問題是爲什麼你首先遇到鏈接表性能問題。解決這個問題,然後你就不必使用臨時表。見Tony Toews's Performance FAQ

+0

我希望我知道我爲什麼遇到鏈接表性能問題。使用BE本地代碼將在幾秒鐘內執行。 BE在網絡上的響應時間是horrendus,這促使我轉到臨時表的想法。我會責怪網絡,除了第二個選擇語句執行得這麼快。我已經完成了鏈接中提到的所有選項 - 無濟於事。我對緩存瞭解不多......有沒有更多的信息可以提供?謝謝! – wsw

+0

您不應該擔心緩存 - 使用Jet/ACE默認值。他們將在99.999%的時間內完好無損。數據必須通過電線。但是如果你將數以千計的記錄帶入臨時表中,你不能指望它速度很快!我認爲根據需要簡單檢索少量記錄會更有效率(每次少於100個),而不是直接綁定到臨時表中。 –