#انتقال رکوردهای آرشیوی به جدول دیگر در دیتابیس
در دیتابیس های OLTP، معمولا درصد کمی از رکوردها هستند که جهت انجام عملیات و یا گزارش گیری دائما مورد استفاده قرار می گیرند.
به عنوان مثال یک سیستم انبار رو در نظر بگیرید، در یک سال جاری، خیلی کم پیش میاد که نیاز به اطلاعات سنوات گذشته داشته باشیم. چون که معمولا در این سیستم ها با اتمام سال ( میلادی یا شمسی) به نحوی استاد مربوط به سال گذشته حالت آرشیو پیدا می کنند ( با عناوینی تحت عنوان سال مالی، موجودی گیری پایان سال و...)
این مورد، در سیستم های فروش، حسابداری، حضور و غیاب و سیستم های مشابه نیز وجود دارد.
در حالت معمول، جدول های دیتابیس ما، حاوی همه رکوردها هستند، به عبارتی هم رکوردهایی که واقعا به صورت روزمره با اونها سرو کار داریم و روی اون ها عملیات انجام میدیم در جدول هستند که تعداد اون ها نسبت به کل رکوردها خیلی کمتر هست (Live Data) و هم رکوردهایی که حالت آرشیوی دارن و ممکنه اصلا در عملیات روتین و روزمره بهشون نیازی نداشته باشیم (Archive Data).
با توجه به توضیحات ارائه شده، می بینیم که لزومی به وجود رکوردهای مربوط به سنوات گذشته (آرشیو شده) و یا حتی چند ماه گذشته در خیلی از جداول ما نیست. بنابراین اگر بتوانیم این دو مجموعه رکورد رو از همدیگر تفکیک کنیم و عملیات روزمره ما تنها بر روی رکوردهای عملیاتی ( با تعداد خیلی کمتر) انجام شود، افزایش سرعت قابل توجهی در انجام عملیات خواهیم داشت. به عبارتی راه حل و یا تکنیکی لازم داریم تا با ستفاده از آن دو عملیات زیر قابل انجام باشد:
1- تفکیک رکوردهای عملیاتی از رکوردهای آرشیوی
2- قابل دسترس بودن رکوردهای آرشیوی در صورت نیاز
برای این منظور لازم هست که معیاری برای تفکیک این دو مجموعه رکورد از یکدیگر داشته باشم. که یک راه مناسب، ایجاد فیلد تاریخ برا ی رکوردها هست. تا بتوانبم مجموعه رکوردهایی که دارای تاریخ کوچکتر از یک تاریخ خاص هستند را به عنوان رکوردهای آرشیوی در نظر بگیریم. در ادامه باید یک جدول مشابه با جدول اصلی ایجاد کنیم و رکوردهای آرشیوی را در این جدول نگهداری کنیم.
تا اینجا با کلیت مسئله و مراحل انجام چنین کاری آشنا شدیم و اما راه حل هایی که برای تفکیک رکوردهای عملیاتی از رکوردهای آرشیوی وجود داره :
1. استفاده از Filtered Index
2. ایجاد یک SP جهت انتقال رکوردهای آرشیوی به جدولی با ساختار مشابه جدول اصلی و حذف رکوردهای انتقالی از جدول اصلی
3. استفاده از Partitioning
محسن بندامیر
@Mohsen_Bandamirکانال تخصصی Sqlserver:
@SQLSERVER_professionalدر این آموزش قصد داریم روش دوم رو توضیح بدیم، از عمده مزیت های این روش، قابلیت پیاده سازی اون در تمام نسخه ها و ویرایش های Sqlserver و همینطور سادگی پیاده سازی و قابل فهم بودن اون هستش.
ای SP در ابتدا چند پارامتر ورودی داره :
@sourcetablename نام جدول مبدآ حاوی رکوردهای آرشیوی و عملیاتی
@desttablename نام جدول مقصد، جهت انتقال رکوردهای آرشیوی به آن
@column_to_check نام ستونی که بر اساس آن، رکوردهای آرشیوی را مشخص می کنیم (معمولا یک فیلد تاریخ است)
@purge_date مشخص کننده تارخ و یا مقداری است که رکوردهای حاوی مقدار کمتر از آن (در فیلد column_to_check) به جدول مقصد منتقل می شوند
@batch_size تعیین تعداد رکوردی که در هر بار (در هر اجرای تراکنش) از جدول مبدآ به جدول مقصد منتقل می شوند. جهت افزایش کارایی، این مقدار ا تعیین می کنیم
@minutes_to_process تعیین یک بازه زمانی جهت انجام این عملیات (به دقیقه).
به عنوان مثال، این پارامترها رو به این صورت مقدار دهی می کنیم:
@sourceTABLENAME = '[ftest].[dbo].[Table_1]',
@desttablename = '[ftest_log].[dbo].[arch_table_1]',
@column_to_check = 'logdate',
@PURGE_DATE = '1395/12/30',
@BATCH_SIZE = 500,
@MINUTES_TO_PROCESS = 15
اسکریپت ایجاد این SP رو از قسمت زیر دانلود و استفاده کنید: 👇👇👇
محسن بندامیر
@Mohsen_Bandamirکانال تخصصی Sqlserver:
@SQLSERVER_professional