PDA

View Full Version : افزایش سرعت لود اطلاعات توی گرید



a.1397
شنبه 18 آبان 1398, 13:16 عصر
سلام
فرض کنید تو برنامه یه کویری نوشتیم که 6 7 تا تیبل رو با هم جوین میکنه و حاصل کار که میشه حدود 200 هزارتا رکورد با حدود 150 تا فیلد رو میریزیم داخل یه دیتاتیبل و توی یه گرید نمایش میدیم. این عملیات بسته به سرعت سیستم حدود 30 40 ثانیه و گاهی بیشتر! زمان میبره. حالا میخام بدونم غیر از نوشتن کویری و دیتاتیبل آیا راه دیگه ای وجود داره که سرعت اجرا رو بیشتر کنه؟ مثلا ویو یا استورپروسیژر یا هر راه دیگه ای؟

پ.ن: لطفا نگین چه لزومی داره اینهمه رکورد و فیلد رو یه جا باهم نمایش بدی و غیر حرفه ایه و منطقی نیست و ... :گیج: میدونم ولی گاهی پیش میاد مجبــــــــــــــــــــــ ورم!! :اشتباه:

mazoolagh
دوشنبه 20 آبان 1398, 08:56 صبح
اینکه اون 200 هزار رکورد از کجا میاد و چجوری ساخته میشه به کنار، ولی برای گرید حتما باید paging استفاده کنین.

گرید استاندارد مستقیما امکان paging نداره و باید در سطح sql انجام بدین ولی کمپوننت ها معمولا اون رو پشتیبانی میکنن.

a.1397
سه شنبه 21 آبان 1398, 10:21 صبح
اینکه اون 200 هزار رکورد از کجا میاد و چجوری ساخته میشه به کنار، ولی برای گرید حتما باید paging استفاده کنین.

گرید استاندارد مستقیما امکان paging نداره و باید در سطح sql انجام بدین ولی کمپوننت ها معمولا اون رو پشتیبانی میکنن.

پیجینگ در سطح SQL رو توضیح بدین لطفا. اگه ممکنه یه مثال یزنین

mazoolagh
چهارشنبه 22 آبان 1398, 08:15 صبح
نمونه در همین انجمن زیاد هست؛ برای paging / pagination / row_number جستجو کنین

اتفاقا یک تاپیک مشابه هم در همین همسایگی تاپیک شما هست که نمونه کد هم گذاشته شده

https://barnamenevis.org/showthread.php?558100-نشان-دادن-مرحله-به-مرحله-اطلاعات-گرید-ویو&p=2423816&viewfull=1#post2423816

a.1397
شنبه 25 آبان 1398, 13:53 عصر
نمونه در همین انجمن زیاد هست؛ برای paging / pagination / row_number جستجو کنین

اتفاقا یک تاپیک مشابه هم در همین همسایگی تاپیک شما هست که نمونه کد هم گذاشته شده

https://barnamenevis.org/showthread.php?558100-نشان-دادن-مرحله-به-مرحله-اطلاعات-گرید-ویو&p=2423816&viewfull=1#post2423816


ممنون از پیگیریتون. ولی اینجوری فایده نداره. این مدلی داده ها رو تقسیم میکنه به چندین صفحه و مثلا اگر کاربر بخاد فیلدی رو فیلتر کنه فقط تو همون صفحه فیلتر اعمال میشه نه تو تمام رکوردها!
باید بگونه ای باشه که کل داده هارو کابر بتونه روشون مدیریت داشته باشه

the king
یک شنبه 26 آبان 1398, 17:26 عصر
ممنون از پیگیریتون. ولی اینجوری فایده نداره. این مدلی داده ها رو تقسیم میکنه به چندین صفحه و مثلا اگر کاربر بخاد فیلدی رو فیلتر کنه فقط تو همون صفحه فیلتر اعمال میشه نه تو تمام رکوردها!
باید بگونه ای باشه که کل داده هارو کابر بتونه روشون مدیریت داشته باشه

ممکنه زمانی که برای خواندن تمامی داده ها لازمه زیاد باشه، خیلی اوقات هم نمیشه برای کاهش زمان کاری کرد.
ولی لزومی نداره که تا خواندن آخرین رکورد چیزی نمایش ندید، کاربر رو با چیزی که فعلا بدست اومده مشغول کنید، می توانید به صورت تدریجی بخونید و نمایش بدید و حتی به روش دلخواه تون نتیجه رو فیلتر کنید.



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