PDA

View Full Version : مشکل صفحه بندی datagridview در 1 میلیون رکورد در دیتابیس



mehdiba3
یک شنبه 14 اردیبهشت 1393, 20:57 عصر
سلام
بنطرون در برنامه دفترچه تلفن با یک میلیون رکورد و 4 میلیون فیلد ، زمانی که فرم لود میشه برای کاربر میخوام همه 1 میلیون رکورد رو نمایش ندم و فقط مثلا 10 تا 10 تا درون دیتاگرید اطلاعات نمایش داده بشه و زمانی که کاربر اسکرول دیتاگرید رو پایین آورد رکورد ها 10 تا 10 تا بیان از دیتا بسیس تو گرید و با این کار سرعت بالا بره. بنظرتون چیکار باید بکنم و چطور صفحه بندی رو انجام بدم؟
مشکل دیگه من در عملیات جستجو است که اومدم در فیلد تکس باکس نام خانوادگی در رویداد textchange اون هر بار عملیات جستجو رو بر اساس یک حرف رو انجام میدم و این باعث شده سرعت جستجو به دیلی تعداد زیاد فیلد ها (4 میلیون) خیلی کند بشه. بنطرتون چه راهکاری رو پیشنهاد می کنید

esafb52
یک شنبه 14 اردیبهشت 1393, 21:23 عصر
سلام
بنطرون در برنامه دفترچه تلفن با یک میلیون رکورد و 4 میلیون فیلد ، زمانی که فرم لود میشه برای کاربر میخوام همه 1 میلیون رکورد رو نمایش ندم و فقط مثلا 10 تا 10 تا درون دیتاگرید اطلاعات نمایش داده بشه و زمانی که کاربر اسکرول دیتاگرید رو پایین آورد رکورد ها 10 تا 10 تا بیان از دیتا بسیس تو گرید و با این کار سرعت بالا بره. بنظرتون چیکار باید بکنم و چطور صفحه بندی رو انجام بدم؟
مشکل دیگه من در عملیات جستجو است که اومدم در فیلد تکس باکس نام خانوادگی در رویداد textchange اون هر بار عملیات جستجو رو بر اساس یک حرف رو انجام میدم و این باعث شده سرعت جستجو به دیلی تعداد زیاد فیلد ها (4 میلیون) خیلی کند بشه. بنطرتون چه راهکاری رو پیشنهاد می کنید

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

mehdiba3
یک شنبه 14 اردیبهشت 1393, 21:54 عصر
میشه بگید ایندکس گذاری رو چی؟ در چه محیطی؟ به چه صورت؟ مرسی

ASKaffash
دوشنبه 15 اردیبهشت 1393, 07:31 صبح
سلام
آیا شما برای نمایش یک میلیون رکورد از DataGridView دات نت استفاده می کنید ؟

barnamenevisjavan
سه شنبه 16 اردیبهشت 1393, 13:00 عصر
برای نمایش تعداد بالای رکورد ها باید از Virtualization استفاده کنید.(فک کنم غلط املایی داشته باشم)
خیلی راحت میتونید تا میلیون ها رکورد رو نمایش بدید

mehdiba3
سه شنبه 16 اردیبهشت 1393, 22:12 عصر
جالبه شما فقط روش میگید و هیچ راهنمایی دیگه نمیکنید
مثلا یکی میگه صفحه بندی کن یکی میگه مجازی سزی کن یکی میگه اندیس گذاری کن و ......

من کلی دارم میگم ، من حاضرم منت هم بکشم کسی چیزی یادم بده اما بنظر من این روش راهنمایی تو این سایت خوب نیست

من از datagirdview در سیشارپ استفاده می کنم دوست عزیر
ز

ASKaffash
چهارشنبه 17 اردیبهشت 1393, 07:25 صبح
سلام
سرعت گرید دات نت هم پائین است و هم در حجمهای بالا به کمبود حافظه برخورد میکند بنابراین شما بجای استفاده از گرید دات نت یا باید خودتان گرید خاص طراحی کنید یا در اینترنت به دنبال کمپوننت گرید با سرعت بالا بگرید من از یک موتور ایرانی لایسنس دار استفاده می کنم که در حجم بالای داده های بانک اطلاعاتی سرعتی بالای 8 برابر دات نت دارد و در حجم خیلی بالا تست شده است در شکل یک مقایسه با 1.2 میلیون رکورد را ملاحظه می کنید که دات نت به Out Of Memory برخورد کرده است ولی موتور خم به ابرو نیاورده است

mehdiba3
یک شنبه 21 اردیبهشت 1393, 00:58 صبح
سلام دوست عزیز. خیلی راهنماییت برام جالب و خوب بود. پس سرعت دیتا گرید .net پایینه.
حالا این درسته ولی راه صحیح بنظرت چیه که من بدون خرج کردن و بدون لایسنس بخوام زمانی که اسکرول datagirdview خود .net رو پایین بیارم داده ها کم کم load بشن؟

سوال دیگرم اینه شما پیشنهاد چه کامپوننتی به صورت مجانی برای کار با datagiridview می کنید؟

تشکر دوست خوبم

