خانه SQL Server کوئریهای مهم در SQL Server | بخش اول SQL Server دستورات SQL نوشته شده توسط: غلامحسین عبادی تاریخ انتشار: ۲۴ اردیبهشت ۱۴۰۱ آخرین بروزرسانی: 10 آذر 1403 زمان مطالعه: 8 دقیقه ۵ (۳) کوئری در SQL Server، شما به عنوان یک برنامه نویس و یا متخصص پایگاه داده باید کوئریهای مهم و کاربردی را در دسترس داشته باشید تا هنگام وقوع مشکلات ناگهانی و وقوع disaster بلافاصله از آنها جهت حل مشکلات استفاده کنید. نکته حائز اهمیت این است که یک DBA حرفه ای میداند که در این مواقع باید خونسردی خود را حفظ کند. در این آموزش سعی شده تا شما را با چند تا از کوئری های مهم آشنا کنیم. پیشنهاد میکنیم برای درک بهتر مفاهیم آموزش جامع SQL Server را مطالعه کنید. ۱. کوئری اول (بدست آوردن میزان پیشرفت دستورات بکاپ و ریستور) کوئری در SQL Server، از این کوئری شما می توانید جهت مشاهده میزان پیشرفت Backup و یا مشاهده میزان پیشرفت Restore و همینطور می توانید جهت مشاهده میزان پیشرفت دستورات DBCC (مانند DBCC CheckDB و غیره ) استفاده نمایید. متن این کوئری: SELECT session_id, command, s.text, start_time, percent_complete, CAST(((DATEDIFF(s,start_time,GetDate()))/3600) as varchar) + ' hour(s), ' + CAST((DATEDIFF(s,start_time,GetDate())%3600)/60 as varchar) + 'min, ' + CAST((DATEDIFF(s,start_time,GetDate())%60) as varchar) + ' sec' as running_time, CAST((estimated_completion_time/3600000) as varchar) + ' hour(s), ' + CAST((estimated_completion_time %3600000)/60000 as varchar) + 'min, ' + CAST((estimated_completion_time %60000)/1000 as varchar) + ' sec' as est_time_to_go, dateadd(second,estimated_completion_time/1000, getdate()) as est_completion_time FROM sys.dm_exec_requests r CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) s WHERE r.command in ('RESTORE DATABASE','BACKUP DATABASE') OR r.command like 'DBCC%' لازم به ذکر است که ویو سیستمی sys.dm_exec_requests ، در واقع اطلاعاتی را در مورد تمام در خواست های اجرا شده در اسکیوال سرور به ما نشان می دهد. تذکر : ما می توانیم به کمک ویوهای سیستمی زیر اطلاعاتی را راجع به درخواست هایی که به سمت اسکیوال سرور ارسال شده اند را ببینیم. ویو سیستمی dm_exec_requests ویو سیستمی dm_exec_connections ویو سیستمی dm_exec_sessions ویو سیستمی sysprocesses SP سیستمی sp_who SP سیستمی sp_who2 دقت کنید که Session_id های بالای ۵۰ مربوط به کوئری های کاربران می باشد. تذکر : ویوهای سیستمی از نسخه SQL Server 2005 اضافه شدند. همچنین لازم به ذکر است که در کوئری فوق از فانگشن سیستمی sys.dm_exec_sql_text جهت مشاهده متن کوئری در حال اجرا استفاده شده است. پیشنهاد میکنیم برای درک بهتر مفاهیم دوره کوئری نویسی پیشرفته را مطالعه کنید. تذکر: چنانچه بخواهید یک DMV و یک DMF را با هم جوین کنید باید از دستور Cross Apply استفاده کنید. ستونهای مربوط به این کوئری: Session_id: شماره سشن Command: نوع عملیات جاری (که میتواند Backup و یا Restore و یا یکی از عملیات DBCC باشد). text: متن کوئری در حال اجرا را نشان می دهد. start_time: زمان شروع عملیات را نشان می دهد. Percent_complete: درصد پیشرفت کار را نمایش می دهد running_time: مدت زمان سپری شده جهت انجام عملیات مورد نظر est_time_to_go: زمان تقریبی باقیمانده عملیات جاری est_completion_time: زمان تقریبی اتمام عملیات جاری پس از اجرای این کوئری مطابق شکل زیر شما می توانید اطلاعات ارزشمند زیر را داشته باشید: ۲. کوئری سوم (بدست آوردن میزان fragmentation کلیه ایندکس های مربوط به یک دیتابیس) کوئری در SQL Server، به کمک این کوئری می توانیم میزان fragmentation (به معنی متلاشی شده و یا از هم گسیخته شدن) کلیه ایندکس های مربوط به کلیه جداول یک دیتابیس را بدست آوریم. کد مربوط به این کوئری به صورت زیر می باشد. SELECT OBJECT_NAME(ips.OBJECT_ID) as TableName ,i.NAME as IndexName ,ips.index_id ,index_type_desc ,avg_fragmentation_in_percent ,page_count FROM sys.dm_db_index_physical_stats(DB_ID(), NULL, NULL, NULL, 'SAMPLED') ips INNER JOIN sys.indexes i ON (ips.object_id = i.object_id) AND (ips.index_id = i.index_id) ORDER BY avg_fragmentation_in_percent DESC پس از اجرای کد فوق میزان فرگمنت مربوط به کلیه ایندکس های یک دیتابیس را مشاهده خواهیم کرد. به شکل زیر دقت کنید. در این کوئری از فانگشن سیستمی sys.dm_db_index_physical_stats() و همچنین از ویو سیستمی sys.index استفاده شده است. تذکر: به کمک فانگشن سیستمی sys.dm_db_index_physical_stats می توانیم میزان فرگمنت ایندکس ها را بدست آوریم. ستون های مربوط به کوئری فوق به صورت زیر می باشد : TableName: نام جدول IndexName: نام ایندکس موجود در جدول Index_id: ID مربوط به ایندکس Index_type_desc: نوع ایندکس Avg_fragmentation_in_percent: درصد فرگمنت یک ایندکس Page_count: تعداد صفحات یک ایندکس تذکر: دقت کنید دوستان روی دیتابیس های عملیاتی واقعی هیچگاه از این کوئری استفاده نکنید چون باعث کندی دیتابیس شما خواهد شد. رفع مشکل مربوط به fragmentation به صورت موقت کوئری در SQL Server، مشکل Fragmentation را می توان توسط دو دستور Rebuild و یا Reorganize کردن ایندکس ها برطرف نمود. این کار را بعضی از افراد به کمک Maintenance Plan انجام می دهند و بعضی دیگر به کمک اسکریپت هایی که آماده کرده اند (این اسکریپت ها را معمولا به صورت Job تنظیم می نمایند)، انجام می دهند. چنانچه میزان fragmentation ایندکس شما بین ۱۰ تا ۳۰ درصد بود از دستور Reorganize جهت برطرف کردن fragmentation ایندکس ها استفاده کنید و چنانچه میزان fragmentation ایندکس ها شما بالاتر از ۳۰ درصد بود در این صورت از دستور Rebuild جهت بر طرف کردن fragmentation ایندکس ها استفاده کنید. ولی یادتان باشد این فرمول همیشه درست نیست و بهتر است همیشه خودتان ایندکس ها را با توجه به Queryهایتان بررسی کنید و به عنوان یک DBA بهترین تصمیم را بگیرید. همچنین شما می توانید با تنظیمات آپشن مربوط به Fill Factor میزان Fragmentation را تقریبا بر طرف نمایید. منظور از Fill Factor میزان فضای رزروی که می توانیم برای Page هایی که در قسمت Leaf Level ایندکس ها قرار دارند، در نظر گرفت. به مثال زیر دقت کنید. Alter Index IX_tblKala_Des ON tblKala Rebuild with (online=on, FillFactor=90) همچنین لازم به ذکر است که عدد مربوط به fillfactor را باید با سعی و خطا به دست آورد. به طور مثال یک بار با عدد ۹۰ تست می کنیم ولی اگر ببینیم که همچنان فرگمنت داریم عدد را به ۸۵ کاهش می دهیم و اگر باز هم ببینیم که فرگمنت داریم این عدد را به ۸۰ کاهش می دهیم. دقت کنید که با تنظیم این آپشن میزان IO شما افزایش خواهد یافت که باعث کاهش Performance خواهد شد. بهتر است مشکل را اساسی حل کنید مثلا به Data Type ها مراجعه کرده و آنها را درست کنید تا برای همیشه از شر مشکل مربوط به Fragmentation خلاص شوید. تذکر: دستورات DML (Insert , Delete , Update)، خصوصا دستور Update می تواند باعث ایجاد مشکل مربوط به fragmentation شود. تذکر: Fragmentation می تواند باعث افزایش IO و همچنین باعث افزایش ترافیک شبکه و نهایتا باعث کاهش Performance و کاهش سرعت کوئری های شما شود. تذکر مهم: هیچگاه روی فیلدهای incremental و همچنین روی فیلدهای کلید اصلی آپشن Fillfactor را تنظیم نکنید. تذکر مهم: در سیستم های عملیات و Production دقت کنید که حتما و حتما آپشن online=on را هنگام Rebuild ایندکس ها استفاده نمایید. انواع Fragmentation ۱ – Internal Fragmentation: در اثر وجود فضای غیرقابل استفاده در یک Page ایجاد می شود. این نوع فرگمنت می تواند به طور مثال از اثر Delete کردن رکوردها ایجاد شود. ۲ – External Fragmentation: در این نوع فرگمنت ترتیب منطقی صفحات با ترتیب فیزیکی صفحات یکی نیستند. ۳ – File Fragmentation: این نوع فرگمنت زمانی رخ می دهد که قسمت های مختلف یک فایل (دیتا فایل) در اثر وجود فایل های دیگر(مثلا فایلها اکسل و یا ورد و یا فایل های بکاپ و یا فایل های دیگر) سر راه خود ، در قسمت های مختلف دیسک ذخیره شوند. مشکل مربوط به File Fragmentation را می توانیم به کمک Backup و سپس Restore حل نماییم. همچنین اگر می خواهید مشکل File Fragmentation را حل نمایید کافیست اندازه اولیه دیتا فایل دیتابیس خود (initial size) را به اندازه کافی بزرگ بگیرید. مثلا می توانید اندازه اولیه دیتا فایل خود را به اندازه آرشیو سالیانه ، در همان ابتدا در نظر بگیرید. ۳. کوئری سوم: بدست آوردن تعداد کانکشن های مربوط به هر لاگین روی هر دیتابیس کوئری در SQL Server، شما به کمک کوئری زیر می توانید تعداد کانکشن های مربوط به لاگین ، روی هر دیتابیس را مشاهده نمایید. SELECT DB_NAME(dbid) AS DBName, COUNT(dbid) AS NumberOfConnections, loginame FROM sys.sysprocesses GROUP BY dbid, loginame ORDER BY DB_NAME(dbid) سخن پایانی کوئری در SQL Server، از مهم ترین جز های پایگاه داده است. با کمک کوئری های مهم می توانید مشکلات ناگهانی پایگاه داده خود را حل کنید و از وقوع disaster در پایگاه داده خود جلوگیری کنید. در این مقاله با چند کوئری مهم و کابردی در پایگاه داده SQL Server آشنا شدید. ما در نیک آموز منتظر نظرات ارزشمند شما درباره این مقاله هستیم. چه رتبه ای میدهید؟ میانگین ۵ / ۵. از مجموع ۳ اولین نفر باش دانلود مقاله کوئریهای مهم در SQL Server | بخش اول فرمت PDF 6 صفحه حجم 1 مگابایت دانلود مقاله معرفی نویسنده مقالات 13 مقاله توسط این نویسنده محصولات 0 دوره توسط این نویسنده غلامحسین عبادی غلامحسین عبادی هستم، سوابق حرفهای من به شرح ذیل است: ۱- ۸ سال سابقه کار به عنوان برنامه نویس در شرکت خودرو سازی سایپا، ۲- ۱۱ سال سابقه کاری در شرکت ایران خودرو به عنوان رئیس برنامههای کاربردی و ۴ سال آخر مسئول دیتابیس، ۳- ۴ سال سابقه DBA در شرکت داده ورزی سداد، ۴- دارای مدرک MCSD مایکروسافت از کشور امارات، ۵- دارای مقالات متعدد در ماهنامه تجارات الکترونیک ۶- بیش از یک سال سابقه DBA در شرکت خدمات رایانهای امید، ۷- مدرسی SQL Server در برخی سازمانهای دولتی ۸- ۱۶ سال سابقه تدریس در دانشگاهها و سازمانهای مختلف ۹- مولف کتابهای متعدد در حوزه برنامه نویسی و SQL Server معرفی محصول ایمان باقری آموزش کوئری نویسی در sql server 2.190.000 تومان 1.314.000 تومان مقالات مرتبط ۰۲ آبان SQL Server ابزار Database Engine Tuning Advisor؛ مزایا، کاربردها و روش استفاده تیم فنی نیک آموز ۱۵ مهر SQL Server معرفی Performance Monitor ابزار مانیتورینگ SQL Server تیم فنی نیک آموز ۱۱ مهر SQL Server راهنمای جامع مانیتورینگ بکاپ ها در SQL Server تیم فنی نیک آموز ۰۸ مهر SQL Server Resource Governor چیست؟ آشنایی با نحوه پیکربندی و اهمیت های آن تیم فنی نیک آموز دیدگاه کاربران لغو پاسخ دیدگاه نام و نام خانوادگی ایمیل ذخیره نام، ایمیل و وبسایت من در مرورگر برای زمانی که دوباره دیدگاهی مینویسم. موبایل برای اطلاع از پاسخ لطفاً مرا با خبر کن ثبت دیدگاه Δ پویان اسدی ۲۸ / ۰۲ / ۰۱ - ۱۱:۱۰ با تشکر فراوان از جناب استاد عبادی.. بسیار عالی پاسخ به دیدگاه mehdi.aliaar ۲۷ / ۰۲ / ۰۱ - ۰۷:۲۳ سلام و درود. ممنون بابت این مطلب. پاسخ به دیدگاه