PDA

View Full Version : افزایش Performance دیتابیس



idic1
شنبه 16 مرداد 1389, 16:13 عصر
با سلام خدمت دوستان
دیتابیسی داریم با حجم حدود 8 گیگ، اخیرا خیلی کند شده، بررسی ها نشان میدهد که
1- I/O Read Bytes و I/O Write Byte سرویس Sqlservr.exe شدیدا بالاست(حدود 30 گیگ Read در ساعت با 40 کاربر فعال)
2 - سرور دارای 8 گیگ رم میباشد ،و در تنظیمات Sql هم حداقل و حداکثر حافظه به ترتیب روی 5 گیگ و 6 گیگ قرار داده شده ولی sql فقط از دو و نیم گیگ رم فیزیکی و دو و نیم گیگ رم مجازی(Virtual Memory) ( جمعا 5 گیگ) بیشتر استفاده نمیکند و تقریبا همیشه 5 گیگ از رم فیزیکی سرور آزاد است

سوال:
1 - آیا استفاده از رم Virtual باعث افزایش شدید I/O و متعاقب آن کندی نشده؟
2 -ظاهرا Disable کردن Virtual Memory روی سرور به این سادگی ها میسر نیست، آیا راهی وجود دارد؟
3 - هاردهای این سرور بسیار قوی هستند آیا Defrag کردن هارد میتواند تاثیر چشمگیری داشده باشد؟
4 - چند نوع Defrag کردن دیتابیس داریم؟ (Defrag کردن اصل دیتابیس،Defrag کردن ایندکس ها , . . . ) دستور انجام این Defrag ها چیست؟
5 - اگر چیز دیگری به ذهن تان میرسد لطفا راهنمائی کنید؟

پیشاپیش متشکرم

FastCode
شنبه 16 مرداد 1389, 20:12 عصر
فکر میکنم اگر بگید توی دیتابیستون چی دارید مهمتر از همه ی این توصیفات باشه.
مشکل افزونگی داده ها؟
normalize نبودن جداول؟
استفاده از datatype های غلط؟

من هنوز دیتابیسی ندیدم که از 100 مگ بیشتر باشه و مشکل طراحی نداشته باشه.شاید من خیلی بی تجربه باشم,ولی معمولا" مشکل با چند تا تغییر کوچیک توی طراحی حل میشه.
اولین کاری که میتونید انجام بدید (پیشنهاد میکنم نیمه شب انجام بدید که تا صبح آماده بشه.) اینه که تمام constraint ها رو recreate کنید.
و پیجهای خالی دیتابیستون رو آزاد کنید.
فایل log رو بکاپ بگیرید و خالی کنید.
فکر میکنم همین کار سرعتتون رو 2 3 برابر بکنه.ولی معمولا" اگر یه ایراد طراحی رو حل بکنید سرعتتون توی این حجم داده چند هزار برابر میشه.

idic1
یک شنبه 17 مرداد 1389, 11:02 صبح
این دیتابیس مربوط به سیستم یکپارچه اتوماسیون اداری (شامل حسابداری، انبار، فروش، حقوق و . . .) میباشد که در زمان طراحی ، اصول طراحی صحیح بشدت رعایت شده. لیکن بدیهی است که قابل بهینه سازی نیز میباشد،ولی با توجه به پیچیدگی های چنین سیستم های جامعی این امر ساده و کم خطر (بد تر از قبل نشدن) نیست
این دیتابیس شامل 300 جدول، 50 ویو،120 SP و 120 تابع میباشد
تنها خبطی که انجام شده ، استفاده از جداول Temp در SP ها میباشد که احتمالا برطرف کردن آن در افزایش سرعت بی تاثیر نباشد.

پیشاپیش متشکرم

سوال:
1 - آیا برای Recreate کردن Constraint ها باید آنها را تک به تک Drop و مجددا Create کرد یا راه دیگری وجود دارد؟
2 - برای آزاد کردن پیجهای خالی دیتابیس از Shrink باید استفاده کرد یا راه دیگری دارد؟
و 5 سوال مطرح شده در پست اول ؟ ؟ ؟ ؟ ؟

ASKaffash
یک شنبه 17 مرداد 1389, 12:58 عصر
سلام
بهتر آن دستوراتی که کندی ایجاد میکند را با Profiler بررسی کنید شاید با ایندکس های مناسب یا تغییر دستورات یا File Group و ... سرعت افزایش یابد بعد به موضوع سخت افزاری باید پرداخت

idic1
یک شنبه 17 مرداد 1389, 15:38 عصر
از دوستان عزیز و مطلع درخواست دارم جهت راهنمائی به سوالات پاسخ دهند

AminSobati
دوشنبه 18 مرداد 1389, 00:06 صبح
سلام دوست عزیزم،
شما میتونین با ویرایش Boot.ini و اضافه کردن PAE/ و 3GB/ و همچنین فعال کردن گزینه AWE در SQL Server به حافظه بالای 2 گیگ دسترسی پیدا کنید. اما روش درست برای پیدا کردن مشکل Performance استفاده از Performance Monitor و Profiler هست

mehranmehran
دوشنبه 18 مرداد 1389, 10:03 صبح
سلام دوست عزیز

استفاده از Dashboard در پیدا کردن missing index ها بسیار موثر هست، همچنین rebield کردن و reorganize کردن ایندکس ها هم تاثیر بسیار زیادی در سرعت داره ، البته از همه مهمتر اینه که شما بتونین ریشه مشکلتون رو پیدا کنین که یکی از راه های استفاده از profiler هست ، و همچنین پیدا کردن کوئری های هزینه بر که در Dashboard آورده می شود .

idic1
دوشنبه 18 مرداد 1389, 10:10 صبح
ضمن سلام و تشکر از بذل عنایت
کلیه عملیاتی که شما اشاره کرده اید انجام شده است و نهایتا منجر شده است به سوالات فوق
اگر بزرگواری کرده و پاسخی به آنها بدهید مزید امتنان است
اجرکم عندالله

AminSobati
دوشنبه 18 مرداد 1389, 23:12 عصر
- Defrag کردن دیسک کمک محسوسی به سرعت دیتابیس شما نخواهد کرد، اما Defrag کردن دیتابیس میتونه (تا حدودی، اون هم برای بعضی کوئریها) مفید باشه
- کمبود RAM میتونه باعث کندی بشه اما با کمک Performance Monitor میشه پی برد که آیا مشکل از حافظه است یا خیر
- بعضی از تغییرات روی Constraintها نیاز به ساخت مجدد نداره، مثل فعال یا غیر فعال کردن Check Constraint اما تغییر در ماهیت، مثل اینکه چه شرطی رو چک کنه نیاز به ساخت مجدد داره
- از Shrink روی Data File اجتناب کنید چون Fragmentation به همراه داره. ولی روی Log File بلامانعه

FastCode
دوشنبه 18 مرداد 1389, 23:14 عصر
این کد تمام index ها رو recreate میکنه.



USE YOURDBNAME

GO

EXEC sp_MSforeachtable @command1="print '?' DBCC DBREINDEX ('?', ' ', 80)"

GO



این یکی حجم هر جدول رو میده.
معمولاً نتایج خوبی میده.



USE YOURDBNAME

EXEC sp_MSforeachtable 'SELECT ''?'', Count(*) as NumberOfRows FROM ?'