PDA

View Full Version : select کردن 1 میلیون رکورد چرا باید اینقدر زمان ببره؟



mehdiba3
دوشنبه 08 اردیبهشت 1393, 13:21 عصر
خواستم سرعت اجرای stored procedure رو امتحان کنم نسبت به روش نوشتن کوئری در خود برنامه ای مثل سیشارپ که بر به مشکل خوردم. مشکل من اینه :
یک پایگاه داده با 1 میلیون رکورد ایجاد کردم بعد با 2 روش این رکورد ها رو فراخونی کردم و درون data table قرار دادم و بعدش تو datagirdview نمایش دادم
روش اول که تو خود محیط C# کوئری رو نوشتم
string str = "select * from tbl ";
SqlConnection a = new SqlConnection(@"Data Source=.;Initial Catalog=phonbook;Integrated Security=True");
a.Open();
SqlCommand b = new SqlCommand();
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(str, a);
da.Fill(dt);
dataGridView1.DataSource = dt;

این روش معمولی هستش که 15 ثانیه طول می کشه تا تمام 1 میلیون رکورد رو نمایش بده که زمان زیادیه.

همین روش رو با SP پیاده کردم و تو datagird بازم نمایش دادم که زمان شد 11 ثانیه ولی بازم این زمان برام خیلی زیاده و میخوام به محض اینکه دکمه نمایش رو زدم در حد اقل زمان اطلاعات رو نمایش بده.
بنظرتون مشکل من از کجا بوده؟ چرا اینقدر زمان برای نمایش اطلاعات از بانک تلف میشه؟
آیا این عادیه برای 1 میلیون رکورد؟

ممنون

Mr.orange
دوشنبه 08 اردیبهشت 1393, 13:44 عصر
این بحث تقریبا تخصصیه مربوط میشه یه بانک!
این زمان کاملا به ساختار بانک و نحوه طراحی اون بستگی داره؛ خیلی عوامل دخیل هستند که باید در هنگام طراحی بانک پیاده سازی بشند؛ که همشون با مطالعه و تجربه به دست میان.

mehdiba3
دوشنبه 08 اردیبهشت 1393, 13:49 عصر
حالا بنظرت چه تجربه و چه ساختاری نیازیه؟ میشه یک راهنمایی بکنید

rahnema1
دوشنبه 08 اردیبهشت 1393, 13:53 عصر
سلام
خواندن داده ها وآوردن روی حافظه زمانی نمی بره مشکل وقتیه که بخواد در datagridview نمایش بده چون لازمه تعداد زیادی سلول ایجاد بشه
یک روش برای حل این مشکل اینه که یک datagridview درست کنید که مثلا 50 تا سطر داشته باشه و هر وقت که scrollbar کنار اون را جابجا کنید صد تا داده را از datatable بخونه و داخل datagridview بریزه

hamid_hr
دوشنبه 08 اردیبهشت 1393, 14:09 عصر
1 میلیون رکورد همزمان که دیده نمیشه
باید دسته بندی کنی و مثلا 20 تا 20 تا یا 50 تا 50 تا نشون بدی
این روشی رو که اقای rahnema1 (http://barnamenevis.org/member.php?305905-rahnema1) هم فرمودن عالیه

mehdiba3
دوشنبه 08 اردیبهشت 1393, 14:19 عصر
من همین الان تو خود sql server یک کوئری برای نمایش هین اطلاعات نوشتم. میدونید چند ثانیه طول کشید؟ دقیق 11 ثانیه.
بعنی به اندازه زمانی که SP رو تو محیط c# نشون دادم به وسیله datagridview
من سوالم رو اینجا مطرح کردم و شما دوستان پاسخ دادیدن اما بنظرم شما هم مثل من نمیدونید مشکل کجاست. تا الان متوجه شدم مشکل نو محیط سیشارپ نیست.
یا 1 میلیون رکورد خیلی زیاده و این زمان 11 ثانیه طبیعیه برای اجرای کامل یا باید یک جوری یادش بگیرم.
آخه دستور من خیلی سادس یک جدول هم بیشتر نداره که بگیم نوع اینر جوین یا بهینه بودن کد مهمه. یک دستور ساده Select هستش

rahnema1
دوشنبه 08 اردیبهشت 1393, 14:24 عصر
از اون کدی که اینجا گذاشتید این خط را کامنت کنید
dataGridView1.DataSource = dt;

چند ثانیه طول می کشه؟
یک بار دیگه مطلبی را که در پست قبل نوشتم با دقت بخونید

danialafshari
دوشنبه 08 اردیبهشت 1393, 17:39 عصر
من همین الان تو خود sql server یک کوئری برای نمایش هین اطلاعات نوشتم. میدونید چند ثانیه طول کشید؟ دقیق 11 ثانیه.
بعنی به اندازه زمانی که SP رو تو محیط C#‎‎‎‎‎‎‎‎‎‎ نشون دادم به وسیله datagridview
من سوالم رو اینجا مطرح کردم و شما دوستان پاسخ دادیدن اما بنظرم شما هم مثل من نمیدونید مشکل کجاست. تا الان متوجه شدم مشکل نو محیط سیشارپ نیست.
یا 1 میلیون رکورد خیلی زیاده و این زمان 11 ثانیه طبیعیه برای اجرای کامل یا باید یک جوری یادش بگیرم.
آخه دستور من خیلی سادس یک جدول هم بیشتر نداره که بگیم نوع اینر جوین یا بهینه بودن کد مهمه. یک دستور ساده Select هستش

با سلام
باید خدممتون عرض کنم که load اطلاعات در هر سیستم متغیر هست و بستگی به قطعات سخت افزاری از جمله cpu و ram حتی نرم افزاری و آزاد بودن cpu داره
یکی از مشکلات برنامه نویسان اینه که می خوان همه اطلاعات رو یکجا نشون بدن که اصلاً کاربر به این همه اطلاعات نیازی نداره
در برنامه های تجاری و اتوماسیون اداری هم اگر مشاهده کنید بیشترشون روی فیلتر برنامه ریزی کردن که Performance و کارایی رو بالا میبره
برای نمایش رکورد های زیاد هم راهکارهایی از جمله راهکار بالا وجود داره و در سایت هم بحث شده
موفق باشید

رامین مرادی
دوشنبه 08 اردیبهشت 1393, 17:48 عصر
دوست عزیز پیجینگ رو واسه همین گذاشتن دیگه..... شما با یه دستور سلکت میخواید یک میلیون رکورد رو به کاربر نشون بدید :متعجب:
آره اگه واقعا نیاز به نمایش همین تعداد داده دارید باید سخت افزارتون رو هم بهینه کنید. مطمئنن سیستمی که همچین پایگاه داده ای ئاره و ممکنه از چندجا به این داده ها نیاز داشته باشن باید حداقل یه سرور اختصاصی براش را بندازید ..... البته من توی زمینه پایگاه داده مبتدی هستم .اساتید بزرگوار بهتر میتونن کمکتون کنن....

Mousavmousab
دوشنبه 08 اردیبهشت 1393, 17:54 عصر
شما فقط گفتید یک table و یک میلیون Record و وارد جزئیات نشدید.

برای شما فرقی نداره که یک Table یک field داشته باشه یا 20 تا ؟ مطئناٌ فرق داره
حالا Table شما چند تا فیلد داره ؟ از چه نوعی است ؟

در ضمن شما از روش * Select استفاده نکنید . دقیقاٌ نام تمام فیلد ها را ذکر کنید. در ضمن در صورتی که فیلدی را نیاز ندارید حتی یک فیلد هم نیاز ندارید از ذکر آن پرهیز کنید تا SQL تمام Data را Analyze نکنه
موفق باشید

aghayex
دوشنبه 08 اردیبهشت 1393, 18:03 عصر
این قضیه مربوط به پرفرمنس دیتابیست میشه مثلا اگه شما از ایندکس ها استفاده کنی سرعت بالا می ره و ...
به شما توصیه می کنم یه سری به سایت نیک آموز بزنید و فایل های صوتی اون بزرگوار رو بشنوید

mehdiba3
دوشنبه 08 اردیبهشت 1393, 19:42 عصر
دیتا بیس من 1 میلیون رکورد و در هر رکورد 4 فیلد همونم از نوع nvarchar تعریف شده که رویس هم 4 میلیون رکورد میشه.
چنتا از دوستان از روش ایندکس گذاری گفتن. میشه توضیح بفرمایید ایندکس چیه؟

aghayex
دوشنبه 08 اردیبهشت 1393, 22:56 عصر
دوست عزیز شما اگه سری به این سایت بزنید حساب دستتون میاد.