עדכון הטבלה sys.dm_exec_sessions

עדכון הטבלה sys.dm_exec_sessions

אני צריך לדעת את עלות CPU של פעולה מסויימת. ואני רוצה להסתכל בטבלא sys.dm_exec_sessions לפני הפעולה ואחריה ולראות את ההפרש.
הבעיה היא שהיא מראה את ההבדל רק אחרי GO, כלומר בשני שאילתות רצופות הוא מראה את אותו התוצאה.
אני רוצה לשמור בטבלת לוג את עלות ה-CPU עבור כל פעולה תוך SP. אבל זה ישמור את אותם הנתונים כל פעם.
איך אני יכול לגרום לטבלה הזו להתעדכן בזמן מסוים.
תודה לעונים ומקווה שהייתי מובן.
 

pitoach

New member
אם כל מה שאתה צריך זה עלות CPU ניתן לצאת

מהקופסא קצת ופשוט לבדוק במערכת ההפעלה מה העלות של ה THREAD שמופעל

* כמובן יש צורך לאתר את ה ID של ה THREAD ואם יש פעולה מקבילה אז יש לאתר את כל ה THREAD-ים ולבצע פעולה מורכבת מאוד של מתמטיקה למתקדמים של חיבור המספרים

בצורה זו אין תלות בשרת עצמו

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

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

** דרך אגב בתוכנית ההרצה מחושבת הערכה של שימוש ב CPU וזה יכול להספיק אולי

ולסיום למה בכלל בחרצת ב DMV הזה? למה פשוט לא לעבוד עם dm_exec_query_stats ולמצוא יישרות את התשובה ?
 
תשובות לתשובה

דבר ראשון, תודה על התשובה.

א. את הפתרון הראשון אני צריך לבדוק אותו, זה רעיון חמוד מאוד.
אני גם חושב שהוא יצטרך לעבוד דרך CLR, לא?
והאם זה יעזור גם על memory_usage ו-reads ו-writes לכאורה כן.
ב. מה אתה מתכוין 'בתוכנית ההרצה מחושבת הערכה של שימוש בCPU'. איך אני מגיע לזה.
ג. dm_exec_query_stats נראה רעיון לא רע. אני יבדוק את זה.

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

pitoach

New member
הסבר:

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

כן זה יעזור גם לשליפה של הנתונים האחרים

* לפי השאלה אני מקבל את ההרגשה שזו אינה הדרך המתאימה לך ועדיף שנשאר בתחום ה SQL

ב. כאשר השרת רואה שאילתה שהוא צריך להריץ הוא בשלב הראשון מכין תוכנית הרצה (אלא אם הוא מוצא שכבר יש לו אחת כזו לשאילתה הנוכחית או ל SP הנוכחי שמריצים). רק בשלב הבא השרת מריץ את התוכנית שתכנן.

בכל תכנון של שאילתה כדאי מאוד לעבוד מול תכונית ההרצה ולבדוק מה השרת מתכוון להריץ בפועל.

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

ניתן להישתמש בנתונים אלו של ההערכה של השרת כדי להעריך את הנתונים שביקשת ועוד

אם מדובר בעבודה של DBA אז חובה ללמוד לעבוד עם תוכנית ההרצה ואני מאוד ממליץ לעבור למדריכים בנושא ולתרגל

בין השאר ניתן להעזר ב DMV-ים שונים כדי לקבל את הנתונים. למשל ה DMV הבא נותן נתונים על תוכנית ההרצה שנמצאת ב CASH:
sys.dm_exec_cached_plans
 
הרעיון הוא שאני רוצה

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

באמצע סטורד לבדוק (ו-או לשמור) צריך להשתמש ב-view sys.dm_exec_requests ולעומת זאת אחרי הרצה של סטורד כלומר כשנגמר ההרצה של ה-requests אזי ה-view המתאים הוא SYS.DM_EXEC_SESSIONS ולפעמים יתאים הסכום של שניהם, כלומר אם רוצים לשמור מזמן החיבור וגם את השאילתא שרצה שאתה מריץ עכשיו. מקווה שהייתי ברור ושאני צודק.
 
למעלה