samispeed
دوشنبه 11 خرداد 1388, 12:56 عصر
نکاتی در مورد بهینه سازی Transact-SQL
نمی دونم تا حالا در این مورد صحبتی شده یا نه اما این ها نکات کلیدی که به درد من زیاد خورده گفتم شاید برای شما هم کاربرد داشته باشه و باعث بالا رفتن سرعت برنامه تون بشه
· با استفاده از شرط WHERE سعی کنید نتایج query هاتون رو محدود کنید :
این کار باعث افزایش کارآیی می شود چون فقط سطرهای خاصی را Sql server بر می گرداند نه تمام سطرها و باعث کاهش ترافیک شبکه می شود
· تنها ستون های از جدول را که احتیاج دارید انتخاب کنید نه تمام ستون های جدول
· از View و stored procedure ها به جای query های که مخصوص کارهای پیچیده و متن طولانی داره استفاده کنید :
که باعث کاهش ترافیک شبکه می شود چون کلاینت فقط اسم view یا stored procedure (یا بعضی پارامتر ها) را به سرور می فرستد در حالیکه تو حالت دوم متن طولانی از query را می فرستد
· تا جایی که امکان دارد از cursor ها استفاده نکنید
چون وقتی که اطلاعات زیاد بشه باعث کندی سیستم و همچنین قفل شدن جدول می شود
· اگر احتیاج داشتید که تعداد کل ردیف های جدول را بدست آورید می توانید به جای عبارت
Select count (*) از راه حل دیگری استفاده کنید :
چون این عبارت یک جدول را بطور کامل scan می کند تا تعداد ردیف های جدول را بدست بیاورد برای جدول هایی با اطلاعات زیاد زمان زیادی می برد . راه دیگری که وجود دارد این است که می توانیم از جدول sysindexes
استفاده کنیم ستونی در این جدول وجود دارد که تعداد کل ردیف های هر جدولی که در پایگاه داده ما قرار دارد را نمایش می دهد شما می توانید با این دستور
SELECT rows
FROM sysindexes
WHERE id = OBJECT_ID('table_name') AND indid < 2
تعداد کل یک جدول را بدست آورید که باعث می شود سرعت جوابگیری بهینه شود
· تا جایی که امکان دارد از Constraint ها به جای Trigger ها استفاده کنید چون کارآیی بالاتری دارند
· بهتر است از شرط HAVING تا جایی که امکان دارد کمتر استفاده شود :
وقتی GROUP BY با شرط HAVING استفاده می شود شرط GROUP BY سطرها را به دسته ای از سطرهای گروه بندی شده تقسیم می کند و سپس شرط HAVING گروههای نامطلوب را حذف می کند در بیشتر موارد می توانید از WHERE و GROUP BY بدون HAVING استفاده کنید که این کار کارآیی QUERY را بهبود می بخشد .
· تا جایی که امکان دارد از شرط DISTINCT استفاده نکنید
· از عبارت SETNOCOUNTON در stored procedure ها استفاده کنید :
چون باعث می شود ترافیک شبکه کاهش پیدا کند چون کلاینت پیغام number of rows affected را دریافت نمی کند
· از SELECT بهمراه TOP یا SET ROWCOUNT زمانیکه می خواهید چند ردیف را نشان دهید استفاده کنید :
چون نتایج کوچکتری را برمی گرداند باعث کاهش ترافیک بین سرور و کلاینت می شود.
· از transactions ها استفاده کنید مخصوصا برای Query های که مدت زمان اجرای آنها طولانی است.
· از نوع داده TEXT و NTEXT فقط در مواردی که اطلاعات واقعا زیاد استفاده کنید چون این نوع داده در Query ها کند و انعطاف پذیری کمی دارد .
همیشه برنامه هاتون با داده زیاد تست کنید چون وقتی با یک حجم اطلاعاتی کم برنامه تون تست می کنید ممکنه سرعت خوبی داشته باشد اما وقتی کاربر نهایی اون را با داده های زیاد اجرا می کند سرعت برنامه تون کاهش پیدا کنه .
نمی دونم تا حالا در این مورد صحبتی شده یا نه اما این ها نکات کلیدی که به درد من زیاد خورده گفتم شاید برای شما هم کاربرد داشته باشه و باعث بالا رفتن سرعت برنامه تون بشه
· با استفاده از شرط WHERE سعی کنید نتایج query هاتون رو محدود کنید :
این کار باعث افزایش کارآیی می شود چون فقط سطرهای خاصی را Sql server بر می گرداند نه تمام سطرها و باعث کاهش ترافیک شبکه می شود
· تنها ستون های از جدول را که احتیاج دارید انتخاب کنید نه تمام ستون های جدول
· از View و stored procedure ها به جای query های که مخصوص کارهای پیچیده و متن طولانی داره استفاده کنید :
که باعث کاهش ترافیک شبکه می شود چون کلاینت فقط اسم view یا stored procedure (یا بعضی پارامتر ها) را به سرور می فرستد در حالیکه تو حالت دوم متن طولانی از query را می فرستد
· تا جایی که امکان دارد از cursor ها استفاده نکنید
چون وقتی که اطلاعات زیاد بشه باعث کندی سیستم و همچنین قفل شدن جدول می شود
· اگر احتیاج داشتید که تعداد کل ردیف های جدول را بدست آورید می توانید به جای عبارت
Select count (*) از راه حل دیگری استفاده کنید :
چون این عبارت یک جدول را بطور کامل scan می کند تا تعداد ردیف های جدول را بدست بیاورد برای جدول هایی با اطلاعات زیاد زمان زیادی می برد . راه دیگری که وجود دارد این است که می توانیم از جدول sysindexes
استفاده کنیم ستونی در این جدول وجود دارد که تعداد کل ردیف های هر جدولی که در پایگاه داده ما قرار دارد را نمایش می دهد شما می توانید با این دستور
SELECT rows
FROM sysindexes
WHERE id = OBJECT_ID('table_name') AND indid < 2
تعداد کل یک جدول را بدست آورید که باعث می شود سرعت جوابگیری بهینه شود
· تا جایی که امکان دارد از Constraint ها به جای Trigger ها استفاده کنید چون کارآیی بالاتری دارند
· بهتر است از شرط HAVING تا جایی که امکان دارد کمتر استفاده شود :
وقتی GROUP BY با شرط HAVING استفاده می شود شرط GROUP BY سطرها را به دسته ای از سطرهای گروه بندی شده تقسیم می کند و سپس شرط HAVING گروههای نامطلوب را حذف می کند در بیشتر موارد می توانید از WHERE و GROUP BY بدون HAVING استفاده کنید که این کار کارآیی QUERY را بهبود می بخشد .
· تا جایی که امکان دارد از شرط DISTINCT استفاده نکنید
· از عبارت SETNOCOUNTON در stored procedure ها استفاده کنید :
چون باعث می شود ترافیک شبکه کاهش پیدا کند چون کلاینت پیغام number of rows affected را دریافت نمی کند
· از SELECT بهمراه TOP یا SET ROWCOUNT زمانیکه می خواهید چند ردیف را نشان دهید استفاده کنید :
چون نتایج کوچکتری را برمی گرداند باعث کاهش ترافیک بین سرور و کلاینت می شود.
· از transactions ها استفاده کنید مخصوصا برای Query های که مدت زمان اجرای آنها طولانی است.
· از نوع داده TEXT و NTEXT فقط در مواردی که اطلاعات واقعا زیاد استفاده کنید چون این نوع داده در Query ها کند و انعطاف پذیری کمی دارد .
همیشه برنامه هاتون با داده زیاد تست کنید چون وقتی با یک حجم اطلاعاتی کم برنامه تون تست می کنید ممکنه سرعت خوبی داشته باشد اما وقتی کاربر نهایی اون را با داده های زیاد اجرا می کند سرعت برنامه تون کاهش پیدا کنه .