none
האם אפשר לקבל דוגמא לפונקציית CLR שמבצעת חיפוש בשדה XML RRS feed

  • שאלה

  • שלום לכולם,
    אשמח לעזרה קטנה,
    אני מעוניינת ליצור פונקצית CLR שמקבלת שדה מסוג XML, וטבלה נוספת שמכילה ערכים לצורך חיפוש בתוך אותו שדה XML.במידה וכל הערכים נמצאו הפונקציה תחזיר 1 אחרת 0.

    דוגמא לתוכן ה XML:

    <CustomFields>  
         <CustomField ID="1"  Value="0012345" />  
         <CustomField ID="2"  Value="black" />  
         <CustomField ID="3"  Value="japan" />
    </CustomFields>

    דוגמא לתוכן הטבלה שתשלח לפונקציה לצורך ביצוע החיפוש-

    ID Value
    -- -----

    2 black 3 japan

    תודה רבה

    אורית.

    יום ראשון 25 ינואר 2015 14:19

תשובות

  • תאנדקסי את ה XML

    https://www.simple-talk.com/sql/database-administration/getting-started-with-xml-indexes/

    • סומן כתשובה על-ידי yanko orit יום שלישי 27 ינואר 2015 20:59
    יום שלישי 27 ינואר 2015 10:09
  • [+1] מדריך מעולה לאינדוקס של XML, פלג :-)

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

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


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]



    • נערך על-ידי pituachMVP, Editor יום שלישי 27 ינואר 2015 14:34
    • סומן כתשובה על-ידי yanko orit יום שלישי 27 ינואר 2015 21:00
    יום שלישי 27 ינואר 2015 14:28
    מנחה דיון

