مدتی پیش در پروژهی "بهای تمام شده" و "ریال انبار"، با چالشی روبرو شدم که باعث شد دوباره به اصول پایهای عملکرد دیتابیس فکر کنم.
ما برای محاسبه مجدد ریالی انبار، نیاز داشتیم حجم زیادی از دادهها را بازنویسی کنیم. دو راه پیش رو داشتیم:
1. ردیفهای قدیمی را
DELETE کنیم و ردیفهای جدید را INSERT کنیم.2. یا ردیفهای موجود را با مقادیر جدید
UPDATE کنیم.در نگاه اول شاید فکر کنید این دو عملیات از نظر منطقی یکی هستند؛ اما در عمل، وقتی از روش Delete + Insert استفاده میکردیم، سرعت فرآیند بسیار پایین بود و سیستم تحت فشار قرار میگرفت. اما به محض اینکه استراتژی را به
UPDATE تغییر دادم، شاهد بهبود چشمگیر سرعت بودیم.اگر فکر میکنید
UPDATE هم همان DELETE + INSERT است، باید به ساختار زیرین نگاه کنید:هزینهی ایندکسها (The Index Trap):
در روش حذف و درج، شما مجبورید تمام ایندکسهای جدول را برای حذف "پاکسازی" و برای درج مجدد "بازسازی" کنید. اما در
UPDATE (اگر ستونهای ایندکسشده تغییر نکنند)، SQL Server اصلاً درگیر ساختار ایندکسها نمیشود و فقط مقدار را در همان بلوک داده تغییر میدهد.پایداری در صفحات داده (Data Pages):
عملیات حذف و درج مجدد، باعث ایجاد Fragmentation در صفحات داده میشود و احتمال
Page Split را بالا میبرد. در حالی که UPDATE سعی میکند عملیات را In-place و در همان مکان قبلی انجام دهد.مدیریت تراکنش (Logging):
مدیریت یک عملیات واحد، همیشه بهینهتر از مدیریت دو عملیات مجزای سنگین در Transaction Log است.
@DevTwitter | <seied Mojtaba sajadi/>