ASKaffash
یک شنبه 21 اردیبهشت 1393, 07:19 صبح
سلام
کامپوننت های از این دست چون تجاری برای موارد خاص طراحی می شوند عموما رایگان نیستند ولی برای شما یک پیشنهاد دارم اگر دست به کد هستید خودتان مراحل ذیل را انجام دهید :
1- از روش بایند کردن گرید به بانک اطلاعاتی استفاده نکنید
2- کل یک میلیون رکورد را درون یک DataTable بریزید
3- بک متد طراحی کنید که همواره گرید را از رکورد nام به تعداد m رکورد پر کند
4- بک متغیر داشته باشید که شماره صفحه نمایش داده شده را هندل کند
5- خیلی روی Scroll تاکید نکنید
اگر در طراحی مشکلی داشتید بگوئید کمک کنم

mehdiba3
یک شنبه 21 اردیبهشت 1393, 14:30 عصر
با تشکر
منظورتون از - از روش بایند کردن گرید به بانک اطلاعاتی استفاده نکنید میشه بیشتر بگید چیه؟
کاری که من می کنم اینه که از یک Stored procedure عملیات رو select می کتم بعد درون سیشارپ فراخوانیش می کنم و از طریق SqlDataAdapter ، با متد fill براربر DT می کنم و در آخر هم DT میریزم تو سورس datagirdviw

حالا سوال اینه شما میگین اصلا از کامپاننت خود .net استفاده نکننم ؟ پس چطوری نماییششون بدم؟ ببینید من نمیخوام خیلی رو اسکرول تاکید کنم اما فرض کنید ی برنامه داریم که عملیات جستجو رو انجام میده. مثلا تو یک پاذگان آموزشی . در این آموزشگاه هر ماه 2000 سرباز وارد میشه و اطلاعاتشون ثبت میشه و در نهایت بایگانی میشه. حالا بعد از مدتی میخوایم از کل سرباز هایی که تا الان اودن که تعدادشون هم خیلی زیاده به بهترین روش و بهینه ترین روش جوری جستجو رو انجام بدیم که با سرعت بالایی بر اساس جستو به صورت LIKE صورت بگیره. یعنی اول فامیل هرکس وارد شد تمام کسایی که فامیلشون اولش برارر هست رو فیلتر کنه و نشون بده.
نکته و سوال من اینه که آیا باید عملیات جستجو رو که مثلا تو یک تکس باکس نام خانوادگیه در رویداد textchange انجام بدم؟ با این کار هر بار به دیتا بیس وصل میشه و خیلی وقتو میگیره. نه؟ چه روشی بهینه ترینه؟

دیشب این به ذهنم رسید که بیام همه اطلاعات رو در یک لیست موقت load کنم بعد عملیات جستجو رو به صورت افلاین انجام بدم. اما نکته اینه اگه 4 میلیون رکورد بخواد در یک list لود بشه خیلی زمانبره. البته هر بار که سیستم بالا بیاد نیتونه اطلاعات load که شد تا آخر وقتی که سیستم خاموش نشده اطلاعات درون اون لیست که در ram هستش باقی بمونه.

اما آیا صحیح هستش که تمام اطلاعات درون ram قرار بگیره؟

ممنون می شم راه حل درست رو راهنمایی کنید.

javadaskari
یک شنبه 21 اردیبهشت 1393, 16:11 عصر
راحت ترین کار اینه که بر حسب جستجوی کاربر همیشه 10 تای اول جستجو را نمایش بدی ، اینجوری کاربر باید برای پیدا کردن رکورد مورد نظرش جستجو رو درست انجام بده.
مثلا:
Select top 10 * from table1

mehdiba3
یک شنبه 21 اردیبهشت 1393, 23:43 عصر
راحت ترین کار اینه که بر حسب جستجوی کاربر همیشه 10 تای اول جستجو را نمایش بدی ، اینجوری کاربر باید برای پیدا کردن رکورد مورد نظرش جستجو رو درست انجام بده.
مثلا:
Select top 10 * from table1



این توضیح شما خوب و مفیده اما بنظرت این درسته که هر بار که کار بر می خواد جستجو کنه برای هر اسم اتصال به بانک بر قرار بشه؟ نمیشه از روشی که دوستمون در بالا گفت ابتدا همه رکورد ها را در یک datatable بیاریم و بعد جستجو رو در خود سیستم کلاینت انجام بدیم؟ یا اینکه نظر شما اینه Select top 10 * from table1 را در DBMS انجام بدیم و مثلا اگه سیستممون چندین کاربر داشته باشه با این کار آیا سرعت پایین نمیاد؟

javadaskari
دوشنبه 22 اردیبهشت 1393, 09:06 صبح
این توضیح شما خوب و مفیده اما بنظرت این درسته که هر بار که کار بر می خواد جستجو کنه برای هر اسم اتصال به بانک بر قرار بشه؟ نمیشه از روشی که دوستمون در بالا گفت ابتدا همه رکورد ها را در یک datatable بیاریم و بعد جستجو رو در خود سیستم کلاینت انجام بدیم؟ یا اینکه نظر شما اینه Select top 10 * from table1 را در DBMS انجام بدیم و مثلا اگه سیستممون چندین کاربر داشته باشه با این کار آیا سرعت پایین نمیاد؟

سرعت انقدر بالا هست که به چشم نمیاد، مگه اینکه کاربر بخاد در هر ثانیه چند میلیون جستجو کنه!!!!

ASKaffash
دوشنبه 22 اردیبهشت 1393, 12:32 عصر
سلام
مثال ذیل یک Paging ساده است که شما می توانید با ستونها و جدول و کانکشن استرینگ خودتان نیتجه را ببینید درضمن از بایندینگ هم استفاده نشده است (ابزار نمایش گرید دات نت است)