Database Partitioning
در SQL Server 2000 براي ايجاد پايگاه داده مفاهيم File / File Group درسطح سيستم عامل ، جداول و View ها در سطح پايگاه داده مطرح و مورد استفاده قرار مي گرفت. در زماني كه اطلاعات زياد و قسمتي از اطلاعات به اطلاعات مرده تبديل مي شد ، نياز مبرمي به Archive كردن اطلاعات پيش مي آمد كه SQL Server براي آن هيچ راه كاري بجز استفاده از Partition View پيشنهاد نمي كرد.
در نسخه SQL Server 2005 امكان جديدي در مورد استفاده بهينه از فايلها و فضاهاي در اختيار دیتابیس توليد شده وجود دارد و آن Partition Tables and Indexes مي باشد. اين مورد ، راه كار جايگزين براي مفاهيم مانند Archive و يا Partition View نيست. اين امكان يك ويژگي بسيار مفيد در مورد استفاده از File ها و ايجاد Table , Index روي Partition هاي مشخص از پايگاه داده مي باشد.
مزاياي اين امكان عبارتند از:
- استفاده بهينه از فايلها .
- افزايش كارايي Query ها در استفاده ازاطلاعات Partition شده .
Partition در SQL Server 2000 :
در SQL Server 2000 اطلاعات در جداول و جداول روي Disk هاي متعدد قرار مي گيرد ، براي ايجاد Partition View بايستي View هايي با ساختار تركيبي Union All از جداول اصلي پايگاه داده ايجاد کرد تا به كليه اطلاعات يك جدول بتوان دسترسي پيدا كرد.
معايب اين روش عبارتند از :
- در زمان ثبت اطلاعات سرعت مناسب است ولي چنانچه به ارتباط بين ركوردها نياز باشد بايستي اطلاعات را از Partition View خواند که اين مورد باعث كند شدن عملیات مي گردد .
- پياده سازي اين مورد براي دیتابیس های OLTP (سیستم های تولید مکانیزه ای که داده ها را جمع آوری نموده و به مصرف می رسانند) بسيار سخت بود زيرا اولا نياز به تخصيص فيلدهاي تكراري جداول در Header / Item ها بود ثانيا سناريوهايي كه از بابت روابط بين اطلاعات موجود بود ، امكان Partition كردن اطلاعات را كم مي كرد .
در نتيجه براي سيستم هايي كه پياده سازي شده بودند راه اندازي اين امكان سخت بود .
مدل شماتيك همراه با مثال :
در يك دیتابیس 3 فايل براي يك File Group در نظر بگيريد. 2 جدول به نام A , B نيز روي اين گروه ايجاد شده اند.
در شماي زیر فرض كنيد يك ركورد در جدول A و يك ركورد در جدول B درج شود. در زمان ايجاد اين جداول به فرمت Database ، 64 kb معادل 8 page براي اين جداول تخصيص داده مي شود. در زماني كه ركوردي در A و B درج مي شود ، SQL Server براي ركورد جدول A يك Extent و براي ركورد B يك Extent در نظر مي گيرد و اين فرايند با رشد Extent ها ادامه پيدا ميكند .
حال اگر اين file ها روي Device هاي سخت افزاري متعدد قرار داشته باشد در كارايي بانك اطلاعاتي تاثيرات مثبتي مشاهده مي شود .
در همين حال اگر بخواهيم از اطلاعات قديمي آرشيو داشته باشيم با موانعي روبرو هستيم كه در بالا به آنها اشاره شد.
Partition در SQL Server 2005 :
با Partition table در SQL Server 2005 اين امكان وجود دارد كه با كمك Function و Scheme تمام ركورد ها را بر ميني Partition Key مشخص درجاي مشخص شده در Scheme قرار داد.
در نماي فوق اطلاعات مربوط به Jan ، در Partition مربوط به Jan نگهداري مي شود و همينطور ساير اطلاعات با كليد ماه Partition شده اند.
از مزاياي اين امكان :
- سادگي در پياده سازي اين امكان براي جداول با حجم زياد اطلاعات و قرار دادن آنها روي Device هاي مختلف. كه در نتيجه در زمان خواندن اطلاعات ، سرعت پردازش موازي در خواندن اطلاعات به كارايي گزارش كمك مي كند.
- Load شدن اطلاعات در Partition جديد در كمترين زمان ممكن صورت مي گيرد.
- Partition كردن اطلاعات در ساده ترين حالت ممكن امكان پذير خواهد بود و حتي Delete كردن قسمتي از Partition نيز به سادگي امكان پذير خواهد بود.
SQL Server 2005 زمانيكه Table بصورت Partition تبديل مي شود
اطلاعات جدول طبق طبقه بندي در Partition از هم جدا مي شود و در هر Partition امكان مرور درختواره اطلاعات بصورت مستقل از هم فراهم مي شود. با استفاده از اين تكنيك سرعت بررسي دستيابي به اطلاعات زياد شده و در نتيجه كارايي Database افزايش پيدا مي كند.
در نسخه هاي قبل از SQL Server 2005 ، جداول و ايندكس ها مي توانستند روي يك File Group ايجاد شوند. در SQL Server 2005 اين امكان وجود دارد ، مضافا جداول و ايندكس ها مي توانند روي Partition Scheme ساخته شوند. Partition Scheme نيز Map چندين File Group مي باشد.
براي اينكه مشخصا Data ها روي موقعيت خود قرار بگيرند Partition Function ها اين كار را انجام مي دهند. در Partition Function الگوريتمي براي استفاده بصورت مستقيم از Data ها روي Partition Scheme وجود دارد .
تعاريف:
شئي است كه اطلاعات مربوط به Partition مثلا File Group هاي تشكيل دهنده Partition را نگهداري مي كند.
شئي است كه اطلاعات منطقي مربوط به Partition مثلا Align و فيلدي كه بايد بر مبني آن Partition انجام شود را مشخص مي كند .
مشخص كردن محدوده اي براي تفكيك منطقي ركودهاي يك جدول را Range گوييم. در واقع اين Range شامل كليدي است كه بر مبني آن اطلاعات Archive و یا Partition مي شوند. مشخص كردن اين كليد دقيقا منطقي و بر مبناي تحليل سيستم ها و به عبارت ساده تر ، تحليل Archive اطلاعات مي باشد.
در هر صورت از زماني كه اطلاعات امكان Partition شدن پيدا كردند بايستي در تعريف جداول براي فيلد كليد Partition يك Constraint تعريف شده تا اطلاعات متعلق به هر جدول در جايگاه خود قرار بگيرد .
با استفاده از همان دستورات براي ايجاد Partition table ميتوان Index ها را نيز Partition كرد. زمانيكه جدول و ايندكس آنها روي كليد مشترك Partition شده باشند ، Align گوييم. زمانيكه ايندكسي را روي يك جدول Partition شده قرار مي دهيم بصورت اتوماتيك بر مبني Partition Scheme آنرا Align مي كند .
قرار دادن جداول و ايندكس هاي آنها روي يك فايل و گروه فايل به پردازش موازي در پردازنده كمك مي كند
روش ايجاد Partition
روش فوق روش استاندارد براي Partition كردن Data هاي دیتابیس مي باشد. ولي با روشهاي ديگري نيز مي توان دیتابیس را Partition كرد :
روش Partition كردن دیتابیس
با اين پيش فرض كه اشيا Table همواره با Clustered Index ها بايستي در يك نقطه ايجاد شوند . لذا با استفاده از چنين تكنيكي مي توان Table ها را در موقعيت مناسب قرار داد. فقط بايستي به محدوديت هاي موجود در استفاده از Clustered Index ها توجه كرد.
ملاحضات :
- براي هر جدول نمي توان بيش از يك Clustered Index استفاده كرد.
- براي ايجاد Partition روي جداول چنانچه داراي يك فيلد Clustered باشند بايستي محتويات Index تركيبي از فيلد Clustered و فيلد مربوط به Partition Key باشد.
- با استفاده از Partition ممكن است استراتژي استفاده از Index نيز تغيير كند. از اين رو بايستي سيستم را مجددا مورد بررسي قرار داد.
در مكانيزم Partitioning ابتدا بايستي Partition Function ايجاد شود . براي ايجاد Partition Function مي توان از دستور زير استفاده كرد :
CREATE PARTITION FUNCTION <Function Name> (<Data Type >)
AS RANGE LEFT FOR VALUES (<Range Value>)
مثلا:
CREATE PARTITION FUNCTION myRangePF1 (int)
AS RANGE LEFT FOR VALUES (1, 100, 1000);
مرحله بعدي ايجاد Partition Scheme مي باشد كه با كمك دستور زير اين كار امكان پذير است :
CREATE PARTITION SCHEME <Scheme Name>
As Partition <Partition Function>
TO( <File Groups>)
مثلا :
CREATE PARTITION SCHEME myRangePS1
AS PARTITION myRangePF1
TO (test1fg, test2fg, test3fg, test4fg)
حالا مي توان جداول را ايجاد كرد و در زمان تعريف جداول موقعيت ايجاد جداول را روي Partition Scheme معلوم کرد.
CREATE TABLE <Table Name>
( FIELD LIST DATA TYPE ……
…
) ON <Partition Scheme Name> (<Field Name>)
مثال
CREATE TABLE PartitionTable (col1 int, col2 char(10))
ON myRangePS1 (col1)
فيلدي كه در تعريف جدول به عنوان فيلد Partition معرفي مي كنيم بايستي يكي از فيلدهاي همان جدول و با ساختار Partition Scheme سازگاري داشته باشد .
با توجه به مثالهای فوق :
در صورتی که col1 <= 1 باشد اطلاعات در test1fg ذخیره خواهند شد
در صورتی که 1 < col1 <= 100 باشد اطلاعات در test2fg ذخیره خواهند شد
در صورتی که 100 < col1 <= 1000 باشد اطلاعات در test3fg ذخیره خواهند شد
در صورتی که col1 > 1000 باشد اطلاعات در test4fg ذخیره خواهند شد
نکته : جداولي كه داراي اطلاعات مي باشند را تنها با بازسازي مجدد جدول و انتقال اطلاعات به جدول جديد ، مي توان Partition كرد .
نتيجه گيري :
- استفاده از امكان Partitioning در Performance سيستم ها بسيار موثر است.
- شرط اوليه براي استفاده از اين امكان ، ايجاد File Group هاي لازم براي دیتابیس بصورت كاملا بهينه و با انعطاف پذيري بالاست. در واقع استفاده از اين امكان براي هر مدل بانك اطلاعاتي (بسته به حجم اطلاعات ، تعداد سيستم ها و ... ) متفاوت و بر پایه طراحي File Group ها مي باشد.
- استفاده از امكان Partition حتي براي دیتابیس هايي كه بر پایه ساختارهاي Raid نصب شده است، باعث افزايش سطح كارايي بانك اطلاعاتي مي شود.
- وجود الگوهاي طراحي مناسب بر مبني نياز كاربر و معماري نرم افزار از اهميت زيادي برخوردار است .