بهینه سازی فضای ذخیره سازی در SQL Server : راهنمای جامع فشرده سازی (COMPRESS) داده (ROW و PAGE)
فشرده سازی (COMPRESS) داده یک قابلیت کلیدی است که از نسخه SQL Server معرفی شد و به شما امکان میدهد حجم دادههای ذخیره شده در پایگاه داده خود را به طور قابل توجهی کاهش دهید. این ویژگی نه تنها باعث صرفه جویی در فضای دیسک میشود، بلکه با کاهش حجم دادههای مورد نیاز برای خواندن از دیسک، میتواند عملکرد ورودی/خروجی (I/O) را نیز بهبود بخشد. با این حال، فشرده سازی به سربار پردازنده (CPU) بیشتری نیاز دارد، زیرا دادهها باید در هنگام ذخیره سازی فشرده و در هنگام بازیابی از حالت فشرده خارج شوند. در این مقاله به بررسی عمیق انواع فشرده سازی در SQL Server ، نحوه پیاده سازی و ملاحظات عملکردی آن میپردازیم تا شما را در بهینه سازی فضای ذخیره سازی و افزایش کارایی سرور SQL یاری کنیم.
انواع فشرده سازی داده(COMPRESS)
SQL Server دو نوع اصلی فشرده سازی داده را ارائه میدهد:
فشرده سازی ROW (سطری)
فشرده سازی ROW یک رویکرد نسبتاً ساده برای فشرده سازی است که بر اساس فرمت ذخیره سازی VARBINARY کار میکند. این نوع فشرده سازی شامل موارد زیر است:
- تبدیل انواع عددی: مقادیر عددی مانند INT به فرمت ذخیره سازی VARBINARY تبدیل میشوند که فضای کمتری را اشغال میکند.
- ذخیره سازی مقادیر NULL و صفر: مقادیر NULL و صفرها فضای کمتری را نسبت به حالت عادی اشغال میکنند.
- کاهش طول فراداده (Metadata): طول فرادادهها برای ستونهای با طول ثابت کاهش مییابد.
فشرده سازی ROW معمولاً در مقایسه با فشرده سازی PAGE، سربار CPU کمتری دارد و درصد فشرده سازی کمتری را نیز ارائه میدهد.
فشرده سازی PAGE (صفحهای)
فشرده سازی PAGE یک سطح پیشرفتهتر از فشرده سازی است که شامل تمام مزایای فشرده سازی ROW به اضافه دو مکانیزم اضافی است:
- پیشوند (Prefix Compression): این تکنیک مقادیر تکراری پیشوند را در یک ستون حذف میکند و فقط یک بار آنها را در صفحه ذخیره میکند.
- دیکشنری (Dictionary Compression): این تکنیک مقادیر تکراری کامل را در چندین ستون حذف میکند و آنها را با ارجاعاتی به یک دیکشنری کوچک در داخل صفحه جایگزین میکند.
فشرده سازی PAGE معمولاً بیشترین میزان صرفه جویی در فضا را ارائه میدهد، اما به سربار CPU بیشتری نیز نیاز دارد. این نوع فشرده سازی برای جداول و ایندکسهایی که شامل دادههای تکراری زیادی هستند، بسیار مؤثر است.
پیاده سازی فشرده سازی داده
شما میتوانید فشرده سازی را بر روی جداول و ایندکسها اعمال کنید. این کار با استفاده از دستور ALTER TABLE یا ALTER INDEX و گزینه DATA_COMPRESSION انجام میشود.
فشرده سازی یک جدول
برای فشرده سازی یک جدول، دستور REBUILD را همراه با گزینه DATA_COMPRESSION استفاده کنید. این عملیات یک بازسازی کامل از جدول یا هیپ (heap) را آغاز میکند. در مثال زیر، جدول Production.WorkOrderRouting با فشرده سازی PAGE فشرده میشود:
ALTER TABLE Production.WorkOrderRouting REBUILD WITH (DATA_COMPRESSION = PAGE);
گزینههای دیگر برای DATA_COMPRESSION شامل ROW و NONE هستند.
فشرده سازی یک ایندکس
فشرده سازی را میتوان به طور جداگانه برای هر ایندکس یا برای همه ایندکسهای یک جدول اعمال کرد. در این مثال، تمام ایندکسهای جدول Production.WorkOrderRouting با فشرده سازی ROW فشرده میشوند:
ALTER INDEX ALL ON Production.WorkOrderRouting REBUILD WITH (DATA_COMPRESSION = ROW);
اگر بخواهید فشرده سازی را غیرفعال کنید، میتوانید از گزینه NONE استفاده کنید:
ALTER INDEX ALL ON Production.WorkOrderRouting REBUILD WITH (DATA_COMPRESSION = NONE);
تخمین میزان صرفه جویی در فضا
قبل از اعمال فشرده سازی، توصیه میشود که میزان صرفه جویی احتمالی در فضا را تخمین بزنید. SQL Server یک رویه ذخیره شده به نام `sp_estimate_data_compression_savings` را برای این منظور ارائه میدهد. این رویه به شما کمک میکند تا تصمیم بگیرید که آیا فشرده سازی برای جدول یا ایندکس شما مفید خواهد بود یا خیر و کدام نوع فشرده سازی مناسبتر است.
مثال استفاده برای تخمین فشرده سازی PAGE:
EXEC sp_estimate_data_compression_savings 'Production', 'WorkOrderRouting', NULL, NULL, PAGE ;
مثال استفاده برای تخمین فشرده سازی ROW:
EXEC sp_estimate_data_compression_savings 'Production', 'WorkOrderRouting', NULL, NULL, ROW ;
این رویه خروجی را با اطلاعاتی مانند اندازه فعلی، اندازه تخمینی پس از فشرده سازی، و درصد صرفه جویی احتمالی برمیگرداند. این دادهها برای تصمیم گیری آگاهانه در مورد پیاده سازی فشرده سازی بسیار ارزشمند هستند.
ملاحظات مهم برای فشرده سازی داده
در حالی که فشرده سازی داده مزایای زیادی دارد، اما مهم است که از ملاحظات عملکردی آن آگاه باشید:
سربار CPU
فرآیند فشرده سازی و از حالت فشرده خارج کردن دادهها به قدرت پردازشی (CPU) نیاز دارد. اگر سرور شما قبلاً تحت فشار CPU بالایی قرار دارد، اعمال فشرده سازی ممکن است منجر به کاهش عملکرد کلی شود. فشرده سازی PAGE معمولاً سربار CPU بیشتری نسبت به ROW دارد.
تاثیر بر حافظه (Memory)
دادههای فشرده شده در حافظه کش (Buffer Pool) به صورت فشرده ذخیره میشوند. این به معنای آن است که حجم بیشتری از دادههای شما میتوانند در حافظه قرار گیرند که خود میتواند منجر به کاهش نیاز به عملیات I/O و بهبود عملکرد شود. با این حال، دادهها قبل از استفاده توسط برنامهها باید از حالت فشرده خارج شوند.
کاهش I/O
بزرگترین مزیت فشرده سازی، کاهش حجم دادههایی است که باید از دیسک خوانده یا در دیسک نوشته شوند. این موضوع به ویژه برای سیستمهایی که با تنگنای I/O مواجه هستند، میتواند بهبود قابل توجهی در عملکرد ایجاد کند، زیرا دادههای کمتری بین دیسک و حافظه جابجا میشوند.
زمان مناسب برای استفاده از فشرده سازی
- بانکهای اطلاعاتی بزرگ: برای بانکهای اطلاعاتی با حجم زیاد داده که با محدودیت فضای دیسک مواجه هستند.
- جداول با دادههای تکراری: جداولی که دارای مقادیر تکراری زیادی در ستونها هستند (مخصوصاً برای فشرده سازی PAGE).
- سیستمهای با تنگنای I/O: سیستمهایی که عملکرد آنها به دلیل سرعت پایین دیسکها محدود شده است.
- قبل از پیاده سازی: همیشه عملکرد و میزان صرفه جویی را با `sp_estimate_data_compression_savings` ارزیابی کنید و در محیط تست (Test Environment) آزمایش کنید.
نتیجه گیری
فشرده سازی داده (COMPRESS) در SQL Server یک ابزار قدرتمند برای مدیران پایگاه داده است تا هم فضای ذخیره سازی را بهینه سازی کنند و هم عملکرد سیستم را بهبود بخشند. با درک تفاوت بین فشرده سازی ROW و PAGE، و با استفاده از ابزارهایی مانند `sp_estimate_data_compression_savings`، میتوانید تصمیمات آگاهانهای بگیرید که به نفع محیط SQL Server شما باشد. همواره به یاد داشته باشید که هر تغییری را ابتدا در یک محیط کنترل شده آزمایش کنید تا از تأثیرات آن بر سیستم زنده اطمینان حاصل کنید. با پیاده سازی صحیح فشرده سازی، میتوانید به بهره وری حداکثری از منابع خود دست یابید.