none
יצירת נתונים מבוזרים - SKEWED DATA RRS feed

  • דיון כללי

  • שלום חברים יקרים!

    לצורך מספר בדיקות שאני מעוניין לבצע, יש לי צורך לסמלץ אוסף נתונים שמבוזר בצורה לא אחידה בסטטיסטיקות (skewed data לפי הז'רגון הלועזי).

    הצורך הסופי הוא להגיע למצב בו יש לי אי-אחידות בסטטיסטיקות ברמה כזו, שכשאבצע שליפה מהטבלה עפ"י האינדקס, ה-estimated number of rows יהיה באופן משמעותי שונה מה-actual number of rows, וגם ש-UPDATE STATISTICS WITH FULLSCAN לא יעזור.

    זו משימה מאתגרת הרבה יותר ממה שנדמה בהתחלה. ממש קשה לעבוד על מנגנון הסטטיסטיקות של SQL!

    לא מצאתי חומר טוב על זה באינטרנט, אבל הצלחתי פחות או יותר ליצור פיתרון חלקי בעזרת יצירת נתונים מבוזרים נורמלית (תודה ל- http://www.sqlservercentral.com/articles/SQL+Uniform+Random+Numbers/91103/)

    אבל זה לא היה מספיק skewed בשבילי אז קיוויתי אולי מישהו פה בפורום יצליח יותר ממני.

    אז... מישהו?


    Eitan Blumin; SQL Server Consultant - Madeira SQL Server Services; http://www.madeira.co.il/author/eitan/

    • שינה את הסוג Eran Sharvit יום רביעי 22 אוגוסט 2012 14:56
    יום ראשון 05 אוגוסט 2012 09:02

כל התגובות

  • היי איתן,

    מה בדיוק אתה מנסה לעשות?

    מה השאילתא שאתה מנסה "לעבוד" עליה ולאיזה צורך?


    Ami Levin, SQL Server MVP. CTO, DBSophic LTD. - http://www.dbsophic.com/ --Performance is the most significant driver in maintaining data and service availability.--

    יום חמישי 09 אוגוסט 2012 12:06
  • אני רוצה להגיע למצב כזה שיש לי שאילתה מסויימת שמקבלת פרמטר. למשל:

    SELECT *
    FROM
       MyTable
    WHERE Something = @Param

    וכשאני שם ערך מסויים ב-@Param אז זה יעבוד מהר כי SQL מנבא נכון את מספר השורות שיחזרו.

    וכשאני שם ערך אחר בפרמטר אז זה יעבוד לאט כי SQL לא מנבא נכון את מספר השורות שיחזרו.

    אתה יודע מה, עזוב פרמטרים. אני רוצה שזה יקרה גם כשהשאילתה ליטרלית. למשל:


    SELECT * FROM MyTable WHERE Something = 123

    Eitan Blumin; SQL Server Consultant - Madeira SQL Server Services; http://www.madeira.co.il/author/eitan/


    • נערך על-ידי EitanBlumin יום חמישי 09 אוגוסט 2012 12:16
    יום חמישי 09 אוגוסט 2012 12:15
  • היי איתן,

    במידה וזה עדיין רלוונטי, כמה נקודתית הבדיקה צריכה להיות?

    עבור ערך ספציפי זה יחסית קל - דואגים שיהיו המון שורות עם ערך מסוים ומעט מאוד שורות עם ערך אחר, מריצים את השאילתא עבור הערך הראשון ואז עבור הערך השני, ובגלל שה-Plan מתאימה לערך הראשון, עבור הערך השני לא תהיה התאמה בין ה-Estimated ל-Actual.

    עבור משהו יותר כללי זה קצת יותר מסובך, אבל שווה לזכור ש-SQL Server מחזיק רק 200 ערכים בסטטיסטיקה כ-Default, ומתי הסטטיסטיקות מתעדכנות.

    הנה לינק ל-dbcc show_statistics שאפשר להשתמש בו כדי לנסות "לעבוד" על האופטימייזר:

    http://msdn.microsoft.com/en-us/library/ms174384.aspx

    יום ראשון 12 אוגוסט 2012 16:41
  • הי מתן תודה על התגובה,

    כן זה עדיין רלוונטי.

    כבר ניסיתי את מה שהסברת, זה לא קל כמו שזה נדמה.
    בסופו של דבר, המצב הכי אידיאלי מבחינתי זה שיהיו לי שני ID-ים. אחד עם נתון מדוייק בסטטיסטיקות, ואחד עם ערך שגוי בסטטיסטיקות.
    אבל צריך לשים לב שהמצב צריך להיות כזה ש-UPDATE STATISTICS לא עוזר וגם לא OPTION RECOMPILE.

    אני רוצה שכשאני מריץ שאילתא מסויימת על ה-ID עם הנתון המדוייק, אז זה ירוץ סבבה.
    אבל כשאני מריץ אותה שאילתה על ה-ID השני אז זה רץ לאט.

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

    אני מבין שלצורך זה לא מספיקה סתם שליפה מהטבלה אלא צריך איזשהו JOIN עם טבלה אחרת.

    כנראה שהיה עדיף לו הייתי מציין את זה קודם אך משום מה באותו רגע לא חשבתי שזה חשוב...


    Eitan Blumin; SQL Server Consultant - Madeira SQL Server Services; http://www.madeira.co.il/author/eitan/

    יום שלישי 14 אוגוסט 2012 12:26
  • אני רוצה שכשאני מריץ שאילתא מסויימת על ה-ID עם הנתון המדוייק, אז זה ירוץ סבבה.

    אבל כשאני מריץ אותה שאילתה על ה-ID השני אז זה רץ לאט.

    היי איתן.

    אתה יכול להסביר מהו ה-Execution plan עבור שני הערכים? מהם האינדקסים שה-Optimizer מנסה להיעזר בהם בשני המקרים?

    יום שני 20 אוגוסט 2012 08:54
  • זה לא משנה כל כך כל עוד אחד יעבוד לאט והשני מהר.

    אבל לצורך העניין זה יכול להיות לדוגמא שאחד עושה NESTED LOOPS והשני עושה MERGE JOIN עם Parallelism.


    Eitan Blumin; SQL Server Consultant - Madeira SQL Server Services; http://www.madeira.co.il/author/eitan/

    יום רביעי 22 אוגוסט 2012 16:51