שאלת יעילות - SQLSRV 2000

שאלת יעילות - SQLSRV 2000

יש לי לולאה די כבדה, בה אני עושה הרבה INSERTים. לפני כל אחד מהם, אני צריכה לוודא שהמפתח לא קיים. אז מה יותר יעיל, פשוט להריץ פקודת מחיקה גם ככסביר מאוד שהיא מיותרת:
DELETE FROM tbl WHERE....​
או לבדוק אם יש צורך במחיקה, ורק אז להריץ אותה:
IF EXISTS (SELECT ...) DELETE FROM tbl WHERE....​
בעצם, השאלה היא - מה נורא יותר, שאילתת EXISTS או פקודת מחיקה?
 

tberger

New member
לי נראה ש DELETE יותר מהיר

כשאת עושה בדיקה קודם כל צריך להריץ את ה SELECT וזה לוקח זמן. DELETE בעצם לא מבטל אלא רק מסמן כמבוטל וכ"כ לא הפעולה לא נרשמת מייד בטבלה אלא קודם ב LOG ורק לאחר מכן לטבלה. אבל שני דברים: 1. תלוי מאד מה קורא יותר כן למחוק או לא אם לא מוחקים אולי הבדיקה תעבוד יותר מהר. יש לבדוק בפועל. 2. למה לפני INSERT את מוחקת לא יותר פשוט לעשות UPDATE אם המפתח כבר קיים ולא למחוק את הרשומה ואחרי כן להכניס אחרת במקומה.
 
אז זהו...

השאלה היא מה כבד יותר, DELETE או SELECT, כי הסבירות היא שאני לא ממש זקוקה למחיקה, אבל חייבת לוודא את זה. לגבי UPDATE - שוב, סביר מאוד שהרשומה לא נמצאת שם, ואני צריכה להריץ פקודת INSERT, כך שגם במקרה כזה, אני אהיה חייבת לבדוק אם הרשומה קיימת.
 

duducohn

New member
הערה כללית לגבי יעילות

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

גם להשקיע בזכרון, וגם להשקיע במתכנתים שיודעים לעבוד יעיל
 

sugardady

New member
delete הוא ברירת המחדל ברוב הסקריפט

שבהם יש להמנע מהכנסת נתון כפול
 

duducohn

New member
למה כונתך יעילות

האם הכוונה לפרודוקטיביות של המתכנתים? או שמה שיכתבו קוד יעיל?
 
כתיבת קוד יעיל

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

duducohn

New member
אז בעצם

אז בעצם את אינך מתכוונת לקוד יעיל אלא לקוד נכון. עם האבחנה הזו אני מסכים וזאת מבלי להכנס לפירוט ההגדרה מהו תכנות נכון? במערכות מידע - עיבוד נתונים, ראיתי מתכנתים שמשקיעים זמן רב בנסיון לכתוב קוד יעיל, כלומר קוד שירוץ יותר מהר. אני טוען שזו טעות משום שכדי להשיג ביצועים יותר טובים של התוכנית ההשקעה בהרחבת הזכרון, במיוחד במערכות המבוססות על בסיסי נתונים יחסיים היא המשתלמת ביותר. רק כדי לסבר את האוזן אתן דוגמא: נניח שלשרת יש 1GB של זכרון פנימי וה- DBMS שלו הוא SQL-2000. אם נוסיף לשרת זה זכרון של 1GB שעלותו היא בערך עלות יום עבודה של מתכנת. הביצועים של התוכניות שפועלות על שרת זה יכולות להשתפר במאות עד אלפי אחוזים! אותו מתכנת שינסה לשפר את התוכנית שלו יצטרך לעבוד ימים ואפילו שבועות בכדי להשיג שיפור של אולי אחוזים בודדים.
 

eli_leiba

New member
תהפכי של insert כזה ל

insert .... select ... where not exists (......) ואז יוכנס רק מה שאת רוצה ללא מחיקות ובדיקות מיותרות!
 

bugg

New member
לדעתי

במבט ראשון, מה שנורא יותר זה פקודת מחיקה - כי מה קורה בעצם בפקודת מחיקה? קודם כל חיפוש הרשומה (לפי ה-WHERE), ואז מחיקתה. שתי פעולות. ופעולת חיפוש היא רק פעולה אחת. אבל אם את שואלת מה נורא יותר - מחיקה או חיפוש ומחיקה, אז ברור שחיפוש ומחיקה. כי אם את משתמשת ב-SELECT את מבצעת בעצם שני חיפושים - האחד בפקודת ה-SELECT והשני בפקודת ה-DELETE. לסיכום, אם הרשומה לא קיימת, אז בשני המקרים (חיפוש ומחיקה, או מחיקה ישר) לא הרווחנו כלום. אבל אם הרשומה כן קיימת, אז נרוויח פעולת חיפוש אחת אם ננסה למחוק ישר.
 
למעלה