2010-01-22 55 views
0

我使用一些代碼將table1值轉換爲另一個table2,它們坐在不同的數據庫中。插入時間過長,需要優化代碼

當我有100.000條記錄時速度很慢。它需要永遠完成,10分鐘以上。

(Windows Mobile智能手機)

我能做些什麼?

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

編輯

的問題沒有得到解決。我仍然在回答。

+0

你的意思是100.000或100,000(如在十萬)?對分隔符使用小數點會讓程序員(以及大多數人)感到困惑 – Earlz 2010-01-22 23:57:23

+1

目標表是否有索引?它有多少行? – 2010-01-22 23:58:48

+0

我的意思是100000.目標表是空的。 – Pentium10 2010-01-23 00:20:52

回答

4

1]你可以在你的connectionString

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

它有其自身的侷限性設置以下參數。請查看this link以瞭解詳細信息

以上將最終增加緩存大小(cache_size & page_size),但在系統強制關閉(同步=關閉)的情況下可能會丟失一些數據。

2]你可以用一個事務中插入語句時,這樣

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

3]還有一個竅門這是在this page很好的解釋。看看它

希望可以幫助
乾杯!

+2

第二喜歡破碎。 – Vlad 2015-06-23 22:56:53

0

我想你可以使用一個DataTable(我認爲 - ?抑或是DataSet對不起,.NET還是一個初學者),然後.Fill()Reader的結果成DataTable,然後有一個BulkCopyBulkInsert操作,可以將它全部推送到另一個數據庫(連接)中的表中。

+0

你能告訴我一些代碼示例嗎? – Pentium10 2010-01-23 00:22:17

0

一個建議,這可能會有所幫助(儘管您需要對此進行簡要描述),可能會調用插入或替換命令一次爲多個記錄創建多個值。這樣可以將調用分批發送到數據庫,這可能會加快速度。

此外,它聽起來像是從一個數據庫複製到另一個數據庫 - 如果記錄不會存在於新數據庫中,則可以使用INSERT而不是INSERT OR REPLACE,這是(至少在理論上)更快。

但是,這些都不會很戲劇性 - 但這可能仍然是一個緩慢的操作。

+0

據我所知,SQLite不支持多個值。其實有兩種情況。第一次,記錄不會存在。純插入更好,但第二次他們會和我需要插入或替換。 – Pentium10 2010-01-23 00:23:37

1

據我所知,您每行使用兩條SQL語句 - 一條插入它,然後另一條更新整個表。你需要更新整個表格,還是隻更新你插入的行?如果沒有,你可以插入dirty設置爲0的那一行。

您也可以嘗試將ad-hoc插入語句更改爲準備/編譯/參數化語句。在一些提供小速度提升的數據庫引擎中。

在SQLite常見問題解答中列出了一些改進選項,here

最後,你有沒有想過你的瓶頸是什麼?我對手機應用程序的性能瞭解不多 - 您的配置文件是否顯示您受到CPU綁定或「磁盤」限制,無論該特定手機上的磁盤通過何種通行證?

+0

完成該過程後,我必須爲所有記錄設置髒0。我不知道參數化查詢是否會對我有所幫助,因爲表模式是可變的,我不知道固定列。在移動設備上,CPU和DISK都是瓶頸。可能磁盤更多。 – Pentium10 2010-01-23 00:26:03

0

不是單獨執行這些語句,您可以建立字符串,然後一次執行一個批處理,或者查看批處理更新。

或者你可以做到這一切作爲一個聲明,可能會更有效,這樣的事情是我的意思:

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

我希望這有助於。

+0

你可以請更精確,請保持與SQLite。批量更新在sqlite上很少見。 – Pentium10 2010-01-23 00:46:46

+0

你可以通過這樣做來擺脫循環: insert into ???選擇 ???從??? – Burt 2010-01-23 01:47:25

+0

他正在處理兩個不同的數據庫,而不是同一個數據庫中的兩個表。 – 2010-01-23 02:31:04

0

那麼你正在使用每個插入查詢處理器。使用命令會更好,向它添加參數,準備它,然後在循環中設置參數。

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

+0

根據該頁面的註釋: TableDirect僅受OLE DB的.NET Framework數據提供程序支持。當CommandType設置爲TableDirect時,不支持多表訪問。 – Pentium10 2010-01-23 08:37:55

+0

你能告訴我一些Parameteres的代碼示例嗎? – Pentium10 2010-01-23 08:38:26

0
  1. 如果直接在SQL管理工作室中執行此操作,sql語句是否也需要10分鐘+?
  2. 如果不是,您是否嘗試使用SQL過程並執行它?
  3. 您是否嘗試設置連接池和/或將光標服務器設置爲雙面?
  4. 運行SQL事件探查器(您可以從管理工作室調用它)如果1.很慢並且在那裏添加事務隊列。