سرور sql مایکروسافت از دو نوع پارتیشن بندی عمودی و افقی پشتیبانی می کند. مدیر پایگاه داده ممکن است بخواهد یک جدول را به صورت پارتیشن بندی شده تعریف و ایجاد کند و یا اینکه جدولی داشته باشد که بی اندازه رشد کرده و نیاز به پارتیشنینگ دارد.
نحوه پارتیشن بندی جداول:
همانطور که در نوشته" پارتیشن کردن جداول" گفته شد، سرور SQL مایکروسافت از نوع پارتیشن بندی برای جداول خود پشتیبانی می کند. پارتیشن بندی عمودی و افقی. مدیر پایگاه داده ممکن است بخواهد یک جدول را به صورت پارتیشن بندی شده تعریف و ایجاد کند و یا اینکه جدولی داشته باشد که بی اندازه رشد کرده و نیاز به پارتیشنینگ دارد.
در این نوشته قصد داریم تا از چگونگی عملیات پارتیشن بندی افقی در سرور SQL را بررسی کنیم. می توان جداول موجود را پارتیشن بندی کرد و یا از همان ابتدا جداول پارتیشن بندی شده ایجاد کرد.
بدین منظور باید مراحل زیر را طی کنیم:
• انتخاب نوع و ستون پارتیشن بندی: دو نوع پارتیشن بندی افقی و عمودی داریم.
• تعریف scheme و تابع پارتیشن بندی: تابع پارتیشن بندی، تعداد و مرزهای پارتیشن ها را مشخص می کند. این تابع با گرفتن مقداری از ستون پارتیشن محل قرار گیری داده را محاسبه می کند. scheme نیز ساختار کلی پارتیشن بندی را مشخص می کند. این ساختار شامل محل قرار گیری هر پارتیشن می گردد (فایل و گروه فایلها). می توان از scheme و توابع تعریف شده برای پارتیشن بندی یک و یا هر تعداد جدول استفاده نمود.
CREATE PARTITION FUNCTION MyPartitionRange(INT) AS RANGE LEFT FOR VALUES (1,2)
CREATE PARTITION SCHEME MyPartitionSchemeAS PARTITION MyPartitionRangeALL TO ([PRIMARY])
در مثال بالا تابع mypartitionrange پارتیشن های زیر را تعریف می کند:
Partition 1 – Partition value <= 1
Partition 2 – Partition value =2
Partition 3 – Partition value > 2
Mypartitionscheme نیز مشخص می کند که پارتیشن ها در گروه فایلی primary ذخیره می گردد. می توان بر روی پایگاه داده گروه های فایلی (file groups) دیگری غیر از primary نیز ایجاد کرده و پارتیشن ها را در آنها ذخیره کرد.
• در مرحله آخر نوع عملیات بسته به اینکه بخواهیم یک جدول موجود را پارتیشن بندی کنیم و یا اینکه یک جدول را از ابتدا به صورت پارتیشن بندی شده ایجاد کنیم، نوع عملیات کمی متفاوت می گردد.
o ایجاد جدول پارتیشن بندی شده:
CREATE TABLE MyPartitionedTable(i INT , s CHAR(8000) , PartCol INT ) ON MyPartitionScheme(PartCol)
جدول مثال بالا شامل ستونی به نام partcol می گردد. sheme و تابع پارتیشن بندی بر اساس مقادیر این ستون محل قرار گیری داده ها (هر سطر در پارتیشن مورد نظر خود) را مشخص می کنند.
o پارتیشن بندی یک جدول موجود:
برای پارتیشن بندی جداول موجود نیز می توان یک ایندکس از نوع clustered بر روی آن و با مشخص کردن نام scheme ایجاد کرد. در صورتی که جدول در حال حاضر شامل یک ایندکس از نوع کلاستر می باشد باید آن را حذف و از نو ایجاد کرد.
Drop CLUSTERED INDEX IX_MyTable ON dbo.MyTable
CREATE CLUSTERED INDEX IX_MyTable_partitioncol ON dbo.MyTable (PartCol)
WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
ON MyPartitionScheme (partitioncol)
پس از تعریف جدول و قرار دادن مقادیر داده در آنها می توان با کوئری زیر پارتیشن ها و تعداد سطرهای ذخیره شده در هر پارتیشن را مشاهده کرد:
SELECT * FROM sys.partitionsWHERE OBJECT_ID =
OBJECT_ID('MyPartitionedTable')
SELECT * FROM sys.partitionsWHERE OBJECT_ID = OBJECT_ID('MyTable')
همچنین تابع $partition برای تشخیص محل قرار گیری داده به کار می رود. مقداری از ستون پارتیشن را دریافت کرده و پارتیشنی که داده مورد نظر در آن قرار گرفته است را مشخص می کند.
SELECT PartitionNo= $partition.MyPartitionRange(6)
حذف و افزودن پارتیشن ها:
می توان از یک جدول یک پارتیشن را حذف و یا یک پارتیشن به آن اضافه نمود. به عنوان مثال جدول لاگ بزرگی را فرض کنید که پارتیشن بندی شده است. لاگ ها به صورت ماهانه در جداول کوچک تر ذخیره می گردند و سپس به جدول اصلی لاگ اضافه می شوند.
بدین منظور باید با تغییر تعریف تابع یک پارتیشن به آن اضافه می کنیم. در دستور زیر پارتیشنی برای مقادیر بزرگتر از 3 اضافه می گردد.
ALTER PARTITION FUNCTION MyPartitionRange() split RANGE (3)