2013-03-15 26 views
1

確定從一個表更新一列,我是新來的SQLite和已經這樣做了成功使用以下查詢:的SQLite使用另一個表

UPDATE stuff 
SET UserName = (SELECT UserName FROM Temp_Stuff WHERE Temp_Stuff.EmpID = stuff.EmployeeID 

這個偉大的工程,當stuff有4995行,Temp_Stuff有1814行並在大約2秒內執行。

當我嘗試當stuff有60000行,Temp_Stuff有55000行,則此完全相同的查詢,似乎在查詢過程中鎖定並不會處理任何事情(我等了20多分鐘。)

我使用vb.net來實現這一點,並且將ExecuteNonQuery方法包裝在一個事務中,並且如果發生任何錯誤,我會回滾事務(我沒有達到這一點。)有沒有一種更有效的方式在SQLite中實現這一點?我試圖並意識到在Update語句中不允許連接,所以這個想法被拋出。這似乎是一個SQLite特定的問題。

* 查詢計劃: *

0 0 0 SCAN TABLE stuff(~1000000 rows) 
0 0 0 EXECUTE CORRELATED SCALAR SUBQUERY 0 
0 0 0 SCAN TABLE Temp_Stuff(~100000 rows) 
+0

你可以'解釋查詢計劃...'爲您的聲明和添加到您的問題? – paul 2013-03-15 16:30:27

+0

@MahmoudGamal沒有 - 你不能用'join'使用SqlLite'更新' – paul 2013-03-15 16:32:15

+0

@MahmoudGamal我在我的帖子中說我試過了(是一個SQLite newby)並且沒有成功。 – 2013-03-15 16:33:20

回答

1

查詢計劃顯示Temp_Stuff完全掃描記錄在stuff表。

EmpID列中添加一個索引,以便查找運行更快。 (對於稍高的性能,請在EmpIDUserName列中使用覆蓋索引。)

SQLite從不自動爲指定表創建索引;您必須明確地定義它們,或者用UNIQUEPRIMARY KEY約束來隱式定義它們。

+0

謝謝!問題是我需要將EmployeeID/EmpID列設置爲主鍵。之後,在7.4秒內執行。我喜歡SQLite。再次感謝! – 2013-03-15 19:37:32