Entity Framework והטעויות שיגרמו לכם לבעיות ביצועים מול הדטאבייס

1 בApril 2019

בעשור האחרון, מרבית הפיתוח מול הדטאבייסים עושה שימוש ב- ORM-ים כאלה ואחרים. אחד ה- ORM-ים הפופולריים בעולם הדוטנט, הוא Entity Framework. בפוסט הזה, אסקור טעויות נפוצות שמשליכות על ביצועים של עבודה מול ה- DB בעבודה עם ORM-ים באופן כללי, ובפרט בעבודה עם Entity Framework.כלל הדוגמאות בפוסט מבוססות על ה- DB של Stack Overflow, בגרסה שהתאמתי עבור הקורס SQL שהקלטתיבזמנו. הדוגמאות מבוססות על Entity Framework 6.2, על אף שחלקן רלוונטיות לכל סוגי ה- ORM-ים. לקריאת הפוסט.
אין תגובות

מה הבעייה עם nvarchar(max) או varchar(max)

10 בMarch 2019

בלא מעט מקרים, כאשר מתכננים סכימה של טבלה שאמורה לאכסן מידע טקסטואלי – מתלבטים לגבי הגודל המקסימלי של המידע. לפעמים, אנחנו עלולים להגיד לעצמנו “למה לקבוע מספר היום, ולקבל exception מחר כשננסה להכניס מידע גדול מדי? פשוט נשתמש ב- varchar(max) או nvarchar(max)”.לעיתים, משתמשים בכלים חיצוניים לייצור הסכימה של ה-DB (כמו EF Code First), שההתנהגות הדיפולטית שלהן עבור שדות טקסטואליים (אלא אם הוגדר אחרת) היא להגדיר את השדות בתור nvarchar(max). אז – מה בעצם הבעייה בלהגדיר עמודה בתור “max”? בעיקר שאתם מקשים על ה-DB לקבל החלטות נכונות. מוזמנים לקרוא את הפוסט שלי בנושא כאן.
תגיות: , ,
אין תגובות

SQL Server: שימוש בפונקציות COMPRESS ו- DECOMPRESS לטובת דחיסת נתונים

1 בMarch 2019

SQL Server מציע באופן מובנה אמצעים לדחיסת המידע בטבלה/אינדקס (בטבלאות row store) – שימוש ב- row/page level compression. אולם, במצבים מסויימים שימוש ב- row/page level compression יהיה לא אפקטיבי, וייתן תוצאות לא טובות. בחלק מהמקרים הללו, ניתן לפתור את הבעייה ע”י שילוב של GZIP Compression, באמצעות הפונקציות COMPRESS/DECOMPRESS.להסבר על הפונקציות הללו, מתי הן יכולות לעזור לנו, benchmark-ים ועלויות – קראו את הפוסט על שימוש ב- COMPRESS/DECOMPRESS לטובת דחיסת נתונים ב-בלוג החדש שלי.
תגיות:
אין תגובות

DbFunctions.TruncateTime ובעיית הביצועים המוחבאת

9 בMarch 2018

לאחרונה נתקלתי בבעיית ביצועים בעת עבודה עם Entity Framework שנגרמה כתוצאה משימוש במתודה DbFunctions.TruncateTime. לטובת הדוגמא, בואו נסתכל על טבלה בשם Posts במבנה כמו בתמונה מצד שמאל. הטבלה מכילהה מס’ עמודות, ובין היתר עמודת CreationDate מסוג datetime (או datetime2, פחות רלוונטי למקרה שלנו) שכוללת התאריך והזמן של יצירת רשומה. נניח גם שהעמודה הזאת היא ה- clustered index של הטבלה (מדובר ב- clustered index הגיוני). המטרה שלנו -  להביא את כל השורות שנוצרו בתאריך מסויים. למשל, נרצה להביא את כל השורות שנוצרו ב- 25.06.2016 (בלי חשיבות לזמן שבה הן נוצרו). יש כמה דרכים אפשריות לעשות את זה. אפשר לעשות שאילתה על הטווח (בין ה-25 ל-26),...
אין תגובות

טעינת נתונים מ- SQL Server ל- Elasticsearch

2 בDecember 2017

