راهنمای جامع پارتیشنبندی جداول در SQL Server
پارتیشنبندی بهعنوان تصمیم معماری
پارتیشنبندی در SQL Server یک جدول یا ایندکس بزرگ را به بخشهای منطقی با شماره، مرز و مقصد مشخص تقسیم میکند، در حالی که برنامه همچنان یک نام جدول واحد میبیند.
ارزش اصلی زمانی ایجاد میشود که کلید پارتیشن با چرخه واقعی داده هماهنگ باشد؛ تاریخ فروش، زمان رخداد یا دوره مالی نمونههایی هستند که آرشیو و نگهداری آنها بر اساس بازه انجام میشود.
این مجموعه یازده موضوع مستقل را از ساخت Function تا تشخیص شماره پارتیشن پوشش میدهد و برای هرکدام ده مثال، خروجی نمونه، FAQ و نکات Performance دارد.
نقشه معماری Table Partitioning
Function مرز منطقی را میسازد، Scheme مقصد ذخیره را تعیین میکند و جدول و ایندکس روی این Data Space قرار میگیرند؛ سپس عملیات نگهداری چرخه عمر داده را کنترل میکنند.
لایه مرزبندی منطقی
Partition Function یک ورودی تکستونی دارد و با Boundary Valueها آن را به شماره پارتیشن تبدیل میکند. RANGE LEFT یا RANGE RIGHT تعیین میکند خود مقدار مرزی در کدام سمت قرار گیرد.
برای مرز ابتدای ماه معمولاً RANGE RIGHT خواناتر است؛ برای مرز پایان دوره ممکن است RANGE LEFT مناسب باشد. انتخاب نهایی باید با مقدار قبل، برابر و بعد از مرز آزموده شود.
لایه نگاشت فیزیکی
Partition Scheme شمارههای منطقی را به Filegroupها نگاشت میکند. همه پارتیشنها میتوانند روی PRIMARY باشند و همچنان مزیت مدیریتی داشته باشند.
چند Filegroup زمانی توجیه دارد که I/O، Backup، Read-only یا آرشیو را بهتر کند. نگاشت پیچیده بدون زیرساخت مناسب فقط هزینه نگهداری را افزایش میدهد.
زمان، UTC و دقت مرز
برای کلید زمانی، date، datetime2 یا datetimeoffset باید آگاهانه انتخاب شوند. Literalهای DDL با قالب ISO نوشته شوند تا LANGUAGE و DATEFORMAT باعث تفسیر متفاوت نشوند.
در سامانه چندمنطقهای ذخیره UTC و تعریف مرزها بر اساس UTC از افتادن رخداد در پارتیشن نادرست جلوگیری میکند. دقت ستون و Boundary نیز باید هماهنگ باشد.
شش مثال یکپارچه طراحی و نگهداری
مثال جامع 1: ساخت Function، Scheme و جدول ماهانه
این سناریو مرحله 1 از چرخه کامل Table Partitioning را نشان میدهد و خروجی آن برای درک نتیجه واقعی درج شده است.
CREATE PARTITION FUNCTION pf_MainMonth (date) AS RANGE RIGHT
FOR VALUES ('2026-01-01','2026-02-01','2026-03-01');
CREATE PARTITION SCHEME ps_MainMonth AS PARTITION pf_MainMonth ALL TO ([PRIMARY]);
CREATE TABLE dbo.MainSales (Id bigint NOT NULL, SaleDate date NOT NULL, Amount decimal(12,2) NOT NULL)
ON ps_MainMonth(SaleDate);
| مرحله | خروجی نمونه |
|---|
| ساخت Function، Scheme و جدول ماهانه | عملیات موفق و قابل کنترل |
تحلیل مرحله 1: این مثال باید همراه شمار ردیف، مرز واقعی و وضعیت Indexها بررسی شود تا نتیجه در محیط تولید قابل پیشبینی باشد.
مثال جامع 2: آزمون مقدارهای مرزی
این سناریو مرحله 2 از چرخه کامل Table Partitioning را نشان میدهد و خروجی آن برای درک نتیجه واقعی درج شده است.
SELECT v.SampleDate, $PARTITION.pf_MainMonth(v.SampleDate) AS PartitionNo
FROM (VALUES (CAST('2026-01-31' AS date)),(CAST('2026-02-01' AS date)),(CAST('2026-02-02' AS date))) v(SampleDate);
| مرحله | خروجی نمونه |
|---|
| آزمون مقدارهای مرزی | عملیات موفق و قابل کنترل |
تحلیل مرحله 2: این مثال باید همراه شمار ردیف، مرز واقعی و وضعیت Indexها بررسی شود تا نتیجه در محیط تولید قابل پیشبینی باشد.
مثال جامع 3: افزودن پارتیشن آینده
این سناریو مرحله 3 از چرخه کامل Table Partitioning را نشان میدهد و خروجی آن برای درک نتیجه واقعی درج شده است.
ALTER PARTITION SCHEME ps_MainMonth NEXT USED [PRIMARY];
ALTER PARTITION FUNCTION pf_MainMonth() SPLIT RANGE ('2026-04-01');
SELECT COUNT(*)+1 AS PartitionCount
FROM sys.partition_range_values
WHERE function_id=(SELECT function_id FROM sys.partition_functions WHERE name=N'pf_MainMonth');
| مرحله | خروجی نمونه |
|---|
| افزودن پارتیشن آینده | عملیات موفق و قابل کنترل |
تحلیل مرحله 3: این مثال باید همراه شمار ردیف، مرز واقعی و وضعیت Indexها بررسی شود تا نتیجه در محیط تولید قابل پیشبینی باشد.
تصویر دوم مسیر مقدار ورودی تا شماره پارتیشن، مقصد فیزیکی و نتیجه Query را نمایش میدهد.
مثال جامع 4: بارگذاری سریع با SWITCH
این سناریو مرحله 4 از چرخه کامل Table Partitioning را نشان میدهد و خروجی آن برای درک نتیجه واقعی درج شده است.
CREATE TABLE dbo.MainStage (Id bigint NOT NULL, SaleDate date NOT NULL, Amount decimal(12,2) NOT NULL,
CONSTRAINT CK_MainStage CHECK (SaleDate >= '2026-02-01' AND SaleDate < '2026-03-01'));
INSERT INTO dbo.MainStage VALUES (1,'2026-02-10',150000),(2,'2026-02-20',275000);
ALTER TABLE dbo.MainStage SWITCH TO dbo.MainSales PARTITION 3;
| مرحله | خروجی نمونه |
|---|
| بارگذاری سریع با SWITCH | عملیات موفق و قابل کنترل |
تحلیل مرحله 4: این مثال باید همراه شمار ردیف، مرز واقعی و وضعیت Indexها بررسی شود تا نتیجه در محیط تولید قابل پیشبینی باشد.
مثال جامع 5: پاکسازی انتخابی یک پارتیشن
این سناریو مرحله 5 از چرخه کامل Table Partitioning را نشان میدهد و خروجی آن برای درک نتیجه واقعی درج شده است.
TRUNCATE TABLE dbo.MainSales WITH (PARTITIONS (2));
SELECT partition_number, rows FROM sys.partitions
WHERE object_id=OBJECT_ID(N'dbo.MainSales') AND index_id=0 ORDER BY partition_number;
| مرحله | خروجی نمونه |
|---|
| پاکسازی انتخابی یک پارتیشن | عملیات موفق و قابل کنترل |
تحلیل مرحله 5: این مثال باید همراه شمار ردیف، مرز واقعی و وضعیت Indexها بررسی شود تا نتیجه در محیط تولید قابل پیشبینی باشد.
مثال جامع 6: گزارش کاتالوگ و مرزها
این سناریو مرحله 6 از چرخه کامل Table Partitioning را نشان میدهد و خروجی آن برای درک نتیجه واقعی درج شده است.
SELECT pf.name AS FunctionName, ps.name AS SchemeName, prv.boundary_id, prv.value
FROM sys.partition_functions pf
JOIN sys.partition_schemes ps ON ps.function_id=pf.function_id
LEFT JOIN sys.partition_range_values prv ON prv.function_id=pf.function_id
WHERE pf.name=N'pf_MainMonth' ORDER BY prv.boundary_id;
| مرحله | خروجی نمونه |
|---|
| گزارش کاتالوگ و مرزها | عملیات موفق و قابل کنترل |
تحلیل مرحله 6: این مثال باید همراه شمار ردیف، مرز واقعی و وضعیت Indexها بررسی شود تا نتیجه در محیط تولید قابل پیشبینی باشد.
Partition Elimination و طراحی Query
پارتیشنبندی بهتنهایی Query را سریع نمیکند. Predicate قابل استنتاج روی ستون کلید لازم است تا Optimizer پارتیشنهای نامرتبط را حذف کند.
شرط بازه مستقیم مانند تاریخ بزرگتر مساوی شروع و کوچکتر از پایان معمولاً از اعمال تابع روی ستون بهتر است. Execution Plan باید تعداد پارتیشنهای خواندهشده را تأیید کند.
گاهی ارزش اصلی مدیریت داده است، نه سرعت SELECT؛ آرشیو سریع، SWITCH، TRUNCATE انتخابی و نگهداری Index میتوانند دلیل اصلی طراحی باشند.
Sliding Window و چرخه دورهای
چرخه متداول شامل NEXT USED و SPLIT برای دوره آینده، SWITCH IN داده تازه، SWITCH OUT دوره قدیمی و MERGE مرز منقضی است.
SPLIT و MERGE باید تا حد ممکن روی پارتیشن خالی انجام شوند؛ وجود داده میتواند جابهجایی صفحه، رشد لاگ و قفل طولانی ایجاد کند.
Job باید Idempotent باشد، مرز تکراری نسازد، شماره پارتیشن را از متادیتا بخواند و در صورت ناسازگاری متوقف شود.
Performance، قفل و لاگ
عملیات Metadata-only نیز قفل Sch-M میگیرد و ممکن است پشت Session طولانی منتظر بماند. تراکنشهای باز و Blocking باید قبل از نگهداری بررسی شوند.
برای SPLIT یا MERGE پارتیشن پر، فضای لاگ، رشد فایل، Backup Log و زمان بازیابی سنجیده شود. نتیجه محیط خالی معیار محیط تولید نیست.
sys.dm_db_partition_stats، sys.partition_range_values و sys.destination_data_spaces سه منبع اصلی مانیتورینگ ردیف، مرز و مقصد هستند.
نمودار تصمیم عملیات نگهداری
این نمودار انتخاب میان ساخت، توسعه، انتقال، پاکسازی و ادغام را بر اساس مرز و شمار ردیف نشان میدهد.
ده پرسش متداول Table Partitioning
آیا همیشه Query سریعتر میشود؟
خیر؛ Partition Elimination و Index مناسب لازماند. این پاسخ در چارچوب طراحی جامع پارتیشنبندی SQL Server ارائه شده است.
چند Filegroup اجباری است؟
هیچ؛ همه مقصدها میتوانند روی PRIMARY باشند. این پاسخ در چارچوب طراحی جامع پارتیشنبندی SQL Server ارائه شده است.
RANGE LEFT یا RIGHT؟
بر اساس معنا و تست مقدار مرزی انتخاب میشود. این پاسخ در چارچوب طراحی جامع پارتیشنبندی SQL Server ارائه شده است.
تعداد مناسب پارتیشن؟
به دوره نگهداری، حجم و هزینه آمار وابسته است. این پاسخ در چارچوب طراحی جامع پارتیشنبندی SQL Server ارائه شده است.
کلید پارتیشن در Primary Key؟
برای Unique Index همتراز معمولاً باید در کلید یکتا حضور داشته باشد. این پاسخ در چارچوب طراحی جامع پارتیشنبندی SQL Server ارائه شده است.
علت خطای SWITCH؟
تفاوت ستون، Index، Compression یا Constraint. این پاسخ در چارچوب طراحی جامع پارتیشنبندی SQL Server ارائه شده است.
آیا MERGE داده را حذف میکند؟
خیر؛ فقط مرز را حذف میکند. این پاسخ در چارچوب طراحی جامع پارتیشنبندی SQL Server ارائه شده است.
زمان ساخت دوره آینده؟
پیش از اولین درج دوره جدید. این پاسخ در چارچوب طراحی جامع پارتیشنبندی SQL Server ارائه شده است.
شماره پارتیشن تاریخ؟
با $PARTITION و سپس کنترل مرزها. این پاسخ در چارچوب طراحی جامع پارتیشنبندی SQL Server ارائه شده است.
اطلاعات لازم برای سفارش طراحی؟
حجم، رشد، Query، Index، نسخه، SLA و Recovery Model. این پاسخ در چارچوب طراحی جامع پارتیشنبندی SQL Server ارائه شده است.
سؤالهای مصاحبه جامع
- تفاوت Function و Scheme را توضیح دهید.
- RANGE RIGHT برای ابتدای ماه چگونه عمل میکند؟
- چرا SPLIT پارتیشن خالی ارزانتر است؟
- شرایط SWITCH موفق چیست؟
- Index همتراز چه نقشی دارد؟
- توزیع ردیف را چگونه کنترل میکنید؟
- Sliding Window را مرحلهبندی کنید.
- چه زمانی پارتیشنبندی توصیه نمیشود؟
جمعبندی راهنمای Table Partitioning
پارتیشنبندی موفق از شناخت چرخه داده شروع میشود. Function مرز، Scheme مقصد و دستورات نگهداری عمر ساختار را مدیریت میکنند.
از لینکهای این صفحه برای مطالعه ده مثال هر دستور استفاده کنید و پیش از استقرار، مرز، ردیف، Index، لاگ و Rollback را در محیط نزدیک به تولید بیازمایید.
خدمات برنامهنویسی و پایگاه داده برای Table Partitioning
برای تبدیل آموزش Table Partitioning به یک راهکار اجرایی، خدمات برنامهنویسی در اصفهان و پذیرش سفارش پایگاه داده با شماره 09131253620 ارائه میشود.
این مجموعه معتبر از سال ۱۳۷۵ شمسی در انجام پروژه، آموزش برنامهنویسی و آموزش SQL Server فعالیت حرفهای دارد و میتواند طراحی مربوط به Table Partitioning را بازبینی یا اجرا کند.
برای سفارش پروژهای که Table Partitioning بخشی از آن است، از تماس مستقیم 09131253620 استفاده کنید؛ ایتا، واتساپ و تماس مستقیم با +989131253620 نیز در دسترس است.
تماس با ما برای مشاوره تخصصی Table Partitioning