SELECT בלי נעילות

כלליים

New member
SELECT בלי נעילות

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

כתבתי פרוצדורה, עם SELECT פשוט:
SELECT * FROM Table1
WHERE pk IN (SELECT COlumn1 FROM Table2)


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

אז למדתי בדרך הקשה, כמה דברים:
א. כל SELECT נועל את הטבלה, ומונע הכנסת רשומות ועדכון.
ב. אסור להריץ שאילתה וללכת.

שאלתי:
האם ניתן למנוע מקרים דומים? האם אני יכול להגדיר שהSELECT ירוץ בלי לנעול את הטבלה?

תודה רבה מכל הלב
 

tenen

New member
אתה יכול להגדיר את הSELECT לא לבצע נעילה

אתה צריך אחרי שם כל אחת מהטבלאות להוסיף את המילה
(nolock)

SELECT * FROM Table1 (nolock)
WHERE pk IN (SELECT COlumn1 FROM Table2 (nolock))

יש מקרי קצה שעדיף שלא לעשות את זה, ספק שאתה במקרה כזה
 

pitoach

New member
אלו ממש לא מקרי קצה, וממש לא מומלץ כברירת

מחדל לבצע שליפה של נתונים בצורה כזו!
יש סיבה שזו לא ברירת המחדל

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

הקישורים הבאים יכולים לעזור (לא עברתי עליהם לעומק וניתן למצוא עוד מדריכים טובים בגוגל כמובן... זה מתוך העמוד הראשון של התוצאות שחיפשתי כרגע)
http://www.informit.com/articles/article.aspx?p=27020
http://technet.microsoft.com/en-us/library/ms189857(v=sql.105).aspx
http://technet.microsoft.com/en-us/library/ms187373(v=sql.105).aspx
 

tenen

New member
תקרא שוב את השאלה

"האם אני יכול להגדיר שהSELECT ירוץ בלי לנעול את הטבלה?"

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

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

אבל לי נראה שהוא באמצע יום עבודה אחרי שפעם אחת תקע לעצמו את הDB, והוא חייב להריץ את השאילתא שלו עכשיו ובלי להפיל את הDB וכנראה שNOLOCK יפתור לו כרגע את הבעיה.
 

משקיען10

New member
אני גם מוסיף with nolock תמיד ב- SELECT

אני מעדיף שהשאילתה לא תהיה נכונה מאשר שאיזה מסמך שמישהו יוסיף למערכת לא ייקלט או שהוא ייחכה דקה עד שמערכת תשתחרר.
 

כלליים

New member
תודה רבה לכל העונים

אכן nolock הוא פתרון טוב.

עיינתי במאמרים שpitoch הזכיר, וגם במאמר הנחמד הזה, שעל קצה המזלג מבהיר את הענין בצורה קלה ופשוטה.
http://www.codeproject.com/Tips/590560/wi

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

מכל הלב!
 
למעלה