簡體   English   中英

插入時間過長,需要代碼優化

[英]Insert takes too long, code optimization needed

我有一些代碼用於將一個table1值傳輸到另一個table2 ,它們位於不同的數據庫中。

當我有100.000條記錄時,速度很慢。 永遠需要10余分鍾才能完成。

(Windows Mobile智能手機)

我能做什么?

cmd.CommandText = "insert into " + TableName + " select * from sync2." + TableName+"";  
cmd.ExecuteNonQuery();

編輯

問題沒有解決。 我仍在尋找答案。

1]您可以在connectionString中設置以下參數

string connectionString = @"Data Source=E:\myDB.db3; New=true; Version=3; PRAGMA cache_size=20000; PRAGMA page_size=32768; PRAGMA synchronous=off";

這有其自身的局限性。 檢查此鏈接以獲取詳細信息

上面的內容最終會增加緩存的大小(cache_size和page_size),但是如果強制關閉系統(synchronous = off),您可能會丟失一些數據。

2]您可以將插入語句包裝在這樣的事務中

dbTransaction = dbConnection.BeginTransaction();
dbCommand.Transaction = dbTransaction;
// your individual insert statements here
dbTransaction.Commit();

3] 此頁面上還有另外一個技巧可以解釋。 看看這個

希望能有所幫助
干杯!

據我所知,您每行使用兩個SQL語句-一個用於插入它,然后在更新整個表時另一個。 您需要更新整個表還是僅更新要插入的行? 如果不是這樣,您可以只插入dirty設置為0的行。

您也可以嘗試將臨時插入語句更改為准備好的/編譯的/參數化的語句。 在某些數據庫引擎中,可以提供較小的速度提升。

SQLite常見問題解答( 此處)中列出了一些改進的選擇。

最后,您知道瓶頸了嗎? 我對移動電話應用程序的性能了解不多-您的配置文件是否顯示您受CPU約束或“磁盤”約束,無論該​​特定電話上的磁盤經過什么?

我認為您可以使用DataTable (我想-還是DataSet嗎?抱歉,仍然是.NET的初學者),然后將Reader的結果.Fill()放入該DataTable ,然后執行BulkCopyBulkInsert操作,可以將其全部推送到另一個數據庫(連接)中的表中。

可能會有所幫助的一個建議(盡管您需要對此進行概要分析)是對具有多個值的多個記錄一次調用您的insert或replace命令。 這將批量調用數據庫,這可能會加快處理速度。

同樣,這聽起來就像您正在從一個數據庫復制到另一個數據庫一樣-如果記錄將不存在於新數據庫中,則可以使用INSERT而不是INSERT OR REPLACE,這(從理論上講至少是更快的)。

但是,這些都不會很引人注目-這很可能仍然是一個緩慢的操作。

無需單獨執行語句,您可以構建字符串,然后一次成批執行一次,或者查看批處理更新。

或者,您可以將所有操作作為一條語句執行,這可能會更高效,這就是我的意思:

http://forums.mysql.com/read.php?61,15029,15029

我希望這有幫助。

好吧,您正在為每個插入使用查詢處理器。 使用命令,向其添加參數,准備它,然后僅在循環中設置參數會更好。

我不知道SQLite是否支持TableDirect命令。 如果這樣做的話,將會更快,更快速(例如,在SQL Compact中快幾個數量級)。 當然值得一試。

  1. 如果直接在SQL Management Studio中執行sql語句,是否還需要10分鍾以上?
  2. 如果沒有,您是否嘗試過使用SQL過程並執行它?
  3. 您是否嘗試設置連接池和/或使游標服務器成為服務器端?
  4. 如果1.運行緩慢,請運行SQL事件探查器(可以從Management Studio調用它),然后在其中添加事務隊列。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM