View Full Version : سوال در مورد کارایی دیتابیس
alimooghashang
چهارشنبه 19 تیر 1392, 16:23 عصر
سلام
من یه دیتابیس طراحی کردم با کلی جدول
الان یکی از جدول هام تعداد رکوردهاش شده 34,834,806 رکورد
و دستور
SELECT count( [id]) FROM [Data] رو که میزنم تقریبا روی سیستم خودم 3 دقیقه طول میکشه تا تعداد رکورد ها رو بده
آیا این طبیعیه یا یه جای کار میلنگه؟
حالا اگه بخوام رکوردهای بین 5000 تا 6000 رو بگیرم اونم خودش 5 6 دقیقه طول میکشه
چرا؟
ممنون
in_chand_nafar
چهارشنبه 19 تیر 1392, 16:34 عصر
اثراي از ايندكس در جدول شما است
در ضمن معمولا كوئري هاي شما نبايد تمام ركوردها رو به كاربر نمايش بدهد
به اين چند تا لينك سري بزنيد
وبینار افزایش سرعت و کارایی Database (http://www.nikamooz.com/%D9%85%D8%AD%D8%B5%D9%88%D9%84%D8%A7%D8%AA/%D8%AD%D9%88%D8%B2%D9%87-sql-server/webinar-%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4-%D8%B3%D8%B1%D8%B9%D8%AA-%D9%88-%DA%A9%D8%A7%D8%B1%D8%A7%DB%8C%DB%8C-database.html)
جنون سرعت در SQL Server 2012 (http://www.nikamooz.com/%D9%85%D8%AD%D8%B5%D9%88%D9%84%D8%A7%D8%AA/%D8%AD%D9%88%D8%B2%D9%87-sql-server/speed-%E2%80%8B%E2%80%8Bin-sql-server-2012.html)
alimooghashang
چهارشنبه 19 تیر 1392, 16:43 عصر
و یک سوال دیگه
اینکه تحت شبکه بهتره که کوئری به کدوم صورت نوشته بشه
آیا تفاوتی بین این دو روش هست؟
منظورم اینه که مثلا عملیات جستجوی دیتا داخل سرور انجام بشه و فقط نتیجه که یک جدول هست به کلاینت فرستاده بشه
کدومش بهتره؟
ممنون
string cmd = "SELECT id FROM data";
SqlDataAdapter adaptar = new SqlDataAdapter(cmd, sqlConnectionString);
adaptar.Fill(datatable);
یا بوسیله sp
SqlConnection conn = new SqlConnection(Global.sqlConnectionString);
SqlCommand command = new SqlCommand("sp_data", conn);
SqlCommand.CommandType = CommandType.StoredProcedure;
SqlCommand.CommandTimeout = 0;
conn.Open();
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
// fetch data
}
conn.Close();
alimooghashang
چهارشنبه 19 تیر 1392, 18:57 عصر
اثراي از ايندكس در جدول شما است
در ضمن معمولا كوئري هاي شما نبايد تمام ركوردها رو به كاربر نمايش بدهد
ایندکس یعنی چی؟ فقط یک فیلد ایندکس داریم اونم id هست
یعنی شما میگید که سمت سرور محاسبات انجام بشه و فقط نتیجه نمایش داده بشه؟
یعنی بار محاسبه روی سرور منتقل بشه؟
in_chand_nafar
چهارشنبه 19 تیر 1392, 22:47 عصر
منظورم اینه که مثلا عملیات جستجوی دیتا داخل سرور انجام بشه و فقط نتیجه که یک جدول هست به کلاینت فرستاده بشه
این راه درست است (اگر منظورتان همین باشد) جستجو در سمت سرور انجام بشود با فیلتر های مورد نظر شما و فقط رکوردهایی که مورد نیاز است به سمت کلاینت ارسال بشه نه N میلیون رکورد به سمت کلاینت
توی سایت نیک آموز یکسری پادکست در مورد روش های افزایش سرعت وجود داره اونها رو گوش بدین تا عیار و چارچوب کار دستتون بیاید
موفق باشید
alimooghashang
پنج شنبه 20 تیر 1392, 09:57 صبح
اها
حالا برای مثال من اگه من بنویسم و از داخل c# دستور رو اجرا کنم و جدولم رو fill کنم
select id from data where id between 5000 and 6000
و اگه یه پروسیجر بنویسم که داخلش همین باشه و اون رو صدا بزنم و طبق مثال انجامش بدم
select id from data where id between 5000 and 6000
تفاوتی دارن؟
ممنون
in_chand_nafar
پنج شنبه 20 تیر 1392, 10:49 صبح
ببين دوست عزيز اگر پارامترهاي شما قرار است عوض بشن بايد سراغ SP بري و SP شما دو پارامتر A,B رو بگيره و در Select جاي گذاري كنه
اون موقعه Plan كوئري Save مي شود و شما مي تونيد چند بار از اون استفاده كنيد
tooraj_azizi_1035
پنج شنبه 20 تیر 1392, 19:14 عصر
Result Set نهایی رو SQL Server بر می گردونه و در C# یا SQL Server نوشتن تنها فرقش در کاهش ترافیک شبکه است:
select sum(row_count) from sys.dm_db_partition_stats where object_id = object_id('TableName') and index_id < 2
m.webgard
جمعه 21 تیر 1392, 00:38 صبح
سلام
دوست عزیز، حتما مواردی که مربوط به پایگاه داده میشه رو به موتور پایگاه داده بسپار. این باعث افزایش سرعت میشه. به اینصورت که فرآیند موردنظرت رو در پایگاه داده انجام بده و فقط رکوردهای خروجی رو بیار سمت برنامت.
موفق باشید
alimooghashang
چهارشنبه 26 تیر 1392, 13:24 عصر
آیا این طبیعیه که دیتابیس بعد از یک روز کارکردن دقیقا 12 گیگ از رم رو بگیره و نه کم بشه نه زیاد؟
رم من الان 16 گیگه ولی دیتابیسم بعد از چند ساعت کار کردن به 12 گیگ میرسه و روی همون میمونه
دلیلیش چیه؟
in_chand_nafar
چهارشنبه 26 تیر 1392, 16:23 عصر
بله SQL به شدت از RAM استفاده مي كند!
بزگترين قسمت حافظه مختص به SQL مربوط به Buffer Pool است كه Pageها در اونجا قرار مي گيرند.
كاربران و شما كه Select ها رو اجرا مي كنيد Pageهاي مربوط به جداول و ... در حافظه Ram قرار مي گيره و حالا حالا ها از حافظه خارج نمي شه بايد هم اينطوري باشه اگر SQL مدام براي كوچكترين واكشي با ديسك درگير بشه (Physical IO) سرعت به شدت كاهش پيدا مي كنه .
براي افزايش Performance مي توانيد از ايندكس و... استفاده كنيد.
در ضمن اگر مي خواهيد Maximum Memory براي SQL Server را تنظيم كنيد مي توانيد از دستور
sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'max server memory', xxxxx;
GO
RECONFIGURE;
GO
xxxxx : حافظه تخصيص داده شده به SQL بر حسب MB
in_chand_nafar
چهارشنبه 26 تیر 1392, 16:29 عصر
در انتهاي صفحه مربوط به لينك زير چندتا فيلم است كه كمي درباره اين موضع بحث كرده
http://www.nikamooz.com/%D9%85%D8%AD%D8%B5%D9%88%D9%84%D8%A7%D8%AA/%D8%AD%D9%88%D8%B2%D9%87-sql-server/speed-%E2%80%8B%E2%80%8Bin-sql-server-2012.html
در ضمن اين موضوع هم در وبينار بررسي شده است.
http://www.nikamooz.com/%D9%85%D8%AD%D8%B5%D9%88%D9%84%D8%A7%D8%AA/%D8%AD%D9%88%D8%B2%D9%87-sql-server/webinar-%D8%A7%D9%81%D8%B2%D8%A7%DB%8C%D8%B4-%D8%B3%D8%B1%D8%B9%D8%AA-%D9%88-%DA%A9%D8%A7%D8%B1%D8%A7%DB%8C%DB%8C-database.html
mahan.2002
پنج شنبه 27 تیر 1392, 01:36 صبح
آیا این طبیعیه که دیتابیس بعد از یک روز کارکردن دقیقا 12 گیگ از رم رو بگیره و نه کم بشه نه زیاد؟
رم من الان 16 گیگه ولی دیتابیسم بعد از چند ساعت کار کردن به 12 گیگ میرسه و روی همون میمونه
دلیلیش چیه؟
سلام دوست عزیز
من یکم تعجب میکنم از حجم دیتا بیس شما ...
یه احتمالی هم که وجود داره باید نوع طراحی که برای دیتا بیس تو انجام دادید رو مورد باز بینی قرار بدین... احتمال داشتن افزونگی هم هست ..
که بعضی معمولا در این مورد اشتباه میکند و افزونگی برنامه بالا میره ...
اگر نوع طراحی و جداولی که برای برنامه تعریف کردین رو بیان کنید.. راحت تر میشه در این مورد اظهار نظر کرد ..
موفق باشین
alimooghashang
پنج شنبه 27 تیر 1392, 10:16 صبح
سلام دوست عزیز
من یکم تعجب میکنم از حجم دیتا بیس شما ...
یه احتمالی هم که وجود داره باید نوع طراحی که برای دیتا بیس تو انجام دادید رو مورد باز بینی قرار بدین... احتمال داشتن افزونگی هم هست ..
که بعضی معمولا در این مورد اشتباه میکند و افزونگی برنامه بالا میره ...
اگر نوع طراحی و جداولی که برای برنامه تعریف کردین رو بیان کنید.. راحت تر میشه در این مورد اظهار نظر کرد ..
موفق باشین
ممنون افزونگی یعنی چی؟
mahan.2002
پنج شنبه 27 تیر 1392, 14:51 عصر
افزونگی یعنی تکرار بی رویه داده ها .. که این مورد باعث بالا رفتن حجم دیتابیس میشود ..
که این حالت اغلب بدلیل طراحی نادرست و بقولی آنرمال پایگاه داده پیش میاد ..
که میتونید در بعضی از کتاب های پایگاه داده در بخش نرمال سازی مطالعه کنید ..
البته دوتا لینک میزارم برای اشنایی میتونید مطالعه کنید.
لینک 1 (http://dce.iauq.ac.ir/imagesMasterPage/Files/mohebi/file/paygah/normalsazi.pdf) لینک 2 (http://www.hpkclasses.ir/Courses/DataBase/db0900.html)
البته برای اینکه راحت تر بشه راهنمایی تون کرد .. جداولی که برای بانک اطلاعاتی طراحی کردید بزارید ( البته با یه توضیح در مورد هر جدول و برنامه )
تا سریع تر بتونید به نتیجه برسید ..
alimooghashang
پنج شنبه 27 تیر 1392, 22:52 عصر
عرضم به حضور شما که دیگه تا این حدم خنگ نیستیم ببخشیدا
ولی افزونگی فکر نمیکنم داشته باشیم
یعنی نداریم
برنامه ای که من دارم در ثانیه تقریبا 50 رکورد وارد دیتابیس میکنه و مدام داره کار میکنه
فکر کنم این طبیعی باشه که 12 گیگ از رم رو بگیره
نه؟
محمد سلیم آبادی
جمعه 28 تیر 1392, 16:46 عصر
برنامه ای که من دارم در ثانیه تقریبا 50 رکورد وارد دیتابیس میکنه و مدام داره کار میکنه
برام جالبه بدون این حجم وسیعی از بروزرسانی به چه دلیلی هست. میتونید توضیح بدین این داده ها چطور تولید میشن و از کجا بدست میان؟
mahan.2002
جمعه 28 تیر 1392, 16:59 عصر
عرضم به حضور شما که دیگه تا این حدم خنگ نیستیم ببخشیدا
ولی افزونگی فکر نمیکنم داشته باشیم
یعنی نداریم
برنامه ای که من دارم در ثانیه تقریبا 50 رکورد وارد دیتابیس میکنه و مدام داره کار میکنه
فکر کنم این طبیعی باشه که 12 گیگ از رم رو بگیره
نه؟
مهم 50 يا 100 ركورد یا 1000 رکورد نیست ..
مهم عملکرد بهنه یک دیتابیسه که بتونه در کمترین زمان و سبک ترین حجم بهترین سرویس رو به شما و کاربراتون بدهد..
طراحی توی دیتابیس خودش میتونه یه راهی ارائه کنه که شما در بهترین شرایط اطلاعاتون رو بازیابی کنید.. و اگر این مد نظر قرار نگیر برای مراحل بعدی و کوئری نویسی های بعدی و Join کردن ها میتونه زمان شما و همچنین حجم دیتابیس شما رو بالا ببره..
ضمنااا در مورد صحبت اولتون من جسارت نکرد ..
گفتید افزونگی چیه من دوتا لینک گزاشتم .. حالا اگر نمیخواید ایرادی نداره..
منم خودمم از بقیه یاد میگیرم ..
حالا اگه جداول تون یا نوع طراحی تون رو بزارید ضرر ندار .. چک کنید.. ( البته یه عکس از دیاگرامتونم میتونید بزارید برای راحتی کارتون )
...
alimooghashang
یک شنبه 30 تیر 1392, 15:44 عصر
البته دوتا لینک میزارم برای اشنایی میتونید مطالعه کنید.
لینک 1 (http://dce.iauq.ac.ir/imagesMasterPage/Files/mohebi/file/paygah/normalsazi.pdf) لینک 2 (http://www.hpkclasses.ir/Courses/DataBase/db0900.html)
البته برای اینکه راحت تر بشه راهنمایی تون کرد .. جداولی که برای بانک اطلاعاتی طراحی کردید بزارید ( البته با یه توضیح در مورد هر جدول و برنامه )
تا سریع تر بتونید به نتیجه برسید ..
لینک ها رو مطالعه کردم
هیچ افزونگی ای در داخل دیتابیس وجود نداره و هنگام طراحی دیتابیس به اون ها توجه شده
فقط یه چیزی
داخل طراحی دیتابیس ، هیچ ریلیشنی برای فیلد ها تعریف نشده
آیا ریلیشن ها بین جداول لازم هستند؟ و چرا لازم هستند؟
سیستمی که ما باش سر و کار داریم بصورت لحظه ای داره اطلاعات 500 کلاینت رو که به سرور درخواست میدن رو بررسی میکنه و جمع آوری میکنه
هر کلاینت 1 دقیقه یک بار به سرور درخواست و اطلاعات خودش رو ارسال میکنه
برای همینه که همواره sql server در حال پاسخ دادن به درخواست هاست!
alimooghashang
دوشنبه 31 تیر 1392, 13:06 عصر
یه سوالی که من دارم اینه
من الان داخل دیتابیسم 60 ملیون رکورد دارم
وقتی این دستور رو داخل sql server اجرا میکنم چقدر باید طول بکشه
select * from data where date like '1392/04/31'
و تعداد رکوردهایی که تاریخشون با این تاریخ یکیه 500 هزار رکورد هست!
یعنی انتخاب 500 هزار رکورد از داخل 60 ملیون رکورد
ممنون
alimooghashang
دوشنبه 31 تیر 1392, 13:18 عصر
چیزی که خودم فهمیدم اینه که عملگر like نسبت به عملگر > < خیلی زمانبر تره
و من این رو نمیدونستم
همین دستور رو با > تست کردم خیلی سریع در حد 4 ثانیه رکورد ها رو اورد
ولی با Like 40 ثانیه طول کشید
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.