יום רביעי, 22 בפברואר 2012

How to pin table into buffer pool memory in SQL Server


DBCC pintable (database_id, table_id)

פקודה זו תנחה את SQL SERVER שלא לפנות Pages של הטבלה שצויין מספרה מהזיכרון מטמון של השרת.

בשוטף, השרת משתמש באלגוריתם LRU - Last Recently Used, כלומר הוא
משאיר בזיכרון את ה Pages השימושיים ביותר עבורו. Pages ישנים שלא נעשה בהם שימוש מוסרים מהזיכרון כאשר יש צורך לאכלס Pages נוספים שאין להם מקום.

הפקודה pintable של dbcc מגדירה שעל ה Pages של הטבלה שציינו לא יוסרו מהזיכרון.

חשוב להדגיש - זה לא אומר שהמערכת טטען את הPAGES הללו לזיכרון, אלא רק תשאיר אותם אם הם כבר הגיעו לזיכרון בדרך המקובלת.


יום חמישי, 9 בפברואר 2012

Double Check

Double Check


היום אני רוצה להסב את תשומת הלב לשימוש באילוץ CHECK 
לפעמים אנו משתמשים באילוצי CHECK רבים כדי לאכוף את נכונות הנתונים במערכת המידע.
אך לפעמים אנו יכולים לעשות טעות בסיסית שתגרום להרבה משערות ראשנו לנשור.


להלן דוגמא
USE tempdb
GO

CREATE TABLE DoubleCheck(col1 int)
GO

ALTER TABLE DoubleCheck
ADD CONSTRAINT CheckGraterThen5 CHECK(col1>5)
GO
ALTER TABLE DoubleCheck
ADD CONSTRAINT CheckLessThen5 CHECK(col1<5)
GO

בודגמא הזו אנו רואים שני אילוצים הסותרים אחד את השני, לא מתבצעת בדיקה שהאילוצים סותרים והמערכת לא מתריעה על כך.
במקרה הזו לא נוכל להכניס אף נתון לטבלה!
(חוץ מ NULL כמובן)

השתמשו באילוצים בחוכמה, ואם אתם מבצעים טעינה מסיבית כדאי מאוד לכבות את האילוץ לפני ביצוע הטעינה.
לדוגמא
ALTER TABLE {TableName} NOCHECK CONSTRAINT {ConstraintName}

יוחנן 

יום חמישי, 26 בינואר 2012

יצירת סביבת התנסות ב SharePoint2010
לצורך בדיקות PowerPivot \ Performance Point ובמיוחד לקראת SQL Server2012
שמכיל המון חידושים בתחום זה (כדוגמת PowerView)

התקינו את Sharepoint בתצורת Farm
אל תריצו את הConfig Wizard

היכנסו ל PowerShell והריצו

New-SPConfigurationDatabase

שימו לב שיש לספק משתמש מקומי בתצורה של MachineName\AccountName
זה חובה ולא ניתן לספק את שם המשתמש לבד.

הקלידו מחזורת העונה לתנאים של סיסמא מורכבת וארוכה.
מעבר לכך כל הפרטים טרוויאלים

* הערה: מי שרוצה לממש סביבת תרגול למערכות BI - פתרון זה איננו מספק, למשל עבור התקנה של Power Pivot אנו מחוייבים להיות חברים בדומיין (כדי שAS מאחורי הקלעים ידע למי לתת לראות את הנתונים) לכן במקרה כזה לא להתפשר ולהתקין גם DC.

בהצלחה.

יום שני, 2 בינואר 2012

Table Operations: Truncate vs Delete

כמה פעמים נשאלתי לגבי ההבדל בין 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 רק בכיוון ההפוך - אבל זה נושא לפען אחרת


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


תודה לכם שקראתם,
יוחנן.