אינדקסים וספריית אוניברסיטת חיפה

29/11/2010

בדרך כלל כשאני מתבקש להסביר מהו אינדקס, אילו סוגי אינדקסים קיימים, למה הם משמשים ואילו אופציות קיימות בהם- אני פותח ב-"שערו נא בנפשכם ש.." ואז ממשיל את הטבלה לספריה או אולי לספר טלפונים או אפילו לתוכן עניינים של ספר או רשימת קניות התלויה על המקרר; והמאזין בטוח שהעגבניות ברשימת הקניות הן Clusterd Index, הספרנית הממושקפת מהספריה היא הסטטיסטיקה, ו-"כהן אבי" מספר הטלפונים הוא Index Scan.. בקיצור- לך תסביר מה המשל ומה הנמשל! אנסה אם כך להיצמד למשל המוצלח מכולם – הספריה – להדגים את מה שניתן להדגים, ולהסתייג במקומות בהם המשל אינו דומה לנמשל.. בימי חלדי...

הצגת מספר עם פסיקים (אלפים)

27/11/2010

נשאלתי כיצד ניתן להציג מספרים עם פסיקים מפרידים, למשל- 1234567 כך 1,234,567. התשובה המיידית היא שדברים כאלה ראוי שיעשו בממשק המשתמש ולא בדטבייס, אבל מה לעשות וזו השאלה וגם אני לא אוהב לקבל תשובות שמשמעותן "יש לי תשובה מצויינת אך לא לשאלה ששאלת, אז במקום שאני אתאים את התשובה לשאלה, אתה תתאים את השאלה לתשובה".. הפתרון הכי טוב שמצאתי הוא להשתמש בפונקציית Convert בצירוף אופציית ה-Style שמאפשרת הצגת מספרים מסוג Moneyו-SmallMoney עם פסיקים כנדרש, ובתוספת שתי ספרות מימין לנקודה. לשם כך יש להפוך את המספר ל-Money בעזרת Cast, ואם מתעקשים להשמיט את הנקודה ושתי הספרות שמימין...
תגיות: , , , ,
אין תגובות

מגבלות ה-Sequence ופריצתן

25/11/2010

כמה ימים לאחר שפירסמתי את הפוסט שלי לגבי Sequence - מספור אוטומטי משותף, פרסם איציק בן-גן פוסט באותו נושא, ומה לעשות- חוץ מזה שהוא תותח מבחינה טכנית, הוא מבין את הפילוסופיה של ה-SQL לעומק - והבנה כזו לא פוגשים הרבה; ואני מתייחס כאן בעיקר לכך שהוא הראה ששליפה כפולה מ-Sequence בסגנון של Select Next Value For MySeq ID1, Next Value For MySeq ID2; תחזיר אותו מספר פעמיים ולא שני מספרים עוקבים, והסיבה אינה "ככה זה" או צידוק...
אין תגובות

הצגת "דפים" מתוך טבלה – מחידושי Denali

22/11/2010

בימי SQL Server 2000 העליזים, כשהיינו צריכים להציג את שורות מספר 21-30 (למשל) מתוך הטבלה (בדרך כלל עבור אתרי אינטרנט בהם מציגים מסך של תוצאות וניתן לעבור למסך הקודם או הבא על ידי Prev ו-Next בהתאמה)- היינו שולפים את 30 השורות הראשונות, ממיינים הפוך ושולפים את 10 הראשונות (ליתר דיוק- 10 האחרונות מתוך ה-30), וזו השליפה המבוקשת: Select Top 10 name From (Select Top 30 name ...
אין תגובות

הצגת "דפים" מתוך טבלה – מחידושי Denali

בימי SQL Server 2000 העליזים, כשהיינו צריכים להציג את שורות מספר 21-30 (למשל) מתוך הטבלה (בדרך כלל עבור אתרי אינטרנט בהם מציגים מסך של תוצאות וניתן לעבור למסך הקודם או הבא על ידי Prev ו-Next בהתאמה)- היינו שולפים את 30 השורות הראשונות, ממיינים הפוך ושולפים את 10 הראשונות (ליתר דיוק- 10 האחרונות מתוך ה-30), וזו השליפה המבוקשת: Select Top 10 nameFrom (Select Top 30 name From sys.objects Order By name) TOrder By name Desc;Go עשיתי לעצמי כאן...
אין תגובות

שיפור ביצועי שאילתות על ידי שימוש ב-Group By במקום ב-Join / Exists

21/11/2010

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

מניעת הזנה כפולה

17/11/2010

יש לנו טבלת ניהול, למשל- טבלת סוגי עובדים, ובה עובד ומנהל: Create Table T_SugeyOvdim(MisparSug Int Primary Key, ShemSug Varchar(50)); Go Insert Into T_SugeyOvdim Select 10,'עובד' Union All Select 20,'מנהל'; Go יום אחד נוצר צורך להוסיף סוגים חדשים, למשל- פרילנסר ומנהל בכיר; ומכיוון שמדובר בטבלת ניהול- יוצרים סקריפט להוספת השורות החדשות, מוסיפים בשרת הפיתוח ובודקים שהכל רץ בסדר; מוסיפים בשרת הבדיקות ומבצעים בדיקות ברמת המערכת; ולבסוף מעלים לייצור. סקריפט ההוספה צריך להיות כתוב כך שלא ננסה להוסיפן פעמיים (במקרה וטעינו והשורות כבר התווספו), שכן...
אין תגובות

כתיבת תאריכים

במקום העבודה שלי מקובל לכתוב תאריכים בשאילתות SQL בערך כך: Select * From MyTbl Where MyCol='2010-01-12'; Go הסיבה לכך כנראה היא שבשליפות מתוך טבלאות, התאריכים בעמודות מסוג DateTime מוצגים לרוב כך (כולל פירוט ברמת אלפיות השניה)- 2010-01-12 00:00:00.000 ..ואם כך ה-SQL Server, אין לנו אלא לדבר בשפתו כדי שיבין. פורמט הכתיבה הזה עובד בהצלחה רק במקרה: שפת ברירת המחדל של המערכת אצלנו וברובן המוחלט של ההתקנות בארץ היא US_English (הגדרת שפת ברירת המחדל של ה-Logins נקבעת לרוב על פי זו של השרת, וזו גם השפה של ה-Session אותו פתחנו), ולכן התאריך הנ"ל מתפרש נכון בתור "שנים עשר בינואר אלפיים...

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

14/11/2010

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