PDA

View Full Version : سوال: مشکل delay در جستجو هنگام تایپ داخل textbox



mrhunter
سه شنبه 21 خرداد 1398, 00:15 صبح
سلام دوستان یک دیتابیس با 1 میلیون رکورد ساخته شده که 100 درصد بیشتر هم میشه ولی خب 1 میلیون دیتا تستی هست.

ی تکست باکس هست ک عمل فیلتر کردن روی دیتاگرید ویو رو با دستور like در sql انجام میده و برنامه رو با ado.net کد زدم.

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

دوستان چون تا حالا کار نکردم این بحث رو ممنون میشم دوستان کدشو برام بفرستین یا ایدی تلگرام بدید ریموت بشید عملی مشاهده کنید .

تصویری هم ضمیمه کردم

mrhunter
سه شنبه 21 خرداد 1398, 13:46 عصر
دوستان در این مورد کسی نمیتونه کمک کنه کارم گیر

mr.sirwan
سه شنبه 21 خرداد 1398, 14:16 عصر
سلام دوست عزیز شما بهتره اول دیتابیست رو بهینه طراحی کنی بعد اگه دیتابیس بهینه هم جوابگو نبود اون موقع بری سراغ ترد، که در این مورد اصلا ترد هیچ کار خاصی نمیکنه فقط از هنگ کردن جلوگیری میکنه نه اینکه سرعت لود رو بیشتر کنه
حالا درمورد بهینه سازی، اول باید روی ستون هایی که قراره جستجو بر اساسشون انجام بشه index گذاری کنی، ایندکس گذاری رو میتونم با یه مثال ملموس بهت توضیح بدم که چیکار میکنه، یه دیکشنری رو در نظر بگیر که کلمات داخل دیکشنری براساس حرف اول هر کلمه دسته بندی شدن، ایندکس گذاری در دیتابیس هم دقیقا همین کارو میکنه و توی عملیات جستجو خیلی کمک میکنه

skflower
سه شنبه 21 خرداد 1398, 14:36 عصر
سلام دوست عزیز
من با این مسئله زیاد مواجه بودم
کلا اینکه تمام بار رو بندازی به دوش sql کار اشتباهیه
بخصوص اینکه دستور like بسیار بسیار کند عمل میکنه
ابتدا دیتابیس رو در یه DataTable فراخوانی کن. بعد دیتاتیبل رو فیلتر کن
برای مثال:

DataTable DT; //اینجا جدول رو از دیتابیس بخونید

if (Search_Edit.Text.Length > 0)
{
string Filter = "";
Filter += " (FName Like '%" + Search_Edit.Text.Replace(" ", "%' and FName Like '%") + "%') ";
Filter += " or ";
Filter += " (LName Like '%" + Search_Edit.Text.Replace(" ", "%' and LName Like '%") + "%') ";
string Sort = "ID asc";
DataView DV = new DataView(DT, Filter, Sort, DataViewRowState.CurrentRows);
DGV.DataSource = DV;
}
else
{
string Sort = "ID asc";
DataView DV = new DataView(DT);
DGV.DataSource = DV;
}

mr.sirwan
سه شنبه 21 خرداد 1398, 15:40 عصر
سلام دوست عزیز
من با این مسئله زیاد مواجه بودم
کلا اینکه تمام بار رو بندازی به دوش sql کار اشتباهیه
بخصوص اینکه دستور like بسیار بسیار کند عمل میکنه
ابتدا دیتابیس رو در یه DataTable فراخوانی کن. بعد دیتاتیبل رو فیلتر کن


دوست عزیز اگه از دیتابیس کار نکشیم پس به چه دردی میخوره؟ یعنی شما دیتابیس رو فقط یه مکان برای ذخیره سازی در نظر گرفتی؟ خیر این دید درست نیست، اتفاقا دیتابیس ها برای این طراحی شدن که ازشون کار بکشی و در این زمینه ها مشکلی براشون پیش نمیاد....
برای راه حلی که شما گفتی تمامی اطلاعات دیتابیس رو بیاری توی دیتاتیبل، شما فک کن 1 میلیون رکورد رو بدون هیچ فیلتری بیاری توی رم کلاینت و اونجا بیای روش فیلتر و جستجو انجام بدی و حالا همین حالت رو در برنامه تحت شبکه در نظر بگیر، میدونی چه فاجعه ای به بار میاد؟؟؟؟ یعنی شما ترجیح میدی یه باری از دیتابیس کم کنی اما کل اطلاعات رو بیاری رو رم کلاینت بدبخت؟؟؟ که معمولا هم کلاینت ها کامپیوترهای ضعیفی هستن و بدون شک برای رکوردهای میلیونی برنامه کرش میکنه

mrhunter
سه شنبه 21 خرداد 1398, 17:08 عصر
سلام دوست عزیز شما بهتره اول دیتابیست رو بهینه طراحی کنی بعد اگه دیتابیس بهینه هم جوابگو نبود اون موقع بری سراغ ترد، که در این مورد اصلا ترد هیچ کار خاصی نمیکنه فقط از هنگ کردن جلوگیری میکنه نه اینکه سرعت لود رو بیشتر کنه
حالا درمورد بهینه سازی، اول باید روی ستون هایی که قراره جستجو بر اساسشون انجام بشه index گذاری کنی، ایندکس گذاری رو میتونم با یه مثال ملموس بهت توضیح بدم که چیکار میکنه، یه دیکشنری رو در نظر بگیر که کلمات داخل دیکشنری براساس حرف اول هر کلمه دسته بندی شدن، ایندکس گذاری در دیتابیس هم دقیقا همین کارو میکنه و توی عملیات جستجو خیلی کمک میکنه


سلام ممنون بابت پاسخ

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

این اموزش خوب؟
لینک اول

