sys.dm_db_index_usage_stats: האם יש שימוש לאינדקסים

יום שישי, אוגוסט 14, 2015

הפוסט הקודם שלי עסק בפקודות Insert לטבלה מאונדקסת, והראה את המחיר שלהם: הרווח ב-Select ידוע, אך יש לזכור שאנחנו משלמים על כך בכל פקודת Insert/Update/Delete, ויש לבחון שאיננו מחזיקים אינדקסים מיותרים שעולים לנו בתחזוקתם, אך אינני משתמשים בהם ומפיקים מהם תועלת.המקור למידע לגבי השימוש באינדקסים נמצא בטבלת המערכת המצויינת בכותרת. צריך כמובן לברר איזו טבלה עומדת מאחורי כל object_id, איזה אינדקס מאחורי כל index_id, מה המבנה של האינדקס וכו’; וכדי לעשות “לונג סטורי שורט”, להלן השליפה עם כל מה שצריך: Declare @TableName Varchar(200)='dbo.MyTbl';With Idx As(Select I.object_id, I.index_id,...

מחיקת שורה בטבלה שמופנה אליה FK

יום שלישי, אפריל 21, 2015

נניח שאנחנו רוצים למחוק שורה מטבלת ההזמנות. הבעייה הצפוייה היא שטבלת שורות ההזמנה מקושרת אליה ביחס של 1:N (אחת לרבים), ולכן יש למחוק קודם כל את שורות ההזמנה ורק לאחר מכן את ההזמנה עצמה.לעיתים העסק עלול להסתבך: יש טבלת עובדים, הרבה מאוד טבלאות הכוללות קוד עובד מקושרות אליה, ולעיתים הן עצמן מהוות צד ה-1 לאיזה יחס FK וכך הלאה.. בקיצור- כבר מריחים רקורסיה באוויר!הפרוצדורה שלהלן פועלת כדלקמן: מפעילים אותה עם שם טבלה (סכימה + שם) וקוד מפתח למחיקה.מראש אני מבהיר שאני מניח באופטימיות שהמפתח הוא על עמודה אחת בלבד בכל הטבלאות המעורבות. הפרוצדורה יוצרת טבלה זמנית T# שתשמש...
תגובה אחת

בעיות עם אובייקטים הקשורים לטבלאות זמניות

יום חמישי, יוני 26, 2014

כל מי שמכיר את SQL Server ולו באופן בסיסי, יודע שניתן ליצור טבלאות זמניות שמוכרות רק ב-Session בו הן נוצרו, וכך משתמשים שונים יכולים ליצור טבלאות זמניות בעלות שמות זהים במקביל; למשל- כשמספר משתמשים מריצים אותו סקריפט או אותה פרוצדורה בו זמנית.למשל- נריץ את הסקריפט הבא: Create Table #T(ID Int Not Null);Go כעת נפתח חלון חדש ב-SSMS (כלומר- New Query), נריץ אותו סקריפט, והטבלה תיווצר גם שם ללא בעיות.כעת נחזור לחלון הראשון וניצור מפתח ראשי: Alter Table #T Add Constraint PK_#T Primary Key Clustered(ID);Go נלך לחלון השני ליצור גם שם Primary Key, אך אבוי: הטבלאות יכולות להתקיים במקביל, אך המפתחות הראשיים...
אין תגובות

חפיפה בין אינדקסים

יום ראשון, פברואר 16, 2014

נתקלתי פעם במקרה הבא- טבלה שהוגדרו לה שני אינדקסים: Primary Key & Clusterd Index על עמודות Col1, Col2, Col3. Unique Index על עמודות Col1, Col2. כבר במבט ראשון אפשר לראות בעייה בסיסית – אם כל צירוף של Col1, Col2 הוא יחודי, מדוע המפתח כולל גם את עמודה Col3?זה לא נכון, מי שינסה להכניס לטבלה את הצירופים 1,1,2ו-1,1,3 יקבל הודעת שגיאה בגלל האינדקס השני (למרות שלפי הגדרת המפתח שני הצירופים נראים תקינים), ומי שיצור Foreign Key לטבלה – יאלץ לכלול בה עמודה מיותרת ללא צורך. יתכן ש"כוונת המשורר" הייתה שהמפתח הוא Col1,Col2 אבל הוא רצה ליצור Clustered Index שיכלול...
אין תגובות

טבלה בת שורה אחת

יום שישי, ספטמבר 3, 2010

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

מציאת התאמות לפי קריטריונים גמישים

יום שלישי, אוגוסט 31, 2010

בפורום בסיסי נתונים שבתפוז הופיעה שאלה לגבי התאמת מועמדים למכללות: יש מועמדים כשלגבי כל אחד יש נתונים אם שירת בצבא, יש לו בגרות, עשה  יח"ל במתימטיקה וכו'; ויש מכללות שתנאי הקבלה שלהן יכולים לכלול חלק מהסעיפים הנ"ל; ויש למצוא איזה מועמד מתאים לאיזו מכללה. הפתרון הראשון שעלה בדעתי הוא לצרף לטבלת המועמדים עמודות כן/לא בהתאם לתנאים, לצרף לטבלת המכללות עמודות כן/לא בהתאם, ולשלוף כך: Select * From Students S Inner Join Universities U On S.Army>=U.Army And S.Bagrut>=U.Bagrut And S.Math5>=U.Math5; Go הבעייה בפתרון הוא היעדר גמישות:...
אין תגובות

הנפה של ארטוסתנס

יום שישי, אוגוסט 27, 2010

הנפה של ארסטותנס היא אלגוריתם למציאת כל המספרים הראשוניים מ-2 ועד לערך שנקבע מראש: 2 הוא הראשוני הראשון ולכן נמחק את כל המספרים שמתחלקים ב-2 המספר הכי קטן מעל 2 הוא ,3 מכאן שהוא ראשוני, ולכן נמחק את כל המספרים שמתלקים ב-3 המספר הכי קטן מעל 3 הוא 5 (4 כבר נמחק בתור כפולה של 2) ולכן נמחק את כל כפולותיו.. כך ממשיכים עם כל הרשימה, כשלמעשה מספיק להמשיך עד לשורש של הערך המקסימלי ברשימה.. נכין טבלת מספרים מאונדקסת מ-2 ועד 1,000,000: If Object_Id('T_Misparim') Is Not Null Drop Table T_Misparim; Go Declare @N Int=1000000; With T As (Select 2 Mispar Union All Select Mispar+1 From ...

טרנזקציות, שגיאות ושגרות שגיאה: השימוש באופציית Xact_Abort ובפונקציה Xact_State

יום שני, אוגוסט 23, 2010

האופציה Xact_Abort מגדירה אם בשעת שגיאה לעצור את הריצה ולבצע Rollback לטרנזקציה (On) או לא (Off), כאשר האופציה השניה היא ברירת המחדל. הפונקציה Xact_State קובעת האם יש טרנזקציה פתוחה (1) או אין טרנזקציה פתוחה (0); וכן האם יש טרנזקציה פתוחה שלא ניתן לבצע לה Commit אלא רק Rollback בשל שגיאה (1-). דוגמה 1 – ניצור טבלה עם Primary Key (אסור להכניס ערכים כפולים), ונראה מה קורה במקרה של Xact_Abort Off (ברירת החמדל): Use tempdb; Go If Object_Id('T','U') Is Not Null Drop Table T; Go Create Table T(A Int Not Null Primary Key); Go Set Xact_Abort Off;--ברירת מחדל Select 1 N, 'Before...

השימוש ב-Foreign Key

יום חמישי, יולי 1, 2010

Foreign Key נועד להגדיר קישורי 1:N (אחת לרבים) בין טבלאות. קיומו מהווה אבטחת איכות לנתונים, ובפוסט קודם ציינתי יתרון נוסף שנגזר מכך: אם נתעקש לבדוק שהנתונים בטבלאות המקושרות תקינים ומקיימים את ה-Foreign Key – המערכת לא תצטרך לבדוק ותודיע ללא בדיקה שהכל תקין. ניתן להגדיר על ה-Foreign Key גם Cascade של פעולות Update ו-Delete: 1. אם מעודכן המפתח בצד ה-1, הוא יתעדכן אוטומטית גם בצד ה-N (אחרת היינו צריכים לבטל את הרשומות בצד ה-N, לשנות בצד ה-1, וליצור מחדש בצד ה-N). 2. אם נמחקת שורה בצד ה-1, ימחקו כל השורות המקושרות אליה בצד ה-N. בנוסף יש לשים לב שהעמודה שבצד ה-1 צריכה להיות Primary...