السلام عليكم و رحمة الله
الإخوة الكرام واجهت مشكلة في SQLite و SqlCe
عند استخدم جملة الإدخال insert إلى قاعدة البيانات تعمل بشكل سريع جداً إذا كان عدد السجلات 25 أو 30 ألف سجل ... أما اذا كان أكثر من ذلك فهو يتباطأ بشكل رهيب .
قمت بالتجربة على نوعين من قواعد البيانات SQLite و SqlCe و نفس المشكلة . إلى درجة تقسيم السجلات إلى مجموعات و تنفيذها . و نفس الوضع ... و عمل thread لكل مجموعة و نفس الوضع بط شديد .
ألاحظ مثلاً في برنامج SQLite Expert يقوم بإدخال السجلات بسرعة عالية جداً . و الاستنتاج أن الخلل في طريقة عملي ..
و أريد منكم المساعدة .. و جزاكم الله خيراً
توليد قائمة بسجلات افتراضية
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim LM As String = Nothing
Dim N1 As Long = 0
Dim N2 As Long = 0
For i = 1 To 150000
N1 = FormatNumber(Rnd() * 10000, 0)
N2 = FormatNumber(Rnd() * 10000, 0)
If Len(N1 & N2) = 8 Then
LM &= "emp" & N1 & N2
NumberSortedList.Add(LM, "User" & i)
End If
LM = Nothing
Next
Dim th As New Threading.Thread(AddressOf Inser0011)
th.Start(NumberSortedList)
Debug.Print(NumberSortedList.Count)
Debug.Print("Start")
End Subو هنا الكود المستخدم في عملية الإدخال
Private Sub Inser0011(ByVal SL As SortedList)
If conn.State = ConnectionState.Closed Then conn.Open()
Dim dtStart, dtStart2 As DateTime
Dim d As Double
Dim n, n0 As Long
Dim insertString As String = Nothing
Dim iCount As Long = SL.Count
dtStart = DateTime.Now
For n0 = 0 To SL.Count - 1 Step 5000
Using mytransaction As SQLiteTransaction = conn.BeginTransaction()
Using comd As New SQLiteCommand(connstr)
comd.Connection = conn
comd.Transaction = mytransaction
comd.CommandText = "INSERT INTO [tblUser] (EmpID,UserName) Values (@id,@user)"
dtStart2 = DateTime.Now
Debug.Print("0==" & dtStart2)
For n = n0 To (n0 + 4999)
If n = iCount Then Exit For
comd.Parameters.Clear()
comd.Parameters.Add(New SQLiteParameter("@id", SL.Values(n)))
comd.Parameters.Add(New SQLiteParameter("@user", SL.Keys(n)))
comd.ExecuteNonQuery()
insertString = FormatNumber(((n * 100) / (SL.Count - 1)), 2) & " %"
Next
Debug.Print("1==" & DateTime.Now)
d = (DateTime.Now - dtStart2).TotalSeconds
Debug.Print("Diff:" & d & "Sec")
Debug.Print("rec:" & n)
'comd.Dispose()
End Using
mytransaction.Commit()
'mytransaction.Dispose()
End Using
Next
d = (DateTime.Now - dtStart).TotalMinutes
Debug.Print("2==" & d)
insert_status = "تمت عملية إدخال الأرقام"
End Subالمشروع مرفق Ex01.rar