برای مشاهده یافته ها از کلید Enter و برای خروج از کلید Esc استفاده کنید.

۵ کار خطرناک در SQL Server – قسمت اول

در این مقاله قصد دارم ۵ کار خطرناک در SQL Server را که گاها دیده می شود توسط برنامه نویس ها، کارشناسان پایگاه داده و مسئولین IT انجام می شود و می تواند منجرب به کندی سرور، رشد بیش از حد دیتابیس، به خطا خوردن برنامه، از دست رفتن داده های حساس سازمان و … شود بیان کنم. این ۵ کار خطرناک عبارتند از:
۱٫ جابه جا کردن ترتیب فیلدها در جداول
۲٫ حذف رکورد از جدول پایه
۳٫ ایندکس های زیاد بر روی جدول
۴٫ استفاده از تریگر در جداول
۵٫ Drop کردن آبجکت ها (جداول، پروسیجر و …)

جابه جا کردن ترتیب فیلدها در جداول

یکی از کارهای بسیار خطرناک این است که Design یک جدول را باز کرده و در ترتیب ستون ها تغییری انجام و ذخیره نمایید. فکر می کنید چه اتفاقی رخ می دهد؟ قطعا اگر این کار را بر روی یک جدول بزرگ انجام دهید چندین دقیقه (یا ساعت) تمام منابع سرور یا کامپیوتر خود را درگیر می کنید و به جز کندی برنامه، احتمال دارد لاگ فایل دیتابیس شما یا دیسک مربوط به آن پر شود و کلا برنامه شما از کار بیافتد. فکر می کنید چرا؟
دلیل آن این است با تغییر در ترتیب فیلدهای یک جدول، Sql Server در پس زمینه برای اعمال این تغییر، کارهای زیر را انجام می دهد:

  • ایجاد یک جدول با ساختار مشابه با جدول اصلی ولی با ترتیب جدید فیلدها
  • درج تمام رکوردهای جدول اصلی به جدول جدید
  • حذف جدول اصلی
  • تغییر نام جدول جدید به نام جدول اصلی

بله تمام این کارها آن هم به صورت Transactional و فقط به خاطر یک تغییر ساده در ترتیب فیلدها انجام می شود! پس چه کار کنیم؟ پیشنهاد می کنم اگر می توانید از خیر این کار یعنی جابه جایی ترتیب ستون های جدول بگذرید و اگر باید انجام شود حتما با کوئری و به صورت مرحله مرحله بدون ایجاد تراکنش و با گرفتن Transaction Log Backup بین هر مرحله این کار را انجام دهید تا از رشد بی رویه لاگ فایل دیتابیس هم جلوگیری نمایید.

حذف رکورد از جدول پایه

تا حالا شده بخواهید یک یا چند رکورد را از یک جدول پایه حذف نمایید، ولی این کار بسیار طولانی انجام شود؟ یا آنقدر طول بکشد که بیخیال شوید و کوئری خود را متوقف کنید؟ گیج کننده است، حذف رکورد از یک جدول فسقلی چرا باید کلی طول بکشد؟
اگر Estimated Execution Plan کوئری را بگیرید متوجه خواهید شد گیر کار کجاست! دلیل آن احتمالا وجود کلید خارجی از جداولی بزرگ به این جدول است. معمولا جداول بزرگ به جداول پایه کلید خارجی دارند و برای حذف یک رکورد از جدول پایه، SQL Server می بایست مطمئن شود کلید این رکورد در هیچ یک از جداولی که به جدول اصلی Relation دارند استفاده نشده باشد پس ممکن است جهت این کار لود بسیار سنگینی به سرور تحمیل شود و زمان اجرای کوئری بسیار طولانی شود.
چاره چیست؟ یکی از راه حل ها این است بر روی فیلدهایی که کلید خارجی هستند ایندکس تعریف نمایید. این کار باعث می شود به جای اسکن کل داده ها، ایندکس مربوطه seek شود و کوئری شما خیلی سریع اجرا شود. راه حل دیگر این است به جای حذف فیزیکی در جداول، از حذف منطقی استفاده شود یعنی زمان طراحی جداول پایه یک فیلد مثلا به نام IsDeleted از نوع بیت تعریف نمایید و زمانی که می خواهید رکوردی را حذف نمایید مقدار این فیلد را برای آن رکورد True کنید. و البته یک راه حل دیگر هم، در صورت امکان حذف کلید خارجی است.