(http://mehrtash-souri.com/article/8/1/%D8%A7%DB%8C%D9%86%D8%AF%DA%A9%D8%B3-Index-%D8%AF%D8%B1-SQL-Server)

mrhunter
سه شنبه 21 خرداد 1398, 17:18 عصر
سلام دوست عزیز
من با این مسئله زیاد مواجه بودم
کلا اینکه تمام بار رو بندازی به دوش sql کار اشتباهیه
بخصوص اینکه دستور like بسیار بسیار کند عمل میکنه
ابتدا دیتابیس رو در یه DataTable فراخوانی کن. بعد دیتاتیبل رو فیلتر کن
برای مثال:

DataTable DT; //اینجا جدول رو از دیتابیس بخونید

if (Search_Edit.Text.Length > 0)
{
string Filter = "";
Filter += " (FName Like '%" + Search_Edit.Text.Replace(" ", "%' and FName Like '%") + "%') ";
Filter += " or ";
Filter += " (LName Like '%" + Search_Edit.Text.Replace(" ", "%' and LName Like '%") + "%') ";
string Sort = "ID asc";
DataView DV = new DataView(DT, Filter, Sort, DataViewRowState.CurrentRows);
DGV.DataSource = DV;
}
else
{
string Sort = "ID asc";
DataView DV = new DataView(DT);
DGV.DataSource = DV;
}

والا اطلاعات که خود به خود توی دیتاتیبل و اونجا fill میشه ولی اینکه کل عملیات فیلترینگ و... روی خودش انجام بده خیر و دیتابیس به نظرم بهتر مدیریتش میکنه اینو تا رم

و این‌جوری دیگه دیتابیس فک کنم فقط کارش میشه بخور و بخواب

حالا اگر روش بهتر و با ترید میدونید که بشه فقط جلوی این تاخیر توی تایپ رو گرفت به هر نحوی ممنون میشم بگید

mrhunter
سه شنبه 21 خرداد 1398, 18:08 عصر
سلام دوست عزیز
من با این مسئله زیاد مواجه بودم
کلا اینکه تمام بار رو بندازی به دوش sql کار اشتباهیه
بخصوص اینکه دستور like بسیار بسیار کند عمل میکنه
ابتدا دیتابیس رو در یه DataTable فراخوانی کن. بعد دیتاتیبل رو فیلتر کن
برای مثال:

DataTable DT; //اینجا جدول رو از دیتابیس بخونید

if (Search_Edit.Text.Length > 0)
{
string Filter = "";
Filter += " (FName Like '%" + Search_Edit.Text.Replace(" ", "%' and FName Like '%") + "%') ";
Filter += " or ";
Filter += " (LName Like '%" + Search_Edit.Text.Replace(" ", "%' and LName Like '%") + "%') ";
string Sort = "ID asc";
DataView DV = new DataView(DT, Filter, Sort, DataViewRowState.CurrentRows);
DGV.DataSource = DV;
}
else
{
string Sort = "ID asc";
DataView DV = new DataView(DT);
DGV.DataSource = DV;
}

دوست عزیز این روش رو هم تست کردم حدودا 900 مگ از رم اشغال شد سرعت هم توی تایپ خیلی بدتر شد کد های اون بخش رو میدم ی نگاه کنید.

mrhunter
سه شنبه 21 خرداد 1398, 18:10 عصر
سلام دوست عزیز شما بهتره اول دیتابیست رو بهینه طراحی کنی بعد اگه دیتابیس بهینه هم جوابگو نبود اون موقع بری سراغ ترد، که در این مورد اصلا ترد هیچ کار خاصی نمیکنه فقط از هنگ کردن جلوگیری میکنه نه اینکه سرعت لود رو بیشتر کنه
حالا درمورد بهینه سازی، اول باید روی ستون هایی که قراره جستجو بر اساسشون انجام بشه index گذاری کنی، ایندکس گذاری رو میتونم با یه مثال ملموس بهت توضیح بدم که چیکار میکنه، یه دیکشنری رو در نظر بگیر که کلمات داخل دیکشنری براساس حرف اول هر کلمه دسته بندی شدن، ایندکس گذاری در دیتابیس هم دقیقا همین کارو میکنه و توی عملیات جستجو خیلی کمک میکنه

ایندکس
Nonclustered indexانجام دادم روی ستون fname کمی بهتر شد ولی عالی نه باز توی تایپ تاخیر داریم به خصوص موقع پاک کردن حرف

روش میخوام ک تایپ رو بدون مشکل باشه

mrhunter
چهارشنبه 22 خرداد 1398, 09:28 صبح
دوستان روشی برای حل این مشکل پیدا نشد؟:متفکر: اگر کد هر بخشی لازم رو بگید در اختیارتون میذارم یا اگر میخواید anydesk ریموت بشید بگید واقعا 2 روز بدجور درگیر این موضوع شدم و هر راهی به ذهنم اومده یا گفتن بهم تست کردم نشده

Mahmoud Zaad
چهارشنبه 22 خرداد 1398, 11:01 صبح
سلام
کد داخل رویداد TextChanged و بویژه کوئری داخل این رویداد رو بنویسید.

mrhunter
چهارشنبه 22 خرداد 1398, 12:06 عصر
سلام
کد داخل رویداد TextChanged و بویژه کوئری داخل این رویداد رو بنویسید.

شات ضمیمه شده کد اصلی که استفاده کردم ، کد کامل event textchaned، خدمت شما

var query = $"SELECT * FROM Table_User_old where fname like '%{textBox1.Text}%' ORDER BY id OFFSET 0 ROWS FETCH NEXT 200 ROWS ONLY";

adp = new SqlDataAdapter(query, ClassDbSql.Connection);
_dt = new DataTable();
adp.Fill(_dt);
dataGridView1.DataSource = _dt;

این کد فوق هم طبق این رفرنس (لینک (https://www.sqlshack.com/introduction-pagination-sql-server/)) یک دوست پیشنهاد دادبهتر شد ولی باز تاخیر در هنگام تایپ مشخص

در یک گیف کوتاه مشکل اصلی رو نشان دادم که با استفاده از همین تیکه کد بالا نوشتم این از همه کمی بهتر کرد روند تایپ رو ولی بازم تاخیر هست.

لینک کلیپ (http://s3.picofile.com/file/8363347150/bandicam_2019_06_12_09_52_12_115.mp4.html)

Mahmoud Zaad
چهارشنبه 22 خرداد 1398, 12:16 عصر
اگر فرض کنیم در هر صفحه n رکورد می خواهیم نمایش بدیم در ابتدا باید همون n رکورد رو سلکت کنیم بنابراین از دستور top در textChanged استفاده کنید مثلا select top 100 * from ....
قاعدتا باید سرعت در این حالت خوب باشه. البته برای count هم راه حلی هست که هر دو کوئری در یک کانکشن انجام بشه. فعلا اینو تست کنید.

mr.sirwan
چهارشنبه 22 خرداد 1398, 12:25 عصر
شات ضمیمه شده کد اصلی که استفاده کردم ، کد کامل event textchaned، خدمت شما

لینک کلیپ (http://s3.picofile.com/file/8363347150/bandicam_2019_06_12_09_52_12_115.mp4.html)

دوست عزیز شما انگار هنوز هم مفهوم صفحه بندی رو درک نکردی، توی این کد شما داری همه رکوردهارو واکشی میکنی!!!! اگه توی صفحه بندی مشکلی داری بگو

mrhunter
چهارشنبه 22 خرداد 1398, 12:29 عصر
اگر فرض کنیم در هر صفحه n رکورد می خواهیم نمایش بدیم در ابتدا باید همون n رکورد رو سلکت کنیم بنابراین از دستور top در textChanged استفاده کنید مثلا select top 100 * from ....
قاعدتا باید سرعت در این حالت خوب باشه. البته برای count هم راه حلی هست که هر دو کوئری در یک کانکشن انجام بشه. فعلا اینو تست کنید.

http://s4.picofile.com/file/8363350250/bandicam_2019_06_12_12_57_08_861.mp4.html

اینم روش شما ولی باز هم دقت کنید کلمه hope اوکی کلمه بعدی نه

count هم غیر فعال کردم هرچند بررس کرده بودم تاثیر روی سرعت نداشت

mrhunter
چهارشنبه 22 خرداد 1398, 12:33 عصر
دوست عزیز شما انگار هنوز هم مفهوم صفحه بندی رو درک نکردی، توی این کد شما داری همه رکوردهارو واکشی میکنی!!!! اگه توی صفحه بندی مشکلی داری بگو

توی این کد من کل اطلاعات رو کشیدم بیرون و در بخش fill اونو محدود کردم.. اگر منظورم از صفحه بندی top هست یا همان لینکی ک با آفست انجام میده رو میفرمایید اونم زدم نشد در پست فوق لینک زدم... باز اگر جایی من در صفحه بندی اشتباه میکنم لطفا بگید. ممنون میشم ، باز شاید من کد رو درست نشان نمیدم امکان ریموت دارید ؟

hamid_hr
چهارشنبه 22 خرداد 1398, 12:44 عصر
دوست عزیز این روش رو هم تست کردم حدودا 900 مگ از رم اشغال شد سرعت هم توی تایپ خیلی بدتر شد کد های اون بخش رو میدم ی نگاه کنید.

http://barnamenevis.org/attachment.php?attachmentid=150350&stc=1&d=1560261896



ببینین شما بعد از تایپ بیای از sql واکشی کنی اشتباه محض هست. در هر صورت وقتی رکوردها تعدادشون بالا رفت سرعت به شدت کم میشه
شما ابتدا که برنامه لود میشه همه ی اطلاعات رو لود میکنین و نمایش میدهید
حالا اطلاعات موجود هست باید از همونا استفاده کنید/ کافیه اطلاعات گرید رو فیلتر کنید
یه چیزی مثل این
private void ChercheStextBox_TextChanged(object sender, EventArgs e) {
var bd = (BindingSource)dataGridView3.DataSource;
var dt = (DataTable)bd.DataSource;
dt.DefaultView.RowFilter = string.Format("LibService like '%{0}%'", ChercheStextBox.Text.Trim().Replace("'", "''"));
dataGridView3.Refresh();




}

mr.sirwan
چهارشنبه 22 خرداد 1398, 12:52 عصر
توی این کد من کل اطلاعات رو کشیدم بیرون و در بخش fill اونو محدود کردم.. اگر منظورم از صفحه بندی top هست یا همان لینکی ک با آفست انجام میده رو میفرمایید اونم زدم نشد در پست فوق لینک زدم... باز اگر جایی من در صفحه بندی اشتباه میکنم لطفا بگید. ممنون میشم ، باز شاید من کد رو درست نشان نمیدم امکان ریموت دارید ؟

همین دیگه، شما مفهوم صفحه بندی رو متوجه نشدی، ما صفحه بندی میکنیم که از طرف sql فقط رکوردهای محدودی رو واکشی کنیم نه اینکه همه رو واکشی کنیم حالا بیایم سمت برنامه توی datatable اونهارو محدود کنیم
بله همون offset و fetch رو باید توی کوئری اصلی استفاده کنین نه توی متد fill

mrhunter
چهارشنبه 22 خرداد 1398, 13:02 عصر
ببینین شما بعد از تایپ بیای از sql واکشی کنی اشتباه محض هست. در هر صورت وقتی رکوردها تعدادشون بالا رفت سرعت به شدت کم میشه
شما ابتدا که برنامه لود میشه همه ی اطلاعات رو لود میکنین و نمایش میدهید
حالا اطلاعات موجود هست باید از همونا استفاده کنید/ کافیه اطلاعات گرید رو فیلتر کنید
یه چیزی مثل این
private void ChercheStextBox_TextChanged(object sender, EventArgs e) {
var bd = (BindingSource)dataGridView3.DataSource;
var dt = (DataTable)bd.DataSource;
dt.DefaultView.RowFilter = string.Format("LibService like '%{0}%'", ChercheStextBox.Text.Trim().Replace("'", "''"));
dataGridView3.Refresh();




}

دوست عزیز اول اینکه 1 میلیون رکورد رو وقتی واکشی کنیم در رخ داد فرم لود به شدت زمان بر هست حدودا 7-8 ثانیه

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

mrhunter
چهارشنبه 22 خرداد 1398, 13:04 عصر
همین دیگه، شما مفهوم صفحه بندی رو متوجه نشدی، ما صفحه بندی میکنیم که از طرف sql فقط رکوردهای محدودی رو واکشی کنیم نه اینکه همه رو واکشی کنیم حالا بیایم سمت برنامه توی datatable اونهارو محدود کنیم
بله همون offset و fetch رو باید توی کوئری اصلی استفاده کنین نه توی متد fill

دوست عزیز پست شماره 15 یکی از دوستان گفتن ک با top انجام بده دقیقا همان گفته شما ... و بنده هم کد رو انجام دادم فیلمش هم فرستادم کلیپ رو نگاه کنید تا متوجه بشید هم کد و هم مشکل رو ممنون میشم

Shadow_net
چهارشنبه 22 خرداد 1398, 13:14 عصر
علاوه بر راهنمایی دوستان شما چ اصراری دارید که در TextChange بنویسید
اگر تعداد رکوردهاتون زیاده از Keydown و مثلاً بعد از زدن دکمه Enter این کار رو استفاده کنید
در ضمن چرا در این رویداد مدام datatable و adapter رو New میکنید؟ خب خارج از رویداد قرارش بدید و فقط مقدار دهیش کنید
مهندس سیروان اگه سورس خوبی در رابطه با صفحه بندی دارید ممنون میشم قرار بدید هر چی گرفتم همه اول میومدن اطلاعات رو لود میکردن....

mr.sirwan
چهارشنبه 22 خرداد 1398, 13:16 عصر
دوست عزیز پست شماره 15 یکی از دوستان گفتن ک با top انجام بده دقیقا همان گفته شما ... و بنده هم کد رو انجام دادم فیلمش هم فرستادم کلیپ رو نگاه کنید تا متوجه بشید هم کد و هم مشکل رو ممنون میشم

من با top صفحه بندی انجام ندادم نمیدونم رکوردهای بعدی یا قبلی چجوری واکشی میشن، کلیپ رو دیدم نظری ندارم که چرا اینجوری عمل میکنه، میخوای offset و fetch هم تست کن ببین با اونا چجوریه

hamid_hr
چهارشنبه 22 خرداد 1398, 13:23 عصر
دوست عزیز تاپیک شماره 15 یکی از دوستان گفتن ک با top انجام بده دقیقا همان گفته شما ... و بنده هم کد رو انجام دادم فیلمش هم فرستادم کلیپ رو نگاه کنید تا متوجه بشید هم کد و هم مشکل رو ممنون میشم
خب شما بیاین ابتدا تست کنین کوئری توی sql server manager چقدر زمان میبره اجرا بشه
اگر اجرای کوئری باعث کندی هست باید از امکان full text search در دیتابیس استفاده کنین
اگر نه دنبال علت کندی باشید
یه چیز دیگه پروزه رو در حالت Relase خروجی بگیرید و به مسیر خروجی برید و اجرا کنید ببینید باز هم کند هست؟

mrhunter
چهارشنبه 22 خرداد 1398, 13:40 عصر
علاوه بر راهنمایی دوستان شما چ اصراری دارید که در TextChange بنویسید
اگر تعداد رکوردهاتون زیاده از Keydown و مثلاً بعد از زدن دکمه Enter این کار رو استفاده کنید
در ضمن چرا در این رویداد مدام datatable و adapter رو New میکنید؟ خب خارج از رویداد قرارش بدید و فقط مقدار دهیش کنید
مهندس سیروان اگه سورس خوبی در رابطه با صفحه بندی دارید ممنون میشم قرار بدید هر چی گرفتم همه اول میومدن اطلاعات رو لود میکردن....

خب تکست چینج راحت ترین حالتش و کاربر راحت تر تایپ میکنه و نتیجه رو میبینه بهرحال روش keydown هم خوبه ولی کاربر شاید ندونه باید enter بزنه و فک کنه برنامه کار نمیکنه، اونجا حتما ی واترمارک باید بزنم که متوجه بشه درسته؟ یا که button جستجو بزنیم به این روش ها فکر کرده بودم قبلا.

متوجه بحث new کردن شما نشدم خب اصولا همیشه یادگرفتم این مدلی بزنم بالا تعریف میکنیم هرجا لازم بود new میکنیم ، مشکلش چیه دقیقا؟


درمورد صفحه بندی منم اموزش هارو دیدم ک واکشی رو اول توی فرم لود انجام میدن بعد با دکمه ها فیلتر میکنن ببینید شما توی همان فرم لود مثلا با دستور top یا هر دستور دگ ک راحتی ... موقع لود فرم هم مقدار محدودی مثلا 100 رکورد رو بیار

mrhunter
چهارشنبه 22 خرداد 1398, 13:43 عصر
من با top صفحه بندی انجام ندادم نمیدونم رکوردهای بعدی یا قبلی چجوری واکشی میشن، کلیپ رو دیدم نظری ندارم که چرا اینجوری عمل میکنه، میخوای offset و fetch هم تست کن ببین با اونا چجوریه

خب 100 درصد شما هم برنامه هایی ساختی که تعداد رکورد های خیلی بالا داشته و باید این موارد صفحه بندی و فیلتر کردن رو هندل میکردید ممنون میشم در اون مورد ها راهنمایی بفرمایید


SELECT * FROM table
ORDER BY columnName
OFFSET #StartRow ROWS FETCH NEXT #numberOfRowInPaging ROWS ONLY

توی پست 12 هم رفرنس این دستور افیس و فچ رو قرار دادم و نوشتم ک استفاده کردم باز تاثیر چندانی نداشت

mr.sirwan
چهارشنبه 22 خرداد 1398, 13:49 عصر
دوست عزیز بنده چیزی رو از رو هوا نمیگم حتما قبلش انجام دادم همین الان هم دارم انجام میدم و نتیجه گرفتم، شما لطفی بکن و دیتابیس و برنامه ت رو بذار تا ببینیم مشکل چیه، برای اینکه حجم دیتابیستون هم زیاده شما میتونی یه اسکریپت از داده ها تهیه کنی و اسکریپت رو اینجا بذاری و نیازی نیست که بانک رو بذاری، البته بکاپ هم میشه تهیه کرد اگر حجم بکاپ زیاد نیست میتونی فایل بکاپ رو بذاری

mrhunter
چهارشنبه 22 خرداد 1398, 13:50 عصر
خب شما بیاین ابتدا تست کنین کوئری توی sql server manager چقدر زمان میبره اجرا بشه
اگر اجرای کوئری باعث کندی هست باید از امکان full text search در دیتابیس استفاده کنین
اگر نه دنبال علت کندی باشید
یه چیز دیگه پروزه رو در حالت Relase خروجی بگیرید و به مسیر خروجی برید و اجرا کنید ببینید باز هم کند هست؟

در sql تست کردم دستور

select * from Table_User_old

حدودا 10 ثانیه میبره زمان بعدش با دستور top هم ک کسری از ثانیه هست برای 100 رکورد ...

مورد full text search رو میشه منبع بدید نمیدونم چیه و چطوری انجام میشه

در حالت رلیز هم خیر تفاوت نیست

hamid_hr
چهارشنبه 22 خرداد 1398, 13:58 عصر
در sql تست کردم دستور


1
select * from Table_User_old




حدودا 10 ثانیه میبره زمان بعدش با دستور top هم ک کسری از ثانیه هست برای 100 رکورد ...


مورد full text search رو میشه منبع بدید نمیدونم چیه و چطوری انجام میشه


در حالت رلیز هم خیر تفاوت نیست


منظورم با like تست کنید ببینید چی میشه
برا full text search ایتدا باید زمان نصب تیکش رو بزنید تا سرویسش نصب بشه بعد این لینک توضیح داده بقیشو
https://docs.microsoft.com/en-us/sql/relational-databases/search/get-started-with-full-text-search?view=sql-server-2017

یه نکته دیگه سعی کنید از select * اصلا استفاده نکنید و اسم ستون ها رو قید کنید

mrhunter
چهارشنبه 22 خرداد 1398, 14:25 عصر
دوست عزیز بنده چیزی رو از رو هوا نمیگم حتما قبلش انجام دادم همین الان هم دارم انجام میدم و نتیجه گرفتم، شما لطفی بکن و دیتابیس و برنامه ت رو بذار تا ببینیم مشکل چیه، برای اینکه حجم دیتابیستون هم زیاده شما میتونی یه اسکریپت از داده ها تهیه کنی و اسکریپت رو اینجا بذاری و نیازی نیست که بانک رو بذاری، البته بکاپ هم میشه تهیه کرد اگر حجم بکاپ زیاد نیست میتونی فایل بکاپ رو بذاری

والا مهندس بنده هم نخواستم جسارت کنم گفتم روشی رو که استفاده میکنید بگید روش صفحه بندی ... بانک اطلاعاتی بکاپ زدم شد 600 مگ اسکریپت هم زدم ک هم schema va data باشه ک هم ساختار و دیتارو باهم بیاره فایلش شد 300 مگ

اگر مشکلی نیست من بدون دیتاش رو بفرستم با برنامه SQL Data Generator 4
رکورد هارو تزریق کنید خیلی ساده و سریع

موافق هستید تا سورس رو اپلود کنم؟

mrhunter
چهارشنبه 22 خرداد 1398, 14:28 عصر
منظورم با like تست کنید ببینید چی میشه
برا full text search ایتدا باید زمان نصب تیکش رو بزنید تا سرویسش نصب بشه بعد این لینک توضیح داده بقیشو
https://docs.microsoft.com/en-us/sql/relational-databases/search/get-started-with-full-text-search?view=sql-server-2017

یه نکته دیگه سعی کنید از select * اصلا استفاده نکنید و اسم ستون ها رو قید کنید

با دستور لایک یا هر حالتی که نزدیک به این مورد تاثیری نداره دوست عزیز

لینک رو نگاه کردم اینم مثل همون بحث ایندکس که یکی از دوستان اشاره کرده بودن اینم مثل همان بعید میدونم تاثیر داشته باشه

با استار یا اسم مگر فرقی ایجاد میکنه وقتی من به کل جداول نیاز دارم :متفکر::متفکر:

hamid_hr
چهارشنبه 22 خرداد 1398, 14:37 عصر
با دستور لایک یا هر حالتی که نزدیک به این مورد تاثیری نداره دوست عزیز
یعنی با سرعت قابل قبولی اجرا میشه؟
اگر بله خب مشکل سمت دیتابیس نیست و باید تریس کنید و ببینید کدوم خط بیشترین زمانو میگیره و حلش کنید

لینک رو نگاه کردم اینم مثل همون بحث ایندکس که یکی از دوستان اشاره کرده بودن اینم مثل همان بعید میدونم تاثیر داشته باشه
مورد full text search ّرای زمانی هست که شما در دیتابیس از عملگر like خیلی استفاده میکنید. در این صورت دیگه ایندکس ها کارایی ندارند و این یک روش هست برای سرعت بخشیدن به کوئری ها. برای داده کاوی هم ازش استفاده میشه

با استار یا اسم مگر فرقی ایجاد میکنه وقتی من به کل جداول نیاز دارم
اره فرق زیاد داره ولی یک دلیلش میتونه این باشه که اگر چند وقت دیکه شما یک ستون به جدولتون اضافه کردید دیگه نیاز نباشه همهی کد ها رو هم تغییر بدید

mrhunter
چهارشنبه 22 خرداد 1398, 14:46 عصر
یعنی با سرعت قابل قبولی اجرا میشه؟
اگر بله خب مشکل سمت دیتابیس نیست و باید تریس کنید و ببینید کدوم خط بیشترین زمانو میگیره و حلش کنید

مورد full text search ّرای زمانی هست که شما در دیتابیس از عملگر like خیلی استفاده میکنید. در این صورت دیگه ایندکس ها کارایی ندارند و این یک روش هست برای سرعت بخشیدن به کوئری ها. برای داده کاوی هم ازش استفاده میشه

اره فرق زیاد داره ولی یک دلیلش میتونه این باشه که اگر چند وقت دیکه شما یک ستون به جدولتون اضافه کردید دیگه نیاز نباشه همهی کد ها رو هم تغییر بدید


بعله با زمان نرمالی اجرا میشه اگر فقط سلکت باشه برای 1 میلیون حدودا 7-8 ثانیه ک طبیعی اگرم با like باشه کسری از ثانیه

تریس هم کردم در رویداد تکست چینج با f10 سریع دستورات میره جلو میشکلی نیست

ببینید سمت راست تصویر ضمیمه شده رو

از نظر بنده مشکل در تعداد اجرا مکرر دستور هست چون هر حرف تایپ میشه ی بار این رخ داد اجرا میشه و فک کنم اینجاس sql کم میاره یا سمت برنامه دیتا گرید نمیدونم....

جالب اینجاس چند حرف اول مثلا کلمه hope توی عکس مشکلی نیست از اونجا به بعد فک کنم دگ فشار میاد به sql :قهقهه:

mrhunter
چهارشنبه 22 خرداد 1398, 14:49 عصر
ایده ای به ذهنم رسیده ولی توی پیاده سازی مشکل دارم گفتم مثلا این بخش رو جوری بزنیم در رویداد keydown اگر کاربر حدودا 1 ثانیه دکمه ای رو فشار نداد به اصطلاح یعنی اینکه تایپ کردنش تمام شده و آن زمان بریم و دستورات پایگاه داده رو بزنیم

اگر کسی بتونه کد اینو برام بنویسه ممنون میشم فک میکنم این روش جالبی باشه حالا اگر ایرادی دارم دیگه نمیدونم :افسرده:

hamid_hr
چهارشنبه 22 خرداد 1398, 14:54 عصر
یه تایمر بزار با مثلا 2 ثانیه و غیر فعالش کن
تو رویداد keydown چک کن اگه غیر فعال بود اونو فعال و اگه فعال بود ریستش کن
اگه رویداد مربوط به تایمر اجرا شد تایمر رو غیر فعال کن

mrhunter
چهارشنبه 22 خرداد 1398, 15:36 عصر
دوستان این سورس برنامه و بکاپ دیتابیس، البته دیتابیس به خاطر کاهش حجم خروجی رو توی حالت export data tire-application... گرفتم در فایل زیپ که قرار دادم فایلی به فرمت bacpac هست در sql management روی دیتابیس کلیک راست import data tier-... هست گزینه اش...

فرم5 رو تست های خودتان رو انجام بدید یا در یک فرم جدید هر حالتی که دوست دارید تست کنید

چیزی که بنده احتیاج دارم در این حال که صفحه بندی داره دیتا گرید ... لود اولیه فرم هم پایین و تکست باکس روان تایپ کنه.

.. در فرم 6 هم همان روش با دیتاست تست کردم بجای دیتاتیبل هرچند میدونم datatable سریعتر گفتم شاید تفاوت باشه...

فرم 2 هم یک دوست زحمت کشیده بود با ترید انجام داده بود ولی ترید در حین تایپ سریع به مشکل میخوره میتونید تست کنید.

دانلود سورس (http://s5.picofile.com/file/8363370826/WindowsFormsApp1.zip.html)

davidrobert
چهارشنبه 22 خرداد 1398, 19:36 عصر
بابت جستجو روشی که من پیاده کردم از keyDown استفاده کردم در کادر متن وققتی مقدار داد و اینتر زد اطلاعات بیاره از دیتابیس ولی در روش یک میلیون اطلاعات امدم اطلاعات گرفتم داخل دیتاتیبل و و بعد از اینکه داخل دیتاتیبل گرفتم از دیتاتیبل جستجو میکنم تازه باز جستجو به روش KeyDown قرار میدم که روش خیلی خوبی هستش و فشاری روی دیتابیس نیست.
به این روش اطلاعات میگیرم و داخل DataTable میریزم و جتستو و آخر سر خواست تعداد رکورد یا کلش خروجی اکسل میگیرم تو یک ثانیه
private DataTable paggedtable;
private DataTable dt33;
private DataTable dtExcel;
private BindingSource bs = new BindingSource();
private clsProgress progress = new clsProgress();
private sabt_Motovafy_Gabz_Pesh_And_Sanad_Gabr sabtMotovafy = new sabt_Motovafy_Gabz_Pesh_And_Sanad_Gabr();
public DataTable refDt()
{
DataTable dtCustomers;
string constr = @"Data Source=" + Properties.Settings.Default.IP + ";Initial Catalog='" +
Program.DbDatabase + "';User ID='" + Program.Username + "';Password='" + Program.Password +
"'";
using (SqlConnection con = new SqlConnection(constr))
{
using (SqlCommand cmd = new SqlCommand(ProcedureName))
{
cmd.Parameters.Add(new SqlParameter(at + StatementType,
P_Sabt_Motovafy_Gabz_Pesh_And_Sanad_Gabr.Select_In fo_Motvfa));
cmd.Parameters.Add(new SqlParameter(at + P_Sabt_Motovafy_Gabz_Pesh_And_Sanad_Gabr.SM_Mahlsa btEtelat,
Program.A_ID));
cmd.CommandType = CommandType.StoredProcedure;
cmd.Connection = con;
cmd.CommandTimeout = 0;
con.Open();
using (SqlDataReader sdr = cmd.ExecuteReader())
{
dtCustomers = new DataTable();
dtCustomers.Load(sdr);
//dtCustomers.Columns[0].ColumnName = "شماره_پرونده";
//dtCustomers.Columns[1].ColumnName = "کد_رایانه_ای";
//dtCustomers.Columns[2].ColumnName = "تاریخ_تنظیم_سند";
//dtCustomers.Columns[3].ColumnName = "ملیت";
//dtCustomers.Columns[4].ColumnName = "کد_ملی";
//dtCustomers.Columns[5].ColumnName = "وضعیت_قبر";
//dtCustomers.Columns[6].ColumnName = "شماره_شناسنامه";
//dtCustomers.Columns[7].ColumnName = "جنسیت";
//dtCustomers.Columns[8].ColumnName = "نام_و_نام_خانوادگی";
//dtCustomers.Columns[9].ColumnName = "نام_پدر";
//dtCustomers.Columns[10].ColumnName = "محل_صدور";
//dtCustomers.Columns[11].ColumnName = "تلفن";
//dtCustomers.Columns[12].ColumnName = "موبایل";
//dtCustomers.Columns[13].ColumnName = "نام_تحویل_گیرنده";
//dtCustomers.Columns[14].ColumnName = "نسبت_متوفی";
//dtCustomers.Columns[15].ColumnName = "مشخصات_پرداخت_کننده";
//dtCustomers.Columns[16].ColumnName = "شماره_پرداخت_کننده";
//dtCustomers.Columns[17].ColumnName = "تاریخ_تولد";
//dtCustomers.Columns[18].ColumnName = "تاریخ_وفات";
//dtCustomers.Columns[19].ColumnName = "سن";
//dtCustomers.Columns[20].ColumnName = "بلوغ";
//dtCustomers.Columns[21].ColumnName = "وضعیت_متوفی";
//dtCustomers.Columns[22].ColumnName = "از";
//dtCustomers.Columns[23].ColumnName = "محل دفن";
//dtCustomers.Columns[24].ColumnName = "فاز";
//dtCustomers.Columns[25].ColumnName = "نام_قطعه";
//dtCustomers.Columns[26].ColumnName = "قطعه";
//dtCustomers.Columns[27].ColumnName = "ردیف";
//dtCustomers.Columns[28].ColumnName = "شماره";
//dtCustomers.Columns[29].ColumnName = "طبقه";
//dtCustomers.Columns[30].ColumnName = "توضیح_یا_رزرو";
//dtCustomers.Columns[31].ColumnName = "شماره_گواهی_فوت";
//dtCustomers.Columns[32].ColumnName = "علت_فوت";
//dtCustomers.Columns[33].ColumnName = "استان_محل_زندگی";
//dtCustomers.Columns[34].ColumnName = "شهرستان_محل_زندگی";
//dtCustomers.Columns[35].ColumnName = "آدرس_محل_سکونت";
//dtCustomers.Columns[36].ColumnName = "بوی_یا_غیر_بومی";
//dtCustomers.Columns[37].ColumnName = "محل_وقوع_فوت";
//dtCustomers.Columns[38].ColumnName = "استان_محل_فوت";
//dtCustomers.Columns[39].ColumnName = "شهرستان_محل_فوت";
//dtCustomers.Columns[40].ColumnName = "وضعیت_سند";
//dtCustomers.Columns[41].ColumnName = "نحوه_پرداخت_پیش_فروش";
//dtCustomers.Columns[42].ColumnName = "توضیح";
//dtCustomers.Columns[43].ColumnName = "گواهی_متصدی";
//dtCustomers.Columns[44].ColumnName = "سنگ";
//dtCustomers.Columns[45].ColumnName = "گواهی_به_ادارات";
//dtCustomers.Columns[46].ColumnName = "سرد_خانه";
//dtCustomers.Columns[47].ColumnName = "نایلون";
//dtCustomers.Columns[48].ColumnName = "کاور";
//dtCustomers.Columns[49].ColumnName = "نماسازی";
//dtCustomers.Columns[50].ColumnName = "جمع_آوری_و_یا_زد_عفونی";
//dtCustomers.Columns[51].ColumnName = "تشکیل_پرونده";
//dtCustomers.Columns[52].ColumnName = "خدمات_باز_کردن_قبر_آماده";
//dtCustomers.Columns[53].ColumnName = "گواهی_ثبت_احوال";
//dtCustomers.Columns[54].ColumnName = "صدور_گواهی_دفن";
//dtCustomers.Columns[55].ColumnName = "صدور_سند_حق_انتقال_از_قبر";
//dtCustomers.Columns[56].ColumnName = "عنوان_سایر_اول";
//dtCustomers.Columns[57].ColumnName = "مبلغ_سایر_اول";
//dtCustomers.Columns[58].ColumnName = "عنوان_سایر_دوم";
//dtCustomers.Columns[59].ColumnName = "مبلغ_سایر_دوم";
//dtCustomers.Columns[60].ColumnName = "بسته_فرهنگی";
//dtCustomers.Columns[61].ColumnName = "نام_مداح";
//dtCustomers.Columns[62].ColumnName = "هزینه_مداح";
//dtCustomers.Columns[63].ColumnName = "هزینه_کل";
//dtCustomers.Columns[64].ColumnName = "درصد_مالیات";
//dtCustomers.Columns[65].ColumnName = "مبلغ_مالیات";
//dtCustomers.Columns[66].ColumnName = "دفن";
//dtCustomers.Columns[67].ColumnName = "پیش_فروش";
//dtCustomers.Columns[68].ColumnName = "راننده_اول";
//dtCustomers.Columns[69].ColumnName = "راننده_دوم";
//dtCustomers.Columns[70].ColumnName = "انتقال";
//dtCustomers.Columns[71].ColumnName = "تشییع";
//dtCustomers.Columns[72].ColumnName = "توقف";
//dtCustomers.Columns[73].ColumnName = "جمع_کل";
//dtCustomers.Columns[74].ColumnName = "مبلغ_تخفیف";
//dtCustomers.Columns[75].ColumnName = "مبلغ_پرداختی";
//dtCustomers.Columns[76].ColumnName = "نحوه_پرداخت";
//dtCustomers.Columns[77].ColumnName = "مبلغ_پرداختی_نقد";
//dtCustomers.Columns[78].ColumnName = "مبلغ_پرداختی_کارت_خوان";
//dtCustomers.Columns[79].ColumnName = "مانده";
//dtCustomers.Columns[80].ColumnName = "وضعیت_حساب_کتاب";
//dtCustomers.Columns[81].ColumnName = "نام_کاربر_ثبت_کننده";
//dtCustomers.Columns[82].ColumnName = "تاریخ_ثبت";
//dtCustomers.Columns[83].ColumnName = "زمان_ثبت";
//dtCustomers.Columns[84].ColumnName = "تاریخ_ویرایش";
//dtCustomers.Columns[85].ColumnName = "زمان_ویرایش";
//dtCustomers.Columns[86].ColumnName = "تعداد_دفعات_ویرایش";
}

con.Close();
}
}

return dtCustomers;

}

private void FocuseMoveControl(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Enter)
{
try
{
string filter = string.Format(
"CONVERT(" + dgv1.Columns[0].DataPropertyName + ", System.String) like '%" +
Txt_GVD_Date_Sabt_Sanad.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[1].DataPropertyName + ", System.String) like '%" +
Txt_SM_NameAndLast.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[2].DataPropertyName + ", System.String) like '%" +
Txt_GVD_Shomare_Parvande.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[4].DataPropertyName + ", System.String) like '%" +
Txt_SM_SHS_ShomareSanad.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[7].DataPropertyName + ", System.String) like '%" +
Txt_SM_CM_Code_Mali.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[8].DataPropertyName + ", System.String) like '%" +
Txt_SM_Shomare_Shenasname.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[9].DataPropertyName + ", System.String) like '%" +
Txt_CTS_Sex.Text.Trim() + "%' AND " +

"CONVERT(" + dgv1.Columns[10].DataPropertyName + ", System.String) like '%" +
Txt_SM_Father.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[11].DataPropertyName + ", System.String) like '%" +
Txt_SM_Mahal_Sodor.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[18].DataPropertyName + ", System.String) like '%" +
Txt_SM_Born.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[19].DataPropertyName + ", System.String) like '%" +
Txt_SM_Death.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[21].DataPropertyName + ", System.String) like '%" +
Txt_B_Bolog.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[22].DataPropertyName + ", System.String) like '%" +
Txt_RT_Title.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[25].DataPropertyName + ", System.String) like '%" +
Txt_SM_Faz.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[26].DataPropertyName + ", System.String) like '%" +
Txt_NG_NameGete.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[27].DataPropertyName + ", System.String) like '%" +
Txt_SM_Gete.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[28].DataPropertyName + ", System.String) like '%" +
Txt_SM_Radif.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[29].DataPropertyName + ", System.String) like '%" +
Txt_SM_Shomare.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[30].DataPropertyName + ", System.String) like '%" +
Txt_SM_Tabage.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[33].DataPropertyName + ", System.String) like '%" +
Txt_EPH_EletePhoto.Text.Trim() + "%' and " +

"CONVERT(" + dgv1.Columns[37].DataPropertyName + ", System.String) like '%" +
Txt_SM_Bome_Ger_Bome.Text.Trim() + "%' "
);

bs.Filter = filter;
// bs.Filter = string.Format(dataGridView1.Columns[0].DataPropertyName + " like '%" + Txt_Shomare_Sanad.Text+ "%' and " + dataGridView1.Columns[8].DataPropertyName + " like '%" + Txt_Name_LastName.Text+ "%' and " + dataGridView1.Columns[11].DataPropertyName + " like '%" + Txt_From.Text+ "%'");
dgv1.DataSource = bs;

MessageBox.Show("تعداد رکورد های یافت شده " + Convert.ToDecimal(dgv1.Rows.Count).ToString("N0") +
" تا میباشد.");
SendKeys.Send("{TAB}");
e.Handled = true;
e.SuppressKeyPress = true;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}

}
}

private void Frm_Full_Search_Gabz_Vosual_Load(object sender, EventArgs e)
{
//progress.startProgress();
dt33 = refDt();
bs.DataSource = dt33;
dgv1.DataSource = bs;
dgv1.AllowUserToOrderColumns = true;
SetDisplayOrder();
//progress.stopProgress();
MessageBox.Show(
"تعداد رکورد های یافت شده " + Convert.ToDecimal(dt33.Rows.Count).ToString("N0") + " میباشد.");
}

private void Exporta(DataTable dtexpo)
{
SaveFileDialog dialog = new SaveFileDialog
{
InitialDirectory = "c:/Documents",
Title = "Select Where To Save File",
Filter = "Excel Files (*.xls;*.xlsx)|*.xls;*.xlsx|All files (*.*)|*.*"
};
if (dialog.ShowDialog() == DialogResult.OK)
{
StreamWriter wr = new StreamWriter(dialog.FileName, false, Encoding.Unicode);

for (int i = 0; i < dtexpo.Columns.Count; i++)
{
wr.Write(dtexpo.Columns[i].ToString().ToUpper() + "\t");
}

wr.WriteLine();

for (int i = 0; i < (dtexpo.Rows.Count); i++)
{
for (int j = 0; j < dtexpo.Columns.Count; j++)
{
if (dtexpo.Rows[i][j] != null)
{
wr.Write(Convert.ToString(dtexpo.Rows[i][j]) + "\t");
}
else
{
wr.Write("\t");
}
}

wr.WriteLine();
}

wr.Close();
MessageBox.Show("خروجی اکسل با موفقعیت انجام شد. ");
}


}

private DataTable DGV2DT(DataGridView dgv)
{
DataTable dtgv = new DataTable();
foreach (DataGridViewColumn col in dgv.Columns)
{
dtgv.Columns.Add(col.Name);
}

foreach (DataGridViewRow row in dgv.Rows)
{
DataRow dRow = dtgv.NewRow();
foreach (DataGridViewCell cell in row.Cells)
{
dRow[cell.ColumnIndex] = cell.Value;
}

dtgv.Rows.Add(dRow);
}

return dtgv;
}

private void خروجیاکسلToolStripMenuItem_Click(object sender, EventArgs e)
{
DataTable BDT = DGV2DT(dgv1);
Exporta(BDT);
}


private void dgv1_DoubleClick(object sender, EventArgs e)
{
try
{
Frm_Gabz_Vosual_Daramad fm = new Frm_Gabz_Vosual_Daramad();
fm.TxtShomareSand.Text = dgv1.SelectedRows[0].Cells[4].Value.ToString();
fm.Txt_GVD_Shomare_Parvande.Text = dgv1.SelectedRows[0].Cells[2].Value.ToString();
fm.Txt_SM_CM_Code_Mali.Text = dgv1.SelectedRows[0].Cells[7].Value.ToString();
fm.Show();
}
catch
{
}

}

private void Frm_Full_Search_Gabz_Vosual_Resize(object sender, EventArgs e)
{

}

private void Frm_Full_Search_Gabz_Vosual_FormClosing(object sender, FormClosingEventArgs e)
{
CacheDisplayOrder();
GC.Collect();
}

private void CacheDisplayOrder()
{
IsolatedStorageFile isoFile =
IsolatedStorageFile.GetUserStoreForAssembly();
using (IsolatedStorageFileStream isoStream = new
IsolatedStorageFileStream("DisplayCache", FileMode.Create,
isoFile))
{
int[] displayIndices = new int[dgv1.ColumnCount];
for (int i = 0; i < dgv1.ColumnCount; i++)
{
displayIndices[i] = dgv1.Columns[i].DisplayIndex;
}

XmlSerializer ser = new XmlSerializer(typeof(int[]));
ser.Serialize(isoStream, displayIndices);
}
}

private void SetDisplayOrder()
{
IsolatedStorageFile isoFile =
IsolatedStorageFile.GetUserStoreForAssembly();
string[] fileNames = isoFile.GetFileNames("*");
bool found = false;
foreach (string fileName in fileNames)
{
if (fileName == "DisplayCache")
{
found = true;
}
}

if (!found)
{
return;
}

using (IsolatedStorageFileStream isoStream = new
IsolatedStorageFileStream("DisplayCache", FileMode.Open,
isoFile))
{
try
{
XmlSerializer ser = new XmlSerializer(typeof(int[]));
int[] displayIndicies =
(int[])ser.Deserialize(isoStream);
for (int i = 0; i < displayIndicies.Length; i++)
{

dgv1.Columns[i].DisplayIndex = displayIndicies[i];

}
}
catch
{
}
}
}

mrhunter
چهارشنبه 22 خرداد 1398, 21:02 عصر
بابت جستجو روشی که من پیاده کردم از keyDown استفاده کردم در کادر متن وققتی مقدار داد و اینتر زد اطلاعات بیاره از دیتابیس ولی در روش یک میلیون اطلاعات امدم اطلاعات گرفتم داخل دیتاتیبل و و بعد از اینکه داخل دیتاتیبل گرفتم از دیتاتیبل جستجو میکنم تازه باز جستجو به روش KeyDown قرار میدم که روش خیلی خوبی هستش و فشاری روی دیتابیس نیست.
به این روش اطلاعات میگیرم و داخل DataTable میریزم و جتستو و آخر سر خواست تعداد رکورد یا کلش خروجی اکسل میگیرم تو یک ثانیه


از شما هم تشکر میکنم دوست عزیز بابت این راهنمایی کد ها رو نگاه کردم کم و بیش متوجه شدم فرایند شما رو هم ، بعله سر آخر با همان روش keydown به یک نتیجه مطلوب فعلا رسیدم.

با استفاده از استاپ واچ ، بک گراند ورکر و استفاده از اینا اومدم بخشی از مشکل رو هندل کردم و دارم روش کار میکنم تا الان ک نتیجه رضایت بخشی داشته. خیلی هم مختصر و مفید البته بنده هم نظرم اینکه خیلی از بخش هارو دیتابیس واقعا باید بهش زور بگیم وگرنه کارش میشه بخور و بخواب :قهقهه::قهقهه: اگر فقط قرار ذخیره کنه اطلاعات ک ی فایل text هم اینو انجام میده ولی خب حرف شما هم درست ک توی دیتا تیبل سرعت بالا و..... منکرش نیستم بالاخره هر مسئله میتونه به صدها روش حل بشه حالا تکمیل تر شد کد اون بخش رو میذارم دوستان ی نگاه کنن اگر خطایی احتمال داره پیش بیاد با هم هندل کنیم

بازم ممنون از همه دوستان

و همچنان منتظرم دوستان که این تاپیک رو میبینن سورس کد رو دانلود کنن و بصورت عملی تست کنن و اگر راه حلی پیدا کردن کدش رو بفرستن

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

mr.sirwan
چهارشنبه 22 خرداد 1398, 21:20 عصر
دوست عزیز فایل بکاپت ریستور نمیشه

mrhunter
چهارشنبه 22 خرداد 1398, 22:17 عصر
دوست عزیز فایل بکاپت ریستور نمیشه

ای وای :ناراحت:

امکان داره چون نسخه sql من 2017 هست شاید مال شما پایین تر خطا میده؟!!!!!!!!!!!!!!!!!!!!!!!

خب فک کنم تنها راه اینکه با همان نرم افزار دیتا جنریتور دیتا بسازید :لبخند:

mr.sirwan
پنج شنبه 23 خرداد 1398, 00:21 صبح
اصول کار رو میگم همونارو تبدیل به کد کن:
۱. تعداد رکوردها رو واکشی میکنی، چه در حالت فیلتر کردن چه در حالت بدون فیلتر
۲. رکوردها رو توسط کوئری sql و با offset و fetch از سمت دیتابیس واکشی میکنی، نه اینکه کل رکوردهارو از دیتابیس واکشی کنی بعد بیای توی دیتاتیبل صفحه بندی انجام بدی و بازم در حالت فیلتر و بدون فیلتر
۳. Totalpage رو براساس تعداد رکوردهای مطابقت دار محاسبه میکنی و لیبل های مربوط به صفحه بندی رو تنظیم میکنی

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

mrhunter
جمعه 24 خرداد 1398, 23:21 عصر
اصول کار رو میگم همونارو تبدیل به کد کن:
۱. تعداد رکوردها رو واکشی میکنی، چه در حالت فیلتر کردن چه در حالت بدون فیلتر
۲. رکوردها رو توسط کوئری sql و با offset و fetch از سمت دیتابیس واکشی میکنی، نه اینکه کل رکوردهارو از دیتابیس واکشی کنی بعد بیای توی دیتاتیبل صفحه بندی انجام بدی و بازم در حالت فیلتر و بدون فیلتر
۳. Totalpage رو براساس تعداد رکوردهای مطابقت دار محاسبه میکنی و لیبل های مربوط به صفحه بندی رو تنظیم میکنی

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

دوست عزیز ممنون از پیگیری شما
برای مورد 1 و 3 همه فرمول هارو تست کردم و همه درست کار میکنه برای مورد 2
من حالاتی که شما فرمودی همه رو تست کردم واکشی همه اطلاعات ، واکشی اطلاعات محدود مثلا 100 رکورد ، فیلتر کردن روی خود دیتاگرید ، فیلتر کردن با دستور sql مثل top,offset va..... فیلتر با fill در خود دیتاگرید همه حالات اما بدون نتیجه بود .. حالا فردا باز جهت اطمینان یک پروژه تست جدید از اول کد میزنم شاید در این سورس جایی کد ها عیب دارن .. و بحث فیلتر با textchanged رو تست میکنم مجدد و نتیجه رو اعلام میکنم ..ممنون

mrhunter
شنبه 25 خرداد 1398, 09:35 صبح
دورود دوستان مجددا فقط بخش فیلتر کردن دیتاگرید رو با تابع و به دو صورت top و fetch نوشتم

کلیپ تست هم قرار دادم محبت کنید نگاه کنید و بگید آیا این delay الان طبیعی یا همچنان اشکال حساب میشه؟:متفکر::متفکر::متفکر:


لینک دانلود (http://s5.picofile.com/file/8363607234/repos.7z.html)

mrhunter
یک شنبه 26 خرداد 1398, 18:21 عصر
سلام دوستان کسی به نتیجه ای نرسید با سورس کد جدید؟ روش که بدون مشکل باشه

Mahmoud.Afrad
سه شنبه 28 خرداد 1398, 09:21 صبح
سلام دوستان کسی به نتیجه ای نرسید با سورس کد جدید؟ روش که بدون مشکل باشه

اگر تعداد رکوردها چند میلیون هست ، این زمان اجتناب ناپذیر هست. این را مدنظر قرار بدید هر چقدر رشته مورد جستجو طولانی تر بشه زمان طولانی تری هم نیاز هست. ایندکس معمولی هم به کار نمیاد چون از like استفاده میکنید.

از رویداد textchanged استفاده نکنید. به جاش یک رویداد بنویسید که بعد از اتمام تایپ جستجو انجام بشه.
و یا کاربر را مجبور کنید برای شروع جستجو دکمه ای را فشار دهد.
از full text search هم میتونید استفاده کنید.