איתור שגיאות בטבלאות Slowly Changing Dimension

יום חמישי, ינואר 19, 2012

טבלאות SCD מקובלות במחסני נתונים, וההבדל בינן לבין טבלאות מימד רגילות (טבלאות Dim שכוללות את התיאור ופרטים נוספים לכל קוד בטבלת ה-Fact) הוא שלכל קוד יכולות להיות בהן מספר רשומות לפי טווחי תאריכים. למשל- בטבלת מימד עובדים, במקום שלכל קוד עובד תהיה שורה אחת בה יופיעו שמו, כתובתו, תפקידו, מצבו המשפחתי וכו'; לכל עובד יהיו מספר שורות – כל אחת עם תאריך התחלה ותאריך סיום, ובכל פעם שפרט משמעותי משתנה – מוסיפים שורה מעודכנת תוך ש"סוגרים" את השורה הקודמת עם התאריך של אתמול כתאריך סיום, ופותחים את החדשה עם התאריך של היום כתאריך התחלה. שיטה זו חשובה כשרוצים לדעת מה היה...
אין תגובות

Sequence – מספור אוטומטי משותף

יום ראשון, נובמבר 14, 2010

בעקבות ההכרזה הרשמית על גרסת SQL Server הבאה ששם הקודם שלה הוא Denali – נזכרתי בבעייה שפעם הייתי צריך לפתור וכעת דומה שבאה על פתרונה.. נניח שיש לנו טבלת ספקים וטבלת לקוחות, לכל טבלה יש עמודת Identity הממספרת את השורות באופן אוטומטי, אבל אנחנו מעוניינים שהמספרים בשתי הטבלאות יהיו שונים, וכך המספר 3 (למשל) ישוייך רק לגוף אחד, ולא יווצר מצב בו יש לקוח שמספרו 3 וספק שמספרו 3.. ניתן היה לחשוב על כל מיני פתרונות: 1. טבלה משותפת ללקוחות ולספקים, כשחלק מהעמודות משמשות את שניהם (מספר, שם, כתובת, טלפון, איש קשר..) וחלק לא (% ניכוי במקור – רלוונטי רק לספק, כתובת...
אין תגובות

תווים מיוחדים

יום רביעי, אוקטובר 20, 2010

נדרשנו להוסיף לטבלת ניהול טקסט הכולל בין היתר את האות היוונית Σ (אפשר להבין שמדובר בשדה המתאר פעולת סיכום מכיוון שסיגמה מציינת סכום). יצרתי סקריפט מתאים, הרצתי בסביבת הפיתוח ושמרתי, אבל כשפתחתי שוב כדי להעביר לסביבת הבדיקות- התברר שבכל מקום בו הופיע קודם התו Σ הופיע כעת התו ?, והסיבה לכך היא בעיית Encoding בשמירת הקובץ.. יכול להיות שיש לכך פתרון טכני (לשמירה) ואף אשמח לדעת מהו, אבל כפתרון נקודתי מאולתר השתמשתי ב- NChar(931) שמחזיר את התו המבוקש. מהיכן הפונקציה הזו צצה? ניתן להשתמש במערכת תווי Ascii שכוללת 256 תווים (כולל תווי בקרה) ולשמור אותם בתור Char או Varcahr, ואפשר להשתמש...
אין תגובות

חישוב גודל הדטבייס

יום שני, אוקטובר 18, 2010

פרץ ויכוח במשרד בין ה-DBA-ים המשועממים: מה גודלו של הדטבייס? האחד משתמש בפרוצדורות מערכת כדוגמת sp_SpaceUsed, השני רק בפקודות DBCC, השלישי בודק את גודל הקבצים לפי טבלת המערכת sys.sysfiles, הרביעי לא מכיר את אובייקטי המערכת אלא רק את הממשק הגרפי בו הוא בודק את ה-Properties של הדטבייס על ידי קליק ימני, והחמישי – לא תנוח דעתו עד שיראה במו עיניו מה גודל הקבצים ב-File system. התוצאות השונות לא מתואמות זו עם זו, כל אחת מראה משהו קצת אחר, וכל אחד בטוח שהצדק עימו ומלגלג על זולתו.. הגדלים השונים הנמדדים הם אלו: Database Size =הגודל הכללי, כולל הלוג (זה המספר המבוקש – למי שזה...
תגיות:
אין תגובות

גימטריה

יום שישי, אוקטובר 15, 2010

חז"ל פסקו שגמטריאות הן פרפראות לחכמה, אך למעשה כל הבלוג הזה אינו אלא פרפרה אחת גדולה, ולכן לא אמשוך ידי אף מזה: Create Function F_Gimatria(@S Varchar(Max)) Returns Int As Begin Declare @I Int, @Gmtr Int; Select @I=1, @Gmtr=0; While @I<=Len(@S) Select @Gmtr=@Gmtr+Case SubString(@S,@I,1) When 'א' Then 1 ...
אין תגובות

מספרים במילים

יום חמישי, אוקטובר 14, 2010

הנה פרוצדורה רקורסיבית ההופכת מספרים – עד מיליון – למילים (נניח- 999 = תשע מאות תשעים ותשע): Create Function F_Num2Text(@N Int,@ZN Bit=0) Returns Varchar(Max) As Begin Return(Case When @N=1 And @ZN=1 Then 'אחד' When @N=2 And @ZN=1 Then 'שנים' When @N=3 And @ZN=1 Then 'שלושה' When @N=4 And @ZN=1 Then 'ארבעה' ...
אין תגובות

הרשאות ל-Agent ול-Jobs

כל עוד יש שניים-שלושה מפתחים על שרתי הארגון – מקובל לתת לכולם הרשאות sa מלאות בלי להסתבך יותר מדי, אך כשמדובר בארגונים גדולים ובצוותים גדולים – זה כבר לא ראוי: המפתחים יקבלו הרשאות dbo מלאות על הדטבייס שעליו הם עובדים ותו לא, וזה יספיק לטיפול בטבלאות, בפרוצדורות, באינדקסים וכו'. הבעייה שצריך לטפל גם באובייקטים שהם ברמת השרת, למשל – יצירה והפעלה של ג'ובים, וללא הרשאות מתאימות לא ניתן אף לראות אותם (תחת Agent). ההרשאות לטיפול ב-Agent ובג'ובים הם בדטבייס msdb בו גם נמצאות כל טבלאות המערכת הרלוונטיות, ויש שלוש אופציות רלוונטיות:...

טרנזקציות – מה לא ידעתי עד כה?

יום רביעי, אוקטובר 6, 2010

אתמול במפגש ISUG, גיא גלנצר ממדירה הירצה בין היתר על טרנזקציות, תחום שלתומי חשבתי שהכל בו פשוט ומוכר, והתברר שאין זה כך.. למשל הקוד הבא- פותחים טרנזקציה ראשית, מעדכנים טבלה, פותחים טרנזקציה משנית, מעדכנים טבלה, מבצעים Commit לטרנזקציה המשנית, ו-RollBack לראשית: Use tempdb; Go IF Object_Id('T_Trn','U') Is Not Null Drop Table T_Trn; Go Create Table T_Trn(I Int); Go Begin Tran Tr1; Go Insert Into T_Trn Values(1); Go Begin Tran Tr2; Go Insert Into T_Trn Values(2); Go Commit Tran Tr2; Go Rollback; Go Select * From T_Trn; Go האם ה-Commit הראשון שומר "באופן בלתי הפיך" את הערך 2 או שמא זה לא נגמר עד שהגברת מתחילה לשיר ומתבצע ה-Commit הסופי על הכל? 1. אם בסוף מתבצע Rollback- מתבטל כל מה שנעשה במהלך הטרנזקציה...

פונקציות חלון: יתרונות וחסרונות

יום שלישי, אוקטובר 5, 2010

עד כה סברתי לתומי שפונקציות החלון הן לא רק שימושיות במובן זה שהן מאפשרות להגיע לתוצאות המבוקשות ללא משפטי SQL מורכבים ובלתי ניתנים לפיענוח, אלא שהן גם יעילות יותר: החבר'ה המצויינים ממיקרוסופט כתבו את הקוד הסודי שמשמש אותן, ולבטח עשו זאת בדרך היעילה ביותר האפשרית. למרה הפתעתי מתברר שהביצועים שלהם לא תמיד המשובחים ביותר, ולעיתים יש מקום לחשב שכר מצווה כנגד הפסדה. הדוגמאות שלהלן הן ברובן טכניות ואין מאחוריהן שום הגיון עיסקי, והן יעשו שימוש בטבלה AdventureWorks.Sales.SalesOrderDetail שיש בה מעל 120,000 שורות (כלומר- מספיק "בשר"), כאשר השאילתות הורצו על גרסת 2005. נתבונן בשתי השליפות הבאות וב-Execution Plans שלהן- הן מחזירות בדיוק...

קוד המשכפל את עצמו

בספרו "SQL Server 2005" – איציק בן גן מציג אתגר: כתיבת קוד המשכפל את עצמו. אסור להיעזר בפונקציות מערכת לזיהוי הקוד אותו אני מפעיל, למשל- SELECT DEST.TEXT FROM sys.dm_exec_connections SDEC CROSS APPLY sys.dm_exec_sql_text(SDEC.) AS DEST Where SDEC.most_recent_session_id=@@SPID; למה אסור? דווקא אחלה רעיון, ויש דרכים שונות לשלוף מהמערכת את הקוד הנוכחי שרץ.. פתרון מותר המוצג בספר (כדי לא לקלקל- הפונט בצבע לבן, ויש להעתיקו ל-SSMS): Print Replace(0x2027202729,0x20,'Print Replace(0x2027202729,0x20,')   פתרון מניח את הדעת לא מצאתי, ולכן אין ברירה אלא למצוא פתרונות לא מניחים את הדעת: 1. פתחו Query חדש ב-SSMS ולחצו על Execute. מכיוון שלא כתוב כלום, לא תתקבל אף תוצאה.. 2. הריצו את הקוד הבא (זו הודעת שגיאה שתשכפל את עצמה): Msg...
אין תגובות