ایندکس های زیاد بر روی جدول

ایجاد ایندکس مناسب یکی از بهترین مولفه ها جهت افزایش سرعت کوئری ها و بالا بردن کاراریی سیستم است ولی از طرف دیگر ایندکس های زیاد بر روی جداول بزرگ می تواند بسیار دردسرساز شود. اتفاقاتی همچون افزایش Blocking ، DeadLock ، کندی اجرای کوئری ها و پایین امدن کاراریی سیستم می تواند از دلایل وجود ایندکس های زیاد بر روی جداول باشند. همچنین ایندکس های زیاد باعث بالا رفتن سایز دیتابیس می شود که این موضوع هم، مشکلات ناشی از خود را بوجود می آورد. پس در ایجاد ایندکس بر روی جداول اندکی حریصانه عمل کنید و فقط ایندکس های مهم و پر استفاده را ایجاد نمایید و به صورت مرتب دیتابیس خود را بررسی و ایندکس های بلااستفاده را حذف نمایید(حتما در مقاله ایی دیگر نحوه ایجاد یک ایندکس خوب و یافتن ایندکس های بلااستفاده را آموزش خواهم داد).

استفاده از تریگر در جداول

استفاده از تریگر آن هم بر روی جداول بزرگ در سیستم های Oltp می تواند باعث کندی و کاهش کارایی سیستم شود دلیل آن هم این است که با هر درج داده یا تغییر بر روی جدول تریگر فراخوانی و بدنه آن اجرا می شود و این عملیات بسیار هزینه بر است.
با توجه به معایب تریگر پیشنهاد می شود تا جای امکان در محیط های عملیاتی با TPS بالا از تریگر استفاده نکنید و دنبال راه حل های جایگزین باشید و اگر هم از تریگر استفاده کردید سعی کنید اولا بر روی جداول حساس سیستم (جداولی که نرخ درج داده و یا تغییر در آن بسیار زیاد است) نباشد و دوما از دستورات ساده و بدون پیچیدگی در بدنه تریگر استفاده نمایید.

Drop کردن آبجکت ها (جداول، پروسیجر و …)

یکی از خطرناک ترین دستورات، دستور drop (معادل delete در صورت استفاده از design) می باشد. توصیه می کنم هیچگاه مستقیم آبجکت (جدول، پروسیجر، ویوو، دیتابیس و …) را drop (یا delete) نکنید. بارها و بارها مشاهده شده است که افراد بعد از حذف آبجکت مورد نظر متوجه شده اند که اشتباهی حذف کردند یا اینکه یک قسمت از برنامه در حال استفاده از آن بود و با حذف آبجکت برنامه با خطا مواجه شده است. حالا فرض کنید یکی از جداول حساس سیستم عملیاتی را به اشتباه حذف کرده اید! حتی فکر کردن به این موضوع ترسناک است! چه راه حلی وجود دارد این ریسک را به کمترین اندازه خود برساند؟
بهترین کار این است به جای حذف، آبجکت مورد نظر خود را تغییر نام دهید. به عنوان مثال اگر قصد دارید جدول Account را حذف نمایید به جای اینکه مستقیم آن را حذف کنید نام آن را به AccountTemp تغییر دهید و بعد از چند روز اگر مشکلی بوجود نیامد آن را حذف نمایید. حسن این کار در این است اگر با تغییر نام متوجه مشکلی شدید می توانید به راحتی آبجکت خود را به نام اصلی برگردانید و همه چی به روال قبل برگردد.


امیدوارم این آموزش برای خوانندگان گرامی مفید واقع شود. لطفا با ارائه نظرات ، سوالات و پیشنهادات خود به بالا بردن کیفیت مطالب آموزشی و همچنین ایجاد دلگرمی برای ادامه مسیر آموزش به ما کمک نمایید. همچنین می توانید با عضویت در کانال تلگرام IranSQL از جدیدترین مقالات و فیلم های آموزشی با خبر شوید.

اشتراک گذاری با دیگران
  •  
  •  
  •  
  •  
  •