free memory on sql server

flenger

New member
free memory on sql server

שלום לכולם
אני מנסה לחפש פיתרון לבעיה מסויימת שיש לי
נעשה שינוי database עקב מבנה לא נכון
מיכוון שאחד השינויים היה הורדה של טבלה של מיליוני רשומות
ושינוי מבנה של טבלה אחרת
נוצר מצב שאחרי שמריצים את הסריפט הזיכרון של הSQL SERVER עולה מאוד
יכול להגיע ל 3 4 GB ויותר

השאלה אם יש דרך לגרום לSQL SERVER לשחרר את הזיכרון שלו באופן יזום
מה שמצאתי זה שניתן לקרוא לפקודות האלה אך אני לא בטוח עד כמה זה יכול לעזור
DBCC FREESYSTEMCACHE ( 'ALL' )
DBCC FREESESSIONCACHE
DBCC FREEPROCCACHE

אם יש דרך אחרת .. אשמח לשמוע

תודה לעוזרים
 

flenger

New member
מצאתי משהו נחמד .. אך אני לא בטוח שזה הפיתרון

http://www.teratrax.com/sp_configure-limit-sql-server-memory-usage/

exec SP_Configure 'min server memory', 1
RECONFIGURE
exec SP_Configure 'max server memory', 100
RECONFIGURE

שזה משהו שאמור לרוץ על הMASTER ואם הDATABASE שלי רק מאוכלס בתוך הSERVER
אני יותר מבטוח שאני לא יכול סתם להריץ פקודה כזאת על שרת של לקוח שמכיל עוד DATABASES
מצד שני... אני גם ככה חנקתי את הSQL SERVER
אז כולם נדפקים
 

pitoach

New member
אלו הן הגדרות של מקסימום זכרון מוקצה לשרת SQL

זה לא משחרר זכרון אלא מגדיר כמה סה"כ לשימוש הוא יכול לקחת.

זו הדרך הנכונה בדרך כלל לניהול הזכרון בשרת (להקצות לו כמות נכונה)
 

pitoach

New member
מה שאתה מבצע זה משהו שיכול לפגוע בצורה מאוד

קיצונית בשאילתות שלך. אתה צריך לעבוד עם זה בזהירות.

מצד אחד זה נכון שזה ישחרר זכרון באופן ישיר.

אלו פקודות לשחרור CACH כמו תוכניות הרצה. מה שיקרה זה שבהרצה הבאה יהיה צורך לבנות את תוכנית ההרצה מחדש ואיבדת את החלק בשרת SQL שהוא שמירת תוכניות הרצה לפעולות הבאות.

כל הרצה בשרת SQL מחייבת שימוש בתוכנית הרצה (אותה בונה אותן באותו רגע או נעזרים בכזו קיימת אם יש מתאימה)

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

אם יש לך בעיה של זכרון שבא על חשבון מערכת ההפעלה או אפליקציה אחרת שצריכה את הזכרון אז אתה יכול פשוט לקבוע את מקסימום הזכרון שמוקצה ל SQL לערך נמוך יותר.
sp_configure 'max server memory', 12288
RECONFIGURE
GO

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

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

flenger

New member
תודה על ההסבר המפורט


היה ברור לי שכל התערבות בניהול הזיכרון . ניקוי זיכרון או כל התערבות כזו או אחרת "מסוכנת" ולא מומלצת
כDB מותקן בINSTANCE נפרד והוא הDB היחיד אין כל חשש לעשות מה שאתה רוצה , בגדול :)

הבעיה מתחילה כשהDB הוא אחד מתוך כמה ואז הדבר האחרון שאני יכול לעשות זה לשחרר זיכרון CACH או לבצע RECONFIGURE
אני כבר ראיתי שהבעיה בניפוח היא אותו REFACTORING שעשיתי כדי להיפתר מטבלה ענקית ומיותרת

אז אם לבחור במשהו.. אתה חושב שניקוי CACH הוא הכי פחות "אלים" ?

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

pitoach

New member
כמה נקודות ותגובה לשאלה

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


2. האם ניקוי CACH הוא הכי פחות "אלים" ?
תשובה: ממש לא
אני יכול לחשוב על אפשרויות פחות קיצוניות בהרבה כמובן. העניין הוא שמה שקיצוני לאפיון אחד יכול להיות זניח באפיון אחר. ניקוי CAHC יכול להיות יעיל מאוד באפיון אחד ושטות גמורה במצב אחר. ככלל אצבע ניקוי כזה בדרך כלל אינו הדרך הטובה. דרך אגב מה שאתה ביצעת זה ניקוי כללי של ה CAHC ומי שמבין עניין יכול לבצע עבודה כירורגית ולנקות רק את מה שצריך לנקות.

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

3. לגבי הפתרון שאתה מדבר עליו. בדרך כלל הפתרון הראשון צרי להיות ברמת השאילתה עצמה. אבל להכביד ולבנות שאילתה כבדה רק כדי לא לנצל את הזכרון כמובן שוב פסול ככלל אצבע אבל כל מקרה לגופו

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

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