Elasticsearch, למי שלא מכיר, הוא מנוע אינדוקס פופולרי מאד המבוסס על מנוע האינדוקס של Lucene. מדובר למעשה ב- Document DB עם דגש חזק מאד על חיפוש טקסטואלי במידע (למרות שככל שעובר הזמן מתווספים לו פיצ’רים של document db גנרי, בכלל זה גם אגרגציות וכו’).בפוסט הזה אני אסביר איך  אפשר לדאוג לזרימת נתונים שוטפת מ- SQL Server ל- Elasticsearch. למה שנרצה דבר כזה? כמובן, שאם אתם משתמשים ב- Elasticsearch בתור מנוע עיקרי לאכסון ולתשאול המידע שלכם, ופה ושם מחזיקים גם אפליקציה מעל SQL Server (או כל DB רלציוני אחר), הצורך בכזה פיתרון ברור – אתם רוצים כנראה...
אין תגובות

QDS_LOADDB-מה זה אומר ומה אפשר לעשות

21 בNovember 2017

אחד הפיצ’רים שהושקו ב- SQL Server 2016 היה ה- Query Store. אם עוד לא יצא לכם להכיר אותו, ממליץ לקרוא עליו קצת פה. בגדול, מדובר בכלי שמאפשר להוציא insights טובים יותר בסוגיות שמעסיקות DBA-ים. בין היתר, זיהוי של שאילתות מעמיסות, זיהוי רגרסיות בריצת שאילתות וטיפול נוח בזה ועוד. החל מ- SQL Server 2017, המנגנון של ה- Query Store גם משמש את פיצ’ר ה- Automatic Tuning של שאילתות, שמאפשר להגדיר את ה- flag של “FORCE_LAST_GOOD_PLAN” שעוזר (פוטנציאלית) למנוע רגרסיות שנובעות מבחירת execution plan פחות טוב מ-execution plan שנעשה בו שימוש בעבר. אבל, לפעמים אנחנו מגלים את העלויות הנסתרות של דברים טובים. הרבה...
תגיות: ,
אין תגובות

SQL Server: הצגת טכניקות שונות למעקב אחרי שינויים בטבלאות

25 בJuly 2017

מפתחים ו-DBA-ים רבים נדרשים בשלב זה או אחר להתמודד עם הדרישה הבאה: יש אפליקציה כלשהי שצריכה לקבל איזשהו feed על נתונים חדשים או נתונים שהתעדכנו עבור איזשהו צורך (אפליקציה שממתינה למידע חדש, תהליך ETL וכו’ ורוצות לקבל “דלתאות” של מה שקרה), כאשר המקור לנתונים הללו זאת איזושהי אפליקציה אחרת – שהיא בעצמה מעדכנת אותם ב- SQL Server.בד”כ בשלב הזה הרבה פעמים הולכים לפי ההיגיון הבא – אם המידע בסופו של דבר נמצא ומאוכסן ב- SQL Server, למה שלא נשתמש בו גם בתור דרך “להפיץ” את המידע לאפליקציות ולתהליכים אחרים? המידע נכנס ל-DB, ואפליקציות אחרות שמעוניינות במידע פשוט ישלפו אותו...
תגיות: , ,
4 תגובות

קורס SQL בסיסי–חינם ביוטיוב

21 בJune 2017

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

SQL Server: גיבויים, שחזורים–ומה עושים כשה-DB נעשה גדול

18 בMay 2017

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

שימוש ב- AlwaysOn להרמת Readable Secondary–איך זה יכול להשתבש ומה אפשר לעשות

18 בMarch 2017

לאורך השנים, עבר SQL Server לא מעט שלבים באבולוציה של פתרונות שהמטרה שלהם לתת HA/DR מסוגים שונים. בשנים האחרונות, אחד הפתרונות המרכזיים שבו עושים שימוש הוא AlwaysOn. אחד הדברים החזקים ב- AlwaysOn הוא הגמישות שלו וההתאמה שלו למגוון (יחסית רחב) של תרחישים. אחד הדברים המעניינים שזה מאפשר, הוא הרמת read-only replica. הרעיון הוא replica מעודכנת, שמקבלת את כל המידע ומשמשת בד”כ לשליפות שונות – כאשר אפשר למשל להריץ עליה תהליכי reporting, לעשות בה שימוש לשאילתות ad-hoc וכו’ – מבלי להפריע לאפליקציה המרכזית. או לפחות, זה הרושם שעלול להתקבל אם רק קוראים על הנושא ברפרוף. המטרה שלי בפוסט הזה...
תגיות: ,
אין תגובות