2015-10-08 123 views
4

我使用的MS Access 2010,在分裂前端/後端;網絡驅動器(WAN)與用戶(1.3百萬)這主要用於用戶信息,而不是插入重鏈和其他一些表中的一個表16+表,該表將接收高達2000+上插入每日增加女士訪問插入性能

我已經能夠最優化讀/ SELECT查詢。儘管我的代碼的一部分如下所示。這可以用於每日最多2000次迭代。

Do Until rec.EOF 
    Dim vSomeId As Integer 
    vSomeId = rec!SomeId 

    'StrSQL = StrSQL & "INSERT INTO TransportationDetails (TransportationId, SomeId)" & _ 
     '"VALUES(" & vTransportationId & ", " & vSomeId & ");" 

    StrSQL = "INSERT INTO TransportationDetails (TransportationId, SomeId)" & _ 
     "VALUES(" & vTransportationId & ", " & vSomeId & ");" 

    DoCmd.SetWarnings False 
    DoCmd.RunSQL (StrSQL) 
    DoCmd.SetWarnings True 


    rec.Edit 
    rec!SomeBoolean = rec!SomeOtherBoolean 
    rec.Update 
    rec.MoveNext 
Loop 

我在這裏的目的,是要減少呼叫的數量的分貝插入所有的值。和MS ACCESS不支持在聲明中有超過1個查詢,因爲我在代碼的註釋部分嘗試過。我也認爲recordset upate方法耗費大量時間,並且如果任何人都可以提出更好的方法來更新記錄集。

有什麼辦法可以欺騙訪問插入&更新在少命中通過SQL查詢,或任何其他訪問功能,DB。無論如何,或者優化,一段時間可能需要長達30分鐘。減少到至少2 - 5分鐘將是適當的。

P.S. 我不能切換到SQL Server,這是是不可能的。我知道它可以通過更好的方式完成通過SQL Server和Access不應該用於廣域網,但我沒有這個選項。

解決方案: 我與安德烈的和Jorge的解決方案去了。時間減少了17倍。儘管Albert的答案也是正確的,我發現我的主要問題是循環中的sql語句。將記錄集中的編輯更改爲sql並不會影響時間因素。

+1

您應該使用插入選擇查詢。在你的'REC'查詢中加入你的插入查詢,比如'INSERT INTO TransportationDetails(TransportationId,SomeId),選擇「&vTransportationId&」,someId from rectable where ....'你可以稱這個插入爲一次 –

+1

我有訪問查詢是「rec」記錄集的記錄集。我可以運行這個查詢的select語句嗎,或者我將不得不重寫這個sql語句中的查詢? –

+1

如果你在另一個地方使用它,你將不得不爲插入創建一個新的插入,但如果它只存在於這個插入,你只需要一個作爲下面給出的答案根據我的消化。 –

回答

4

如果你現在

S = "SELECT SomeId, SomeBoolean, SomeOtherBoolean " & _ 
    "FROM recTable WHERE someCriteria" 
Set rec = DB.OpenRecordset(S) 

改變你的報表到

"INSERT INTO TransportationDetails (TransportationId, SomeId) " & _ 
"SELECT " & vTransportationId & ", SomeId " & _ 
"FROM recTable WHERE someCriteria" 

"UPDATE recTable SET SomeBoolean = SomeOtherBoolean WHERE someCriteria" 

出於性能考慮,避免遍歷記錄集在可能的情況。使用對整個集合進行操作的SQL語句。

7

我要指出的是,在插入行的情況下,您將使用一個記錄找到更好的性能。如果您在一組數據上操作,SQL「操作」查詢只會執行得更好。當你插入行的時候,你沒有「設置」插入,並且使用DAO記錄集會導致更好的性能(10到100倍更好)。

+1

好的建議(像往常一樣)。我只做了一個快速測試,2000年的SQL INSERTs花費了24秒,而2000年的DAO.Recordset AddNew插入同一張表的時間不到0.2秒。 –

+1

我使用1447插入標記的答案測試了插入,並且花費了我不到2秒。我以前的循環方式,並有每個1插入語句是35秒。 –

+1

儘管我通過記錄集編輯了這些1447條記錄,但是在將它從記錄集更改爲單個sql語句後,我沒有發現任何重大改進。 –