content top
Truncate Table With Partitions

Truncate Table With Partitions

ניתן כעת לבצע פעולות Truncate על פרטישנים (partitions) ספציפיים בטבלה מפורטשת, בשלב זה רק בגרסת SQL Azure V12.
מה? מי? מו? מה: עד לפני מספר חודשים היינו רגילים שמיקרוסופט מוציאה גרסת SQL Server חדשה אחת לכמה שנים עם שלל חידושים טכנולוגיים ושלל כנסי השקה כדי לחשוף אותם ולקדם את המכירות; ואילו גרסת SQL Azure השתרכה מאחור עם יכולת מופחתות, מנסה לא לפתוח פער גדול מדי מגרסאות On Prem.
לפני מספר חודשים מיקרוסופט הוציאה את גרסת V12 של Azure שסגרה חלק גדול מהפערים ברמת ה-TSQL מגרסת 2014, וכעת החידושים מועלים תחילה אליה, ורק בהמשך לגרסאות On Prem העתידיות.
גרסת V12 עצמה תיעלם עם הזמן והחידושים יעברו ממנה ל-SQL Azurer (כלומר- כל SQL Azure יהיה V12), אבל החידושים העתידיים יתחילו את דרכם בענן.
כמובן, לא הכל, אלא רק מה שניתן למימוש ב-SQL Azure, ויש עוד הרבה יכולות שחסרות שם בעיקר בגלל מהותו של הכלי שאינו שרת פיזי\וירטואלי עם file system ומערכת הפעלה, אלא שירות.
הנה V12 כבר תומך בפרטישנים, אם כי במגבלות המתבקשות: לא ניתן ליצור פרטישן חדש על דיסק SSD דנדש ופרטישן ישן על דיסק חלוד, מכיוון שאיננו מנהלים דיסקים, אך מצד שני יש כבר חידושים כמו היכולת לבצע Truncate לפרטישנים ספציפיים.

נתחיל כמקובל מההתחלה- פירטוש טבלאות ב-SQL Azure V12. ניצור פונקציית פרטישן וטבלה, ונאכלס אותה בנתונים:

If Object_ID('T_Messages') Is Not Null Drop Table T_Messages;

If Exists (Select * From sys.partition_schemes Where name='S_Messages') Drop Partition Scheme S_Messages;

If Exists (Select * From sys.partition_functions Where name='F_Messages') Drop Partition Function F_Messages;


Create Partition Function F_Messages (Int) As Range Right For Values (10000, 20000, 30000, 40000, 50000);


Create Partition Scheme S_Messages As Partition F_Messages To ([Primary],[Primary],[Primary],[Primary],[Primary],[Primary]);


Create Table T_Messages(message_id Int Not Null,

                        language_id Int Not Null,

                        severity Int,

                        is_event_logged Bit,

                        text NVarchar(Max),

                        Constraint PK_T_Messages Primary Key Clustered (message_id,language_id))

                        ON S_Messages (message_id);


Insert

Into    T_Messages

Select    *

From    sys.messages;

שימוש לב שיש לציין Primary – שם ה-FileGroup, מתוך רצון לשמור על תאימות עם ה-On Prem TSQL, ולמרות שלא מנהלים FileGroups ב-SQL Azure.

בשביל לקבל סקירה מהירה מה יש בכל פרטישן, ננסה את זה:

SELECT    $PARTITION.F_Messages(message_id) Partition,

        MIN(message_id) [Min],

        MAX(message_id) [Max],

        COUNT(message_id) [Count]

FROM    T_Messages

Group By $PARTITION.F_Messages(message_id)

Order By $PARTITION.F_Messages(message_id);

image

כדי לפצל פרטישן קיים נשתמש בפקודה הבאה (שוב תוך ציון ה-FileGroup שבמקרה זה הוא מיותר):

Alter Partition Scheme S_Messages Next Used [Primary];

Go


Alter Partition Function F_Messages() Split Range (45000);

Go

image

ואפשר גם לאחד פרטישנים סמוכים תוך ציון נקודת הגבול בינהם:

Alter Partition Function F_Messages() Merge Range (45000);

Go

נרוקן פרטישן בשיטה הישנה של יצירת טבלה ריקה באותו מבנה כמו המפורטשת,

ונבצע switch בינה לבין אחד הפרטישנים:

If Object_ID('T_Messages_Out','U') Is Not Null Drop Table T_Messages_Out;

Go

Create Table T_Messages_Out(message_id Int Not Null,

                            language_id Int Not Null,

                            severity Int Null,

                            is_event_logged Bit Null,

                            text NVarchar(Max) Null,

                            Constraint PK_T_Messages_Out Primary Key Clustered (message_id,language_id));


Go


Alter    Table T_Messages

        Switch Partition 2

        To T_Messages_Out;

Go

וכעת נבדוק מה יש והיכן:

Select    $Partition.F_Messages(message_id) Partition,

        Min(message_id) [Min],

        Max(message_id) [Max],

        Count(message_id) [Count]

From    T_Messages

Group By $Partition.F_Messages(message_id)

Order By $Partition.F_Messages(message_id);


Select Count(*) [Count] From T_Messages;


Select Count(*) [Count] From T_Messages_Out;

image

פרטישן 2 נעלם (הוא קיים אך ריק), מספר השורות בטבלה פחת ב-2977, והם כולם בטבלה החדשה (כמובן- לאחר ביצוע הסוויצ’..).

רוצים להחזיר את המצב לקדמותו? צריך למען הסדר הטוב להוסיף Constraint שיבטיח שהטבלה כוללת נתונים שמתאימים לפרטישן המדובר, ולבצע סוויצ’ מחדש:

Alter   Table T_Messages_Out

        Add Constraint T_Messages_Out_Constraint Check (message_id between 10000 And 19999);


Alter Table T_Messages_Out switch To T_Messages Partition 2;

Go

וכעת:

image

עד כאן סקירה של מה לא השתנה, ומכאן לחידוש- היכולת לבצע Truncate לפרטישנים ספציפיים. למשל:

Truncate Table T_Messages With (Partitions(2,4));

image

או טווח של פרטישנים:

Truncate Table T_Messages With (Partitions(1 To 5));

פירטוש נעים!


תגובה אחת על “Truncate Table With Partitions”

  1. גרי שלום
    אתה מדבר כל הזמן בהתלהבות על SQL AZURE אז הגיע הזמן לדעתי באתר להרחיב את היריעה של האתר ל- nosql , לדבר על שחקן חדש של מיקרוסופט מלהיב בתחום ה- Nosql (אני עובד איתו ועם mongodb) . הנה עקרי הדברים

    שם : Document Databases
    • המתחרה השקול של mongodb הוא Coachbase – לא אדבר עליו .
    • אציג את MongoDB מול את המתחרה החדש של מיקרוסופט : Azure DocumentDB
    – שוחרר ב מאי 2015 .
    – Microsoft Azure תומך בצורה מובנית ב 2 צורות ליישום בענן : PaaS ו IaaS כמו SQL Azure, SQL Storage, Azure search :
    • נדרש Microsoft Azure cloud account
    • אין התקנות לוקאליות
    • חייבים להיות תמיד מחוברים לאינטרנט
    מה דעתך ?

כתיבת תגובה

האימייל לא יוצג באתר. (*) שדות חובה מסומנים

twenty − thirteen =