כל התגובות

  • איזה שפות את יודעת C#?VB NET?

    ולפי מה את רוצה לחפש ה ID

    או ה VALUE?

    יום ראשון 25 ינואר 2015 14:53
  • C#

    וצריך לחפש לפי ID

    ולוודא ש ה Value

    זהה

    יום ראשון 25 ינואר 2015 14:58
  • public static bool  SearchValInXml(string xml, string val2Search)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.LoadXml(xml);
            XmlNode node = xmlDoc.SelectSingleNode(String.Format("//CustomField/@ID[.={0}]", val2Search));
            if (node == null) return false;
            return true;
    
    
        }

    • הוצע כתשובה על-ידי pelegk1 יום ראשון 25 ינואר 2015 15:35
    • הצעה כתשובה בוטלה על-ידי pituachMVP, Editor יום ראשון 25 ינואר 2015 16:20
    יום ראשון 25 ינואר 2015 15:16
  • ערב טוב אורית :-)

    תחילה, שוב תודה על הפידבק שלך בפייסבוק לגבי ההרצאה בכנס SQLSaturday #360
    אני מאוד שמח לראות שהצלחתי להשפיע על אנשים לחשוב מחוץ לקופסא על האפשרות של שימוש ב CKR :-)
    זו בדיוק היתה המטרה של ההרצאה

    נעבור לשאלה שלך:

    אם את זוכרת אחת ההדגמות בכנס היתה לגבי שימוש בפונקציה PARSENAME המובנית בשפת T-SQL. בהדגמה הזו הראתי דוגמה למתי לא צירך לפתח לבד פונקציה והצגתי מקרה ייחודי בו מיקרוסופט כבר הכינו לנו ]ונקציה שמתאימה במקרה למצחב הספציפי שאנחנו מחפשים.

    עוד נקודה להקדמה: המימוש של XML בשרתי SQL הוא מימוש פשוט של CLR מאחורי הקלעים :-)
    בדיוק כמו שהראתי בהדגמה האחרונה ,כיצד אני מממש אלמנטים בזכרון (לא מתחרה כמובן באפשרות של SQL 2014, אבל בהחלט משם קיבלתי את הרעיון), הרי שהזכרתי שהרבה מאוד מהתוספות שאנחנו רואים מגרסת 2005 הם לא יותר מהטמעה של קוד CLR מאחורי הקלעים, בצורה מובנית על ידי מיקרוסופט (למשל פונקציית FORMAT בגרסת 2012 ועוד הרבה הרבה). כאמור XML והאפשראויות לפרסור XML כבר מובנות בשרתי SQL מגרסת 200 ולא צריך להמציא את הגלגל :-) 

    לכן למעשה, השאלה שלך היא דוגמה קלאסית למתי לא צריך להשתמש בקוד CLR שלנו, פשוט כי הוא כבר קיים מובנה בשרת :-)

    לכן מה שנשאר לנו במקרה הנוכחי זה פשוט ללמוד לעבוד עם XML בשרתי SQL :-)

    * דרך אגב אם היית שואלת על JSON אז התשובה היתה שאת צריכה לממש את זה לבד (זו הדוגמה האחרונה שיש במצגת שלא הספקתי להראות בהרצאה).

    ** השפה איתה אנחנו עובדים היא שפת XQuery

    *** נקודה חשוב מאוד, במקרים יותר מורכבים בהם האפשרויות של שימוש בשפה המובנית בשרת לא מספקיים או כאשר אנחנו רוצים לבצע ניתוח של טקסט שאינו בפורמט XML קשיח למשל או כאשר אנחנו רוצים לנתח את הטקסט כאשר הוא אינו מוגדר כסוג XML אז לפעמים כן נוח ונכון יותר לעבוד עם קוד CLR שלנו שמוטמע בשרת כפי שדיברנו בהרצאה.

    בואי נתחיל מקישור כללי, לראות שהדברים כבר מובנים בשרת SQL מגרסת 2005:
    https://technet.microsoft.com/en-us/library/ms190936(v=sql.90).aspx

    עתה נוכל לעבור למדריך קצר על עבודה עם השפה בה אנחנו עובדים ב XML. זו אותה שפה שפלג עשה בה שימוש בקוד C# שלו.
    https://msdn.microsoft.com/en-us/library/ms189075.aspx

    תבדקי אם את מצליח להגיע לתשובה או שצריך עזרה. אני ממלית מאוד ללמוד עם שפת XQuery אם אתם רוצים לנתח XML-ים :-)


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]



    יום ראשון 25 ינואר 2015 16:49
    מנחה דיון
  • תודה רבה פלג
    יום ראשון 25 ינואר 2015 18:33
  • תודה רונן,

    השאלה ששאלתי היא למעשה חלק משאילתת חיפוש גדולה במערכת שלנו. השאילתה מתבצעת בעיקרה על טבלה מרכזית אחת גדולה, מדובר ב 50 מיליון רשומות בכל זמן נתון. נכון לעכשיו החיפוש באותו שדה XML
    נעשה כפי שתראת, על ידי שימוש ב XQUERY
    אמנם החיפוש אורך זמן רב. לכן חשבתי להוציא את החיפוש ב XML
    למסגרת שונה ולנסות לזרז את קבלת התשובה.
    האם גם עכשיו אתה חושב שנסיון זה יהיה מיותר?

    תודה

    יום ראשון 25 ינואר 2015 18:39
  • בוקר טוב אורית,

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

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

    * אין סיבה לבצע פעולה על ידי הטמעת קוד שלנו כאשר הקוד כבר מובנה בשרת. בדרך כלל קוד מוטמע על ידי מיקוסופט יעבוד מהר יותר (האפשרויות של מיקרוסופט להטמיע אותו יותר מגוונות וכניראה הזמן שהושקע על הפיתוח והבדיקות הרבה יותר רחב ממה אנחנו נוכל להשקיע).

    * שפת XQUERY כבר מובנית בשרת ה SQL וניתן לעבוד איתה ישירות. לכן אם כל מה שאנחנו צריכים זה שאילתה של XQUERY הרי שאין סיבה להטמיע קוד CLR שלנו.

    * ניתוח מלא של טקסט ארוך יכול להיות פעולה כבדה בלי קשר לשפה איתה עובדים. אחרי הכל, בכל מקרה על מנת לנתח טקסט עלינו "לקרוא" אותו לפחות פעם אחת (ניתוח כולל לפחות פעולה אחת של לולאה על התווים של הטקסט).

    * להוציא פעולה מחוץ למסד הנתונים יכולה להיות ייתרון במקרים מסויימים, אבל גם חסרון ענק. זה דיון עמוק בפני עצמו ונואש מעניין להרצאה / דיון מעמיק. צריך לחשוב לעומק על ההשלכות ולהבין את הדרך ששרתי SQL עובדים מאחורי הקלעים כדי להגיע למסקנות נכונות, צריך להבין את המשמעות של העברת מידע החוצה וקבלת מידע פנימה, המשמעול של פתיחת CONNECTION אם מבצעים וכו'

    * כאשר את מדברת על להוציא "מחוץ לשרת" במקרה של שימוש ב CLR מוטמע בשרת יש לכך השלכות שונות, מהוצאת הפעולה לחלוטין מחוץ לשרת. עבודה עם קוד מוטמע שלנו ב CLR לא כל כך שונה משימוש בקוד מוטמע של מיקרוסופט מבחינה זו וזו לא בדיוק הוצאה מוחלטת מחוץ לשרת, אם כי זו הוצאה מחוץ למנוע הפירסור של השרת (כאמור שימוש ב XQUERY מובנה או להטמיע XQUERY לבד לא כל כך שונה מבחינה הזו).

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

    >> על פני השטח נראה שמה שאתם צריכים זה לתכנן ארכיטקטורה שונה לחלוטין על מנת לשפר את הפעילות שלכם.

    אני מקווה שיצא לך פעם לשמוע הרצאה שלי בנושא הטמעת JSON ומימוש בפועל של עבודה עם JSON, מכיוון שמדובר באותו רעיון של ארכיטקטורה שיכול כניראה לעזור לכם:-)

    ניתוח הטקסט בצורה מהירה יותר או פחות, עדיין מחייב קריאה של הטקסט ובמקרה שלכם קריאה של כל הרשומות, וזה חסר כל הגיון לקרוא 50 מליון שורות בטבלה על מנת למצוא 2 שמתאימות. בשביל דבים כאלו המציאו אינדקסים ובעבודה עם מסמכים (JSON או XML למשל) ישנם אפשרויות שונות לאינדוקס, שתלויות באפיון המערכת שלכם.


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]

    יום שני 26 ינואר 2015 07:26
    מנחה דיון
  • מסכים עם רונן לגמרי, כשיש לך כלים של הסביבה עצמה (במקרה הזה עבודה עם XML) עדיף להשתמש בהם ולא להמציא את הגלגל מחדש,

    אלא אם כן את רוצה לעשות עוד פעולות שהן מורכבות יותר למימוש ב TSQL ואז אין ספק שכדאי לבחון את נושא ה CLR.

    • סומן כתשובה על-ידי yanko orit יום שלישי 27 ינואר 2015 10:02
    • סימון כתשובה בוטל על-ידי yanko orit יום שלישי 27 ינואר 2015 10:03
    יום שני 26 ינואר 2015 08:45
  • נכון, קשה לתאר באמת את כל המידע או איך בדיוק השאילתה עובדת ומה מבנה הטבלאות והקשרים ביניהם.
    נכון לעכשיו עמודת ה XML
    (היא עמודה שקיימת בטבלה הראשית עליה מתבצע החיפוש (כאשר ישנם עוד פרמטרים נוספים לחיפוש.
    זאת אומרת שגם אם חלק מהתנאים יסננו חלק גדול מהרשומות ויישארו מיליון רשומות שנותרו לסריקה לצורך ביצוע
    החיפוש בעמודת ה XML
    עדיין, פעולת הסריקה אורכת זמן רב. 

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

    יום שלישי 27 ינואר 2015 10:00
  • תאנדקסי את ה XML

    https://www.simple-talk.com/sql/database-administration/getting-started-with-xml-indexes/

    • סומן כתשובה על-ידי yanko orit יום שלישי 27 ינואר 2015 20:59
    יום שלישי 27 ינואר 2015 10:09
  • אנא חזרי לעדכן וכמובן לסמן כתשובה את מי שעזר.

    תודה.


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

    יום שלישי 27 ינואר 2015 12:19
  • [+1] מדריך מעולה לאינדוקס של XML, פלג :-)

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

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


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]



    • נערך על-ידי pituachMVP, Editor יום שלישי 27 ינואר 2015 14:34
    • סומן כתשובה על-ידי yanko orit יום שלישי 27 ינואר 2015 21:00
    יום שלישי 27 ינואר 2015 14:28
    מנחה דיון
  • תודה לכולם. אנסה את נושא האינדקסים. 
    יום שלישי 27 ינואר 2015 21:01