افزایش سرعت لود اطلاعات توی گرید
سلام
فرض کنید تو برنامه یه کویری نوشتیم که 6 7 تا تیبل رو با هم جوین میکنه و حاصل کار که میشه حدود 200 هزارتا رکورد با حدود 150 تا فیلد رو میریزیم داخل یه دیتاتیبل و توی یه گرید نمایش میدیم. این عملیات بسته به سرعت سیستم حدود 30 40 ثانیه و گاهی بیشتر! زمان میبره. حالا میخام بدونم غیر از نوشتن کویری و دیتاتیبل آیا راه دیگه ای وجود داره که سرعت اجرا رو بیشتر کنه؟ مثلا ویو یا استورپروسیژر یا هر راه دیگه ای؟
پ.ن: لطفا نگین چه لزومی داره اینهمه رکورد و فیلد رو یه جا باهم نمایش بدی و غیر حرفه ایه و منطقی نیست و ... :گیج: میدونم ولی گاهی پیش میاد مجبــــــــــــــــــــــ ورم!! :اشتباه:
نقل قول: افزایش سرعت لود اطلاعات توی گرید
اینکه اون 200 هزار رکورد از کجا میاد و چجوری ساخته میشه به کنار، ولی برای گرید حتما باید paging استفاده کنین.
گرید استاندارد مستقیما امکان paging نداره و باید در سطح sql انجام بدین ولی کمپوننت ها معمولا اون رو پشتیبانی میکنن.
نقل قول: افزایش سرعت لود اطلاعات توی گرید
نقل قول:
نوشته شده توسط
mazoolagh
اینکه اون 200 هزار رکورد از کجا میاد و چجوری ساخته میشه به کنار، ولی برای گرید حتما باید paging استفاده کنین.
گرید استاندارد مستقیما امکان paging نداره و باید در سطح sql انجام بدین ولی کمپوننت ها معمولا اون رو پشتیبانی میکنن.
پیجینگ در سطح SQL رو توضیح بدین لطفا. اگه ممکنه یه مثال یزنین
نقل قول: افزایش سرعت لود اطلاعات توی گرید
نمونه در همین انجمن زیاد هست؛ برای paging / pagination / row_number جستجو کنین
اتفاقا یک تاپیک مشابه هم در همین همسایگی تاپیک شما هست که نمونه کد هم گذاشته شده
https://barnamenevis.org/showthread....=1#post2423816
نقل قول: افزایش سرعت لود اطلاعات توی گرید
نقل قول:
نوشته شده توسط
mazoolagh
ممنون از پیگیریتون. ولی اینجوری فایده نداره. این مدلی داده ها رو تقسیم میکنه به چندین صفحه و مثلا اگر کاربر بخاد فیلدی رو فیلتر کنه فقط تو همون صفحه فیلتر اعمال میشه نه تو تمام رکوردها!
باید بگونه ای باشه که کل داده هارو کابر بتونه روشون مدیریت داشته باشه
نقل قول: افزایش سرعت لود اطلاعات توی گرید
نقل قول:
نوشته شده توسط
a.1397
ممنون از پیگیریتون. ولی اینجوری فایده نداره. این مدلی داده ها رو تقسیم میکنه به چندین صفحه و مثلا اگر کاربر بخاد فیلدی رو فیلتر کنه فقط تو همون صفحه فیلتر اعمال میشه نه تو تمام رکوردها!
باید بگونه ای باشه که کل داده هارو کابر بتونه روشون مدیریت داشته باشه
ممکنه زمانی که برای خواندن تمامی داده ها لازمه زیاد باشه، خیلی اوقات هم نمیشه برای کاهش زمان کاری کرد.
ولی لزومی نداره که تا خواندن آخرین رکورد چیزی نمایش ندید، کاربر رو با چیزی که فعلا بدست اومده مشغول کنید، می توانید به صورت تدریجی بخونید و نمایش بدید و حتی به روش دلخواه تون نتیجه رو فیلتر کنید.
Imports System.ComponentModel
Public Class Form1
Private dg As DataGridView
Private WithEvents bw As BackgroundWorker
Private pb As ProgressBar
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
bw = New BackgroundWorker
bw.WorkerReportsProgress = True
dg = New DataGridView
dg.ReadOnly = True
dg.AllowUserToAddRows = False
dg.Columns.Add("ColumnId", "Id")
dg.Columns.Add("ColumnTitle", "Title")
dg.Columns.Add("ColumnVarA", "VarA")
dg.Columns.Add("ColumnVarB", "VarB")
dg.Columns.Add("ColumnVarC", "VarC")
dg.Parent = Me
dg.Dock = DockStyle.Fill
dg.RowHeadersVisible = False
pb = New ProgressBar
pb.Parent = Me
pb.Dock = DockStyle.Bottom
bw.RunWorkerAsync()
End Sub
Private Sub bw_DoWork(sender As Object, e As DoWorkEventArgs) Handles bw.DoWork
Dim i As Integer, n As Integer, count As Integer
Dim rows As New List(Of DataGridViewRow)
count = 200000
Dim rnd As New Random
Do While (n < count)
rows.Clear()
For i = 1 To 10000
n += 1
Dim row As New DataGridViewRow
row.CreateCells(dg)
row.SetValues(n, "title " & n, rnd.Next(), rnd.Next(), rnd.Next())
rows.Add(row)
If (n = count) Then Exit For
Next
System.Threading.Thread.Sleep(2000)
bw.ReportProgress(100.0 * n / count, rows.ToArray())
Loop
End Sub
Private Sub bw_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles bw.ProgressChanged
Dim rows() As DataGridViewRow = CType(e.UserState, DataGridViewRow())
pb.Value = e.ProgressPercentage
dg.Rows.AddRange(rows)
End Sub
Private Sub bw_RunWorkerCompleted(sender As Object, e As RunWorkerCompletedEventArgs) Handles bw.RunWorkerCompleted
pb.Visible = False
End Sub
End Class