כמה פעמים נשאלתי לגבי ההבדל בין Truncate table לבין Delete from Table
והאמת שרובם די יודעים במה מדובר
הרי כולנו יודעים ש delete from table מבצעת מחיקה של שורה אחרי שורה וכל פעולת מחיקת שורה נרשמת ל Transaction log... מה שאומר שיכול להיות שפעולה כזו על טבלה גדולה עלולה לקחת זמן רב.
לעומת זאת Truncate מבצעת שחרור של שטח הנתונים המוקצה עבור הטבלה (חלק מכם יקראו לזה שחרור מצביעים - גם זה נכון) וכך אנו יכולים לנקות טבלה גדולה מאוד באפס זמן.
כמובן שלפקודה זו לא ניתן להוסיף תנאי where ולהחליט איזה שורות אנו מעוניינים למחוק ואיזה לא - זה או הכל או כלום.
עוד כמה הסברים ומגבלות על Truncate ניתן למצוא ב - Truncate Table (Transact-SQL)
אז מה באתי להגיד בכל זה...?
אחרי שכולנו מבינים איך זה קורה, וברור לנו ש Truncate היא פקודת DDL (כלומר פקודת מבנה Data Definition Language) ולא פקודת DML (כלומר פקודת שינוי נתונים Data Manipulation Langauge)
ובמיוחד למי מאיתנו שמגיע מאורקל ושם אחרי Truncaate נגמר הסיפור - אי אפשר להתחרט ולבצע Rollback
ובאורח פלא SQL Server מצליח לבצע Rollback לפקודת Truncate
ואז אנחנו מתחילים לחשוב שמישהו עובד עלינו שם במייקרוסופט ואולי בכלל מימשנו Delete ולא Truncate...
אז הנה ההסבר.
פעולת Truncate מתעדת ב Transaction Log את הPAGES אותם היא שחררה מהטבלה, כך שאם אנחנו רוצים להתחרט ולהחזיר את הנתונים לטבלה אנו יכולים להציץ לLOG ולמצוא את כל PAGES ששחררנו קודם לכן וכך באורח פלא להחזיר את הנתונים שהיו שם ובעצם לבצע Rollback לפקודת Truncate.
זה דיי דומה למה ש Recovery model עושה כאשר הוא עובד על Bulk Logged רק בכיוון ההפוך - אבל זה נושא לפען אחרת
זה הפוסט הראשון שלי - את פרגנו ותגידו בהצלחה, אני מקווה שיהיה לי זמן לכתוב עוד על נושאים מעניינים ועכשווים.
תודה לכם שקראתם,
יוחנן.
והאמת שרובם די יודעים במה מדובר
הרי כולנו יודעים ש delete from table מבצעת מחיקה של שורה אחרי שורה וכל פעולת מחיקת שורה נרשמת ל Transaction log... מה שאומר שיכול להיות שפעולה כזו על טבלה גדולה עלולה לקחת זמן רב.
לעומת זאת Truncate מבצעת שחרור של שטח הנתונים המוקצה עבור הטבלה (חלק מכם יקראו לזה שחרור מצביעים - גם זה נכון) וכך אנו יכולים לנקות טבלה גדולה מאוד באפס זמן.
כמובן שלפקודה זו לא ניתן להוסיף תנאי where ולהחליט איזה שורות אנו מעוניינים למחוק ואיזה לא - זה או הכל או כלום.
עוד כמה הסברים ומגבלות על Truncate ניתן למצוא ב - Truncate Table (Transact-SQL)
אז מה באתי להגיד בכל זה...?
אחרי שכולנו מבינים איך זה קורה, וברור לנו ש Truncate היא פקודת DDL (כלומר פקודת מבנה Data Definition Language) ולא פקודת DML (כלומר פקודת שינוי נתונים Data Manipulation Langauge)
ובמיוחד למי מאיתנו שמגיע מאורקל ושם אחרי Truncaate נגמר הסיפור - אי אפשר להתחרט ולבצע Rollback
ובאורח פלא SQL Server מצליח לבצע Rollback לפקודת Truncate
ואז אנחנו מתחילים לחשוב שמישהו עובד עלינו שם במייקרוסופט ואולי בכלל מימשנו Delete ולא Truncate...
אז הנה ההסבר.
פעולת Truncate מתעדת ב Transaction Log את הPAGES אותם היא שחררה מהטבלה, כך שאם אנחנו רוצים להתחרט ולהחזיר את הנתונים לטבלה אנו יכולים להציץ לLOG ולמצוא את כל PAGES ששחררנו קודם לכן וכך באורח פלא להחזיר את הנתונים שהיו שם ובעצם לבצע Rollback לפקודת Truncate.
זה דיי דומה למה ש Recovery model עושה כאשר הוא עובד על Bulk Logged רק בכיוון ההפוך - אבל זה נושא לפען אחרת
זה הפוסט הראשון שלי - את פרגנו ותגידו בהצלחה, אני מקווה שיהיה לי זמן לכתוב עוד על נושאים מעניינים ועכשווים.
תודה לכם שקראתם,
יוחנן.
אין תגובות:
הוסף רשומת תגובה