שאילתת טבלת Delta ענקית (מעל 500 מיליון שורות) ב-Fabric lakehouse עם ביצועים אופטימליים וגישת נתונים בזמן אמת כמעט.
→השתמש במודל סמנטי במצב Direct Lake.
למה: Direct Lake קורא קבצי Parquet ישירות מ-OneLake, תוך עקיפת ייבוא נתונים או תרגום שאילתות. הוא מספק ביצועים דמויי ייבוא ללא כפילות נתונים או חביון רענון. DirectQuery איטי יותר; מצב Import מציג חביון.
החלת חישובי time-intelligence נפוצים (YTD, QTD, MTD) על עשרות מדדי בסיס (Sales, Profit, Quantity) מבלי ליצור מאות מדדי DAX.
→הטמע קבוצת חישוב עם פריטי חישוב עבור YTD, QTD ו-MTD.
למה: קבוצות חישוב מבטלות ריבוי מדדים. הן מגדירות קבוצה של חישובים גנריים שניתן ליישם באופן דינמי על כל מדד נבחר, ובכך מפשטות באופן דרסטי את תחזוקת המודל.
מודלים סמנטיים מרובים בסביבת עבודה צריכים לשתף טבלאות ממדים משותפות (לדוגמה, Date, Customer) כדי להבטיח עקביות ולהפחית כפילות נתונים.
→צור מודל סמנטי "ליבה" המכיל את הממדים המשותפים. בנה מודלים "מורכבים" אחרים המתחברים למודל הליבה באמצעות DirectQuery ולטבלאות עובדה באמצעות Direct Lake/Import.
למה: ארכיטקטורת "hub and spoke" זו מקדמת מקור אמת יחיד לממדים. מודלים מורכבים מאפשרים שילוב נתונים ממקורות ומצבי אחסון שונים למודל מאוחד.
לטבלת עובדה יש מספר עמודות תאריך (לדוגמה, OrderDate, ShipDate) שכולן חייבות להתייחס לטבלת מימד תאריך אחת.
→צור קשר פעיל אחד ומספר קשרים לא פעילים בין טבלאות העובדה והתאריך. השתמש בפונקציית DAX `USERELATIONHIP()` במדדים כדי להפעיל את הקשר הלא פעיל המתאים.
למה: Power BI מאפשר רק קשר פעיל אחד בין שתי טבלאות. תבנית זו מאפשרת ניתוח לפי תפקידי תאריך שונים מבלי לשכפל את טבלת הממד.
רענון של מודל סמנטי עם טבלת עובדות גדולה (מיליארדי שורות) לוקח זמן רב מדי. רק 30 הימים האחרונים של הנתונים משתנים לעיתים קרובות.
→קנפג רענון מצטבר (incremental refresh) בטבלת העובדות. הגדר פרמטרים `RangeStart` ו-`RangeEnd`. הגדר מדיניות לארכיון נתונים ישנים (לדוגמה, שמירת 5 השנים האחרונות) ורענון נתונים עדכניים (לדוגמה, רענון 30 הימים האחרונים).
למה: זה מפחית באופן דרמטי את זמן הרענון וצריכת המשאבים על ידי עיבוד רק מחיצות המכילות נתונים חדשים או ששונו, במקום טעינה מחדש של הטבלה כולה.
מדד DAX מורכב איטי מכיוון שהוא מחשב שוב ושוב את אותו ערך ביניים בתוך הנוסחה שלו.
→השתמש במשתנים (`VAR`) כדי לאחסן את תוצאת חישוב הביניים פעם אחת, ולאחר מכן הפנה למשתנה מספר פעמים בהצהרת `RETURN`.
למה: משתנים מונעים מהמנוע להעריך מחדש את אותה לוגיקה מספר פעמים בתוך ביצוע מדד יחיד, מה שמשפר משמעותית את הביצועים, במיוחד בהקשרים איטרטיביים.
יצירת מדד לחישוב אחוז התרומה של ערך (לדוגמה, מכירות מוצרים) לסכום כולל גדול יותר (לדוגמה, כלל מכירות המוצרים), תוך כיבוד מסננים אחרים (כמו תאריך).
→השתמש ב-`DIVIDE([Sales], CALCULATE([Sales], ALLEXCEPT(Product, Product[Category])))` עבור אחוז מהקטגוריה או ב-`CALCULATE([Sales], ALL(Product))` עבור אחוז מהסכום הכולל.
למה: `CALCULATE` בשילוב עם `ALL`, `ALLEXCEPT` או `REMOVEFILTERS` מאפשר לשנות את הקשר המסנן כדי לקבל את המכנה הנכון לחישוב האחוז.
דוח דורש slicer המאפשר למשתמשים לבחור איזה מדד (לדוגמה, "Revenue", "Cost", "Profit") תצוגה חזותית צריכה להציג.
→צור טבלה מנותקת עם שמות המדדים. צור מדד DAX יחיד באמצעות `SWITCH(SELECTEDVALUE(MetricTable[Metric]), "Revenue", [Total Revenue], "Cost", [Total Cost], ...)`.
למה: תבנית זו, שלעתים קרובות משתמשת ב-Field Parameter, מספקת דרך דינמית וידידותית למשתמש להחליף חישובים ללא צורך בסימניות או ויזואליזציות מרובות, מה שהופך דוחות לאינטראקטיביים ותמציתיים יותר.
צוות BI ארגוני צריך להשתמש בכלים מקצועיים (כמו Visual Studio, Tabular Editor, SQL Profiler) כדי לנהל, לפרוס ולפתור בעיות במודל סמנטי של Fabric.
→אפשר את ה-XMLA Read/Write endpoint עבור סביבת העבודה.
למה: ה-XMLA endpoint חושף את המודל הסמנטי כמעין מופע של Analysis Services סטנדרטי, המאפשר קישוריות ממערכת אקולוגית רחבה של כלי BI ו-ALM מתקדמים לגישה תכנותית ומשימות מידול מורכבות.
מודל Direct Lake פועל לאט. חקירה מגלה שהוא חוזר למצב DirectQuery.
→השתמש ב-DAX Studio או Performance Analyzer כדי לזהות את השאילתה הגורמת לחזרה לאחור. גורמים נפוצים כוללים פונקציות DAX שאינן נתמכות, RLS מורכב, או lakehouse לא מותאם/לא עדכני.
למה: ל-Direct Lake יש מגבלות. כאשר שאילתה משתמשת בתכונה שאינה נתמכת, היא חוזרת בשקט למנוע DirectQuery האיטי יותר. זיהוי ותיקון שורש הבעיה (לדוגמה, אופטימיזציה של DAX, הפעלת OPTIMIZE בטבלת Delta) הוא המפתח לשחזור הביצועים.
למודל יש קשר רב-לרב (many-to-many) (לדוגמה, Sales ו-Promotions באמצעות טבלת גישור). מדדים מחזירים סכומים שגויים בעת סינון לפי הצד ה"רב".
→ודא שכיוון הסינון הצולב בקשרים (Dimension -> Bridge -> Fact) מוגדר נכון (בדרך כלל בכיוון יחיד). השתמש בפונקציות DAX כמו `TREATAS` או `INTERSECT` לחישובי M2M מורכבים יותר במידת הצורך.
למה: כיוון סינון צולב שגוי הוא גורם נפוץ לתוצאות שגויות במודלי M2M. בעוד שסינון דו-כיווני עשוי להיראות עובד, הוא לעיתים קרובות מוביל לעמימות וספירה כפולה. מודל מוגדר היטב עם תבניות DAX מפורשות הוא חזק יותר.
מודל מורכב המשתמש ב-DirectQuery כנגד טבלת עובדות עצומה הוא איטי. רוב שאילתות המשתמשים הן ברמה מצטברת (לדוגמה, מכירות חודשיות לפי קטגוריה).
→צור טבלת צבירה מוגדרת משתמש במצב Import. טבלת הצבירה צריכה להכיל נתונים מסוכמים מראש ברמת הפירוט של שאילתות נפוצות (חודש, קטגוריה).
למה: מנוע השאילתות יפנה אוטומטית שאילתות לטבלת הצבירה הקטנה יותר, הנמצאת בזיכרון, כאשר הדבר אפשרי, ויספק שיפורי ביצועים עצומים. הוא יפגע במקור ה-DirectQuery רק עבור שאילתות הדורשות רמת פירוט נמוכה יותר.
חישוב סכומים מצטברים מורכבים או ממוצעים נעים ב-DAX המבצעים בצורה גרועה עם גישות מסורתיות מבוססות סינון.
→השתמש בפונקציות חלון של DAX כמו `WINDOW` או `OFFSET`.
למה: פונקציות אלו מותאמות במיוחד לחישובים מיקומיים על קבוצת שורות ממוינת. לעיתים קרובות הן בעלות ביצועים טובים יותר ופשוטות יותר תחבירית מתבניות ישנות יותר המסתמכות על סינון כבד ומעברי הקשר.
חישוב סכומי Year-to-Date (YTD) עבור חברה עם שנת כספים המתחילה ב-1 ביולי.
→השתמש בפונקציות `TOTALYTD` או `DATESYTD` עם הפרמטר האופציונלי `YearEndDate`. לדוגמה: `TOTALYTD([Sales], 'Date'[Date], "6/30")`.
למה: ציון פרמטר תאריך סוף השנה הוא הדרך הנכונה והפשוטה ביותר לגרום לפונקציות DAX time intelligence להיות מודעות ללוח השנה הפיסקלי המותאם אישית.