שימוש יעיל ב-Table Valued Functions

30/04/2012

כששולפים מטבלה ידוע שיש להיזהר בשימוש ב-Scalar Functions הכוללות פניה נוספת לְטבלה מכיוון שהפניה לטבלה השנייה מתבצעת בנפרד לכל שורה מהטבלה הראשונה, אך מה קורה כשמבצעים Join בין טבלה לבין Table Valued Function? האם גם במקרה זה תתבצע פניה נפרדת לכל שורה? לאחר שבפוסט הקודם הראיתי כיצד ניתן לעקוב אחר ריצות של פונקציות, ננצל את הפתרון משם כדי לבדוק כמה פעמים הפונקציה מופעלת. ניצור Table Valued Function שמקבלת פרמטר ומחזירה אותו בתור טבלה, שימוש מגוחך כמובן לצורך הבדיקה בלבד; ואת הפרמטר נפנה לקובץ טקסט לצורך המעקב (בכל הפעלה יופנה הפרמטר לקובץ): ...
אין תגובות

מעקב אחר ריצה של פונקציות

25/04/2012

בפרוצדורות ניתן למקם פקודות Print כדי לקבל פלט של הריצה ל-SSMS או לקובץ חיצוני, כיצד ניתן לעשות זאת בפונקציה? בפונקציה לא ניתן למקם פקודות Print או RaisError ויש בעייה ביכולת לעקוב אחר הריצה, לדבג בשלב הפיתוח, לנטר בסביבת הייצור וכו'. לא ניתן גם לעדכן טבלת לוג מתוך הפונקציה, ואף לא להפעיל מתוכה פרוצדורה נפרדת שהיא עצמה תבצע את מה שלפונקציה אסור. מה אם כך ניתן לעשות? הצעת פתרון: אפשר להשתמש בפרוצדורה XP_CmdShell להפניית הערות לקובץ טקסט, ואפילו לעדכון טבלאות אם מפעילים בעזרתה את SQLCmd...
אין תגובות

יעול פקודות Update

24/04/2012

יש לנו טבלה בה יש לעדכן עמודה לפי לוגיקה מסויימת. למשל- לקצר מחרוזת ל-80 תווים: Update MyTbl Set MyFld=Left(MyFld,80); טיוב נתונים! מה משנה אם המחרוזת ארוכה מ-80 תווים או לא? מה שבטוח בטוח: נעדכן את כולם, אם לא יועיל- בוודאי שלא יזיק.. אז זהו שכן- פעולת עדכון מיותרת אולי אינה פוגעת באיכות הנתונים, אבל מבזבזת משאבים ללא צורך. להדגמה ניצור טבלה מתאימה: If Object_ID('Tbl','U') Is Not Null Drop Table Tbl; Go ...
תגיות: , , ,
2 תגובות

Paging לפי קבוצות

19/04/2012

פוסט זה עוסק בשליפה של שורות X-Y מקבוצות שונות בטבלה (למשל- מכירות 5-8 לפי הסכום של כל אחד מהמוכרים בארגון). עסקתי מספר פעמים בעבר בנושא ה-Paging, בעיקר בעקבות הכלי היעודי לנושא שהוצג בגרסת 2012, והפעם מדובר בהרחבה והכללה של הנושא: במקום שורות 5-8 מטבלת המכירות, נרצה להציג את שורות 5-8 של כל אחד ואחד מהמוכרים בטבלת המכירות. ניתן לראות את זה גם כהכללה של בעיית ה-Top למספר קבוצות: בעבר הראיתי כיצד להציג את X השורות הראשונות של כל אחת מהקבוצות, וכעת נראה את X-Y השורות החל משורה X וכלה בשורה Y (נו...
תגיות: , , ,
אין תגובות

השימוש ב-Context_Info למעקב אחר תהליכים

17/04/2012

לפני מספר שבועות כתבתי פוסט על השימוש ב-Context_Info: משתנה ברמת ה-Session המאפשר לשמור מחרוזת באורך של עד 128 תווים שקיימת כל עוד ה-Session פתוח. כתבתי כי נתקלתי במקרה באופציה הזו, ניסיתי אותה, והרהרתי כיצד ניתן להשתמש בה (ביננו- למה יש טבלאות?..). רצה הגורל והתבקשתי לטפל בבעייה ומצאתי פתרון שהשימוש ב-Context_Info תפור בדיוק על פי מידותיו. אנחנו מריצים תהליכים מורכבים של העברה ועיבוד נתונים: פרוצדורה ראשית שמפעילה מספר פרוצדורות שכל אחת מפעילה פרוצדורות משנה וכו'. אסור להריץ את התהליך במקביל לעצמו, ולכן כשהוא רץ יש למנוע אפשרות...
אין תגובות

Service Broker Dubugging

15/04/2012

כתבתי בעבר שני פוסטים על Service Broker והפעלת פרוצדורות באופן אסינכרוני באמצעותו: 1, 2. הראשון כולל דוגמה מקיפה לתרגול, והשני מספר לקחים והערות בעקבות פרוייקט מעשי. נושא הדיבוג הוא די בעייתי מכיוון שהפרוצדורה שרצה באופן אסינכרוני עושה זאת אי שם בזכרון של השרת ולא ב-SSMS הפתוח מולנו, ולכן קשה ללכוד שגיאות במהלך הפעלתה: אם היא נופלת כל מה שנראה זה שלא קרה שום דבר, ולא יהיה חיווי מה השתבש, למה, היכן והאם. כיצד בכל זאת ניתן לדבג את הפרוצדורה האסינכרונית? 1. יוצרים טבלת לוג, שולחים אליה הודעות...
אין תגובות

Contained Databases–דטבייסים “הכל כלול” (בתרגום חופשי)

04/04/2012

החל מגרסת SQL Server 2012 התווספה יכולת חדשה של יצירת Contained Databases, כשהכוונה ליכולת ליצור דטבייסים עצמאיים שאינם תלויים פונקציונלית בשרת. לכאורה דרישה הגיונית לאור העובדה שבדטבייס רלציוני צריכות להיות טבלאות, מפתחות ראשיים, ויחסים בין הטבלאות (1:N, 1:1, N:N) ותו לא; אבל לצרכים מעשיים יש עוד כמה דרישות שדטבייס עצמאי מתקשה להתמודד איתן. SQL Server הוא מערכת, ובתור שכזה- הרכיבים השונים בו אינם עצמאיים. למשל- טבלה אינה יכולה להתקיים בנפרד מהדטבייס: ניתן אולי לייצא את ההגדרות והנתונים שלה לקובץ טקסט או ל-Excel, אך לא את הטבלה עצמה. דטבייס, לעמות זאת, יכול לכאורה להתקיים בנפרד- ניתן ליצור...