שלח תשובה

זירת השאלות

595
צפיות
104
תשובות

מספר שאלות מנוגע ליעילות!

,‏ 15 ביולי, 2004

*** מה יותר יעיל? ***

1. להכניס רשומה חדשה למסד בעזרת ADO או conn.execute SQL?

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

3. אנא תנו טיפים ליעילות בעבודה… זה יעזור לכולנו.

תודה מראש ואתם מוזמנים לשרשר שאלות יעילות נוספות.


טל.

תגיות:

104 תשובות

  1. Just-Tal הגיב:

    בנוגע ל 1…
    אני מתכוון בכלל בעבודה עם מסד.. למחוק, לעדכן, להוסיף… מה עדיף ADO או רק SQL + execute?

  2. ניר טייב הגיב:

    1. SQL לרוב יותר מהר מ-ADO
    רק במקרה שאנו מבצעים לולאה ובתוכה עושים את הכנסה למסד הנתונים ADO יהיה יותר מהר בגלל שהגישה נעשית פעם אחת אחרי הלולאה.

    2.כן!תמיד רצוי להיפטר מהרקורדסט כמה שיותר מהר – כדי להעביר למערת משתמשים ב-getRows.

    3. ב-TagLines יש קישור לשרשור על עבודה יעילה
    טיפ:
    לשלוף אך ורק את השדות שבאמת אנחנו צריכים במקום להשתמש ב-*

  3. תשובות
    1. נכון, ado יותר קל משאילתות sql, אבל sql יותר מהיר ויותר יעיל.
    איך אמרו כאן פעם, "לא הקלות אלא האיכות"?

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

    3. דיון בנוגע ליעילות.

  4. אופס
    לא ראיתי שבשתיים הוא כתב בדיוק מה שכתבתי, בעעעע..

  5. Just-Tal הגיב:

    אוקיי, תודה! אבל…
    מישהו יכול לתת דוגמה להעברת רקורדסט ללולאה בעזרת getrows?
    ואם אפשר אז ב VBS…
    אם כבר מדברים על יעילות האם JS באמת כלכך יותר יעילה מ VBS?

    כתבתי מערכת פורומים עם ASP+VBS ואני חושב להעביר אותה ל JS…

    תודה לעונים!

  6. Deviation הגיב:

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

    היופי ב JS הוא נוחות הקוד (וגם היעילות) – כמי שמגיע מרקע של תכנות cpp.

    GetRows ב VBS:


    [פתיחת מסד הנתונים]
    myArray = rs.GetRows
    rs.Close
    Set rs = nothing
    [סגירת מסד הנתונים]
    NumOfCols = ubound(myArray,1)
    NumOfRecords = ubound(myArray,2)
    For i = 0 To NumOfRecords
    FName = myArray(1,i)
    LName = myArray(2,i)
    Email = myArray(3,i)
    …. עיבוד ועיצוב הנתונים בטבלאות וכו ….
    Next

  7. Deviation הגיב:

    ממש לא מדוייק ב – 2
    אם עובדים עם מספר גדול של רשומות נניח 5000 רשומות או אפילו 10000 רשומות אז בהחלט עדיף GetRows בהרבה.

    אבל אם עובדים על משהו כמו עשר רשומות, אפילו עשרים רשומות, השיטה ה"ישנה" תהיה מהירה יותר מ GetRows.

  8. Just-Tal הגיב:

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

  9. היית פשוט מפנה אותו לעמוד הזה
    http://asp.org.il/articles/getrows.asp
    שבעצם ממנו לקחת את הקוד

  10. Deviation הגיב:

    תראה, מבחינה הגיונית
    מבחינה הגיונית צריך רק Connection אחד למסד בעמוד (שגם אותו מומלץ לשים ב SSI – מטעמים מובנים, אם צריך נפרט), בכל סיום פעולה לסגור אותו, נניח:

    oConn.close

    (תחביר VBS)

    ובסוף העמוד לנקות את האובייקט מהזכרון.

    set oConn = nothing

    בהחלט לא מומלץ לעשות משהו כזה oConn1, oConn2 וכך הלאה.
    מספיק חיבור אחד.

  11. Just-Tal הגיב:

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

  12. Deviation הגיב:

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

    מנקים את האובייקט בסוף העמוד בלבד (או לחילופין בסיום הפעולה האחרונה עם המסד), נניח:


    some code..
    some code..
    some code..

    connecting to the Database (Conn.open)
    some actions with the DB..
    some actions with the DB..
    Conn.close

    some code..
    some code..
    some code..
    some code..

    Conn.open
    some actions with the DB..
    [Here we have finished with the DB]
    Conn.close
    Set Conn = nothing

    EOF

  13. ניר טייב הגיב:

    כאן במדור ASP באתר
    יש מאמר על getRows ב-VBS
    ומאמר שלי על getRows ב-JS

    בהצלחה

  14. אוריקס הגיב:

    זה לא ממש נכון (בדקתי את זה)
    RS רגיל יעיל במקרים של 1-2 רשומות. אח"כ עדיף GetString ולכמות גדולה יותר GetRows.

  15. Just-Tal הגיב:

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

    האם לעבור למסד אחר? mysql? MSsql?

  16. Deviation הגיב:

    הכל תלוי בקוד נכון
    תלוי בקוד שנכתב – האם הוא נכון ויעיל כמו שצריך.
    בעיקרון הנפח המירבי של Access הוא לכל היותר 2 ג'יגה (נפח מסד) והוא יכול להחזיק 100 איש מחוברים בו זמנית.

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

    פשוט MySQL מסד צעצוע

  17. Deviation הגיב:

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

  18. Just-Tal הגיב:

    אז מה אני צריך לבדוק כמה רשומות…
    יש לי ברקורדסט (ע"י קוד) ואז לבחור באיזו שיטה?.. זה יהיה יעיל?

  19. Deviation הגיב:

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

  20. Just-Tal הגיב:

    אם הם היו משתמשים באקסס…
    הוא היה מחזיק מעמד?

  21. אני הייתי עובד אחרת
    כי אני חושב שזה יותר יעיל:

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

  22. ניר טייב הגיב:

    MSSQL
    אבל עד לפני חצי/שלושת רבעי שנה האתר עמד על ACCESS
    (אפשר למצוא את הזמן המדויק ע"י הגעה לעמוד החארון של הפורום ולחשב את הזמנים – הפורום גם שודרג)

  23. Just-Tal הגיב:

    ואם אני בונה מערכת גדולה…
    יהיה לי קשה להעביר אותו לMSSQL או לכל מסד רציני אחר?

  24. Just-Tal הגיב:

    הוא התכוון ש…
    הוא סוגר ופותח את החיבור למסד כל פעם: conn.open

    ומוחק אותו רק בסוף… set conn = nothing

  25. Deviation הגיב:

    לא ירדתי לסוף דעתך
    התכוונת למשהו כזה:

    rs.open oConn, SQLstr
    ?

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

  26. ניר טייב הגיב:

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

  27. Deviation הגיב:

    תלוי בעצמך
    אתה צריך ללמוד Tsql ובהחלט יש שוני בתחביר ובעבודה מולם.

  28. Just-Tal הגיב:

    אוףףף אתם מבלבלים!
    אז לסגור את החיבור רק בסוף או לאחר כל רקורדסט?…

    למחוק חיבור בטוח בסוף אבל מה עם פתיחה וסגירה???

  29. Just-Tal הגיב:

    ? אז מה אתם מיעצים לי לעשות<?>
    לבנות עם ACCESS שאיתו אני יודע לעבוד…

    או ישר לעבור ל MSSQL? והאם הוא חינמי?…

  30. Deviation הגיב:

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

  31. Just-Tal הגיב:

    לאא… אני יודע… אבל מה עם…
    החיבור למסד עצמו?!


    set Conn=Server.CreateObject("ADODB.connection")
    ConnString="DBQ=" & Server.Mappath("comments.mdb") & ";Driver={Microsoft Access Driver (*.mdb)};"

    Conn.Open ConnString

    שלוש השורות הראשונות אני כותב הראש העמוד… זה ברור…

    אבל מה עם פתיחת הקונקשין?(Conn.Open ConnString)… לפני כל רקורדסט לפתוח מחדש ולסגור בסופו או לפתוח רק בתחילת העמוד ובסופו לסגור אותו???

  32. אוריקס הגיב:

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

  33. Deviation הגיב:

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

  34. Just-Tal הגיב:

    או! לזה התכוונתי! תודה רבה גבר גבר!

  35. Deviation הגיב:

    לטובת GetRows או RS רגיל?
    כל שנייה קובעת
    (ככה לפחות המוטו של שח"ל)

  36. Deviation הגיב:

    נכון, אבל אני חושב שהמטרה הובנה

  37. Just-Tal הגיב:

    עוד שאלה קטנה…!
    עבדתי עד עכשיו עם VBS.

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

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

  38. Deviation הגיב:

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

  39. ניר טייב הגיב:

    אני מציע לך קודם
    לתרגל את JS בלקוח ואחר כך לעבור עם JS לשרת

  40. Just-Tal הגיב:

    pascal, VB, delphi, פרולוג
    כולם דומות ל VBS…. אבל לא יהיה לי קשה לעבור ל JS….

    מה אתם אומרים?

  41. Just-Tal הגיב:

    זה משנה?…
    את VBS לא תרגלתי בלקוח..
    והסתדרתי טוב מאוד בשרת… מה זה משנה?

  42. Just-Tal הגיב:

    השאלה האמיתי אם היא באמת…
    JS באמת ממש ממש יותר טובה ויעילה מ VBS?

  43. ניר טייב הגיב:

    VBS לא רצוי לעשות בלקוח
    זו היית רק הצעה. אתה יכול לעשות מה שבא לך
    לא נראה לי שזה משנה משהו

  44. Just-Tal הגיב:

    אוקיי 🙂
    אבל אם יותר נוח לי לכתוב ב VBS,
    אני בטוח שגם JS יהיה בסדר האם כדאי לעבור שפה?

  45. תראה
    אתה סוגר ומוחק את החיבור בסיום הפעולה האחרונה עם המסד.
    את החיבור אל תסגור ותפתח באמצע הפעולות עפ המסד.

  46. תשמע
    vbs היא שפה פשוטה, אתה לא היחיד שלא תירגל אותה בלקוח וישר התחיל איתה בשרת.
    js היא שפה עצומה, ותאמין לי לא קל ללמוד אותה בשרת כמו שקל ללמוד vbs בשרת.

    בקשר לשאלתך מה יותר עדיף, js או vbs, התשובה היא js, ובגדול, זאת עובדה.
    למה js בצד שרת?

  47. בקיצור
    תלמד ותבין את js בלקוח ואח"כ תעבור לשרת.

  48. Just-Tal הגיב:

    קראתי, הפנמתי, ניגש לעבודה 🙂 תודה.

  49. Deviation הגיב:

    JS יותר מהירה מ VBS
    JS יותר מהירה מ VBS – תחביר יותר נוח ויפה (סקופים |מאוהב|).

    אם יש לך זמן ללמוד לך על JS.

  50. Just-Tal הגיב:

    השוואת שיטות:
    קראתי מאמר המסביר איל להעביר+להציג רקורדסט למערך (JS) מאמר שלכם.

    יש בו 2 שיטות אחת בשרת ואחת בלקוח…
    מה יותר יעילה? הרי להעביר ללקוח לוקח גם זמן… מה אתם ממליצים?

  51. Night הגיב:

    למה צעצוע? הוא לא טוב?
    אני בניתי עליו מאוד מה הוא לא חזק יותר מאקסס?

  52. ניר טייב הגיב:

    בשרת
    לא חבל לעבור פעמיים על אותו מערך ?!

  53. mrmistory הגיב:

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

    משתמשים ב-SQL SERVER כשיש אלפי גולשים כבר באתר או בפורום.

  54. Just-Tal הגיב:

    שאלת יעילות!
    האם כדאי לכתוב פונקציה שמעבירה מערך מרקורדסט למערך או פשוט לכתוב את הקוד בדף?

    קוד הפונקיצה הוא:


    function rstoarray(rs,sql,conn)
            {
                rs.Open(sql, conn, 3, 3);
                if (!rs.EOF)
                    {
                        //מעביר רקורדסט למערך
                        var numflds = rs.Fields.Count;
                        var temparray = rs.GetRows();
        
                        //מחיקת חיבור למסד ורקורדסט
                        rs.Close;
                        delete rs;
                        rs = null;
                        conn.Close;
                        //מחזיר מערך רשומות
                        return temparray.toArray();
                    }
                else
                    {
                        return "Empty";
                        rs.Close;
                        delete rs;
                        rs = null;
                        conn.Close;
                    }
            }

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

  55. Just-Tal הגיב:

    בנוסף שאלה לגבי interdev
    כאשר אני כותב עם התוכנה + JS היא לא משלימה לי כאשר אני למשל כותב  array.
    או
    conn.
    היא משלימה רק בצד לקוח ולא בשרת מישהו יודע למה?

  56. Deviation הגיב:

    תמיד, אבל תמיד
    (טוב כמעט תמיד)

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

  57. Deviation הגיב:

    הצחקת אותי
    MySQL אומנם חינמי, אבל הוא בהחלט מסד צעצוע.
    עדיין נשאר לו ללמוד קצת SPים, שאילתות מקוננות ועוד…

  58. Just-Tal הגיב:

    אה אז עם פונקציה?..?
    אם הבנתי נכון?

  59. Deviation הגיב:

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

    server.execute "file.asp"

    ב. אם אין לך פונקציות שצריך להעביר: (צד שרת)

    server.transfer "file.asp"

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

    <!–#include virtual="file.asp"–>

    (אפשרי גם filre במקום ה virtual.

  60. Just-Tal הגיב:

    לא הבנתי אם תוכל תן הסבר קצר…
    יש לי דף שנקרא Sfuncs.asp ובו כל הפונקציות השימושיות של צד שרת

    ודף שנקרא Cfuncs.asp ובו כל הפונקציות השימושיות של צד לקוח

    איך להוסיף אותם?

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

  61. הערה –
    "ADO יהיה יותר מהר בגלל שהגישה נעשית פעם אחת אחרי הלולאה"

    חשוב לזכור למקם את ה-rs.Update מחוץ ללואה.

  62. ניר טייב הגיב:

    לידיעתך
    יש כיום את המסד הנתונים (או שזה הרחבה של mySql) בשם MaxDB שמאפשר SPים ושאילתות מקוננות ועוד כמה דברים ששופרו מ-mySql
    אפשר להיכנס לאתר של mySql  ולראות

  63. ניר טייב הגיב:

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

    Server.Execute "מקמפל" קובץ מסוים ואת התוצאה הוא מוציא בדף.
    Server.Transfer מעביר את כל המשתנים לדף אחר שמהנקודה שבא השתמשנו בו הפסקנו את העיבוד של הדף הנוכחי והדף האחר עושה עיבוד משלו

    (נראה לי שפיספסתי כאן משהו אז מישהו כאן יתקן/יוסיף על דבריי )

  64. Just-Tal הגיב:

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

    זו השאלה…

    עשיתי דף ASP של פונקציות func.asp ואני מוסיף אותו בתחילת עמוד עם אינקלוד…

    האם זה יותר יעיל מאשר לכתוב בקוד עצמו!?…

    טל

  65. Night הגיב:

    אבל הוא לא חלש ולא חזק נכון?
    שזה נחשב טוב לא?
    מה זה SP ושאילתות מקוננות?

  66. ניר טייב הגיב:

    דברים שלא תראה בגרסא הנוכחית של
    mySQL לעולם
    SP – שאילתא מאוחסנת(stored procedure) – בלוק של קוד/י SQL
    שאילתה מקוננת – שאילתה שיש בה תת שאילתות למשל:

    SELECT TOP 10 <fields> FROM tbl WHERE fldID not in(SELECT TOP 20 fldId FROM tbl)

    השאילתא שבתוך הסוגריים זו התת שאילתא.

  67. Just-Tal הגיב:

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

    🙂

    קפיש?

  68. אוריקס הגיב:

    למה?


    <script language="jscript" runat="server" src="x.js"></script>

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

  69. ניר טייב הגיב:


    אני פשוט הסברתי לו  את מה שרוני כתב

  70. Deviation הגיב:

    שמעתי על זה אבל אני דיברתי על MySQL
    הכוונה הייתה ל MySQL 4 שקיים כיום ברוב חברות האיחסון.
    יש כאלו שמשתמשות עדיין ב MySQL 3

  71. אוריקס הגיב:

    תגובה לך ולניר
    אם זה רק פונקציות השימוש בדף ASP הוא מיותר ובזבזני… הכי טוב זה פשוט להשתמש בקובץ JS.

  72. Just-Tal הגיב:

    בעיה בקוד קטן
    יש לי את הקוד הבא:


    If not Rs.EOF then 'בודק האם המשתמש קיים
                session("s_login") = 1
                session("s_uid") = Rs.Fields("us_id")
                session("s_uname") = Rs.Fields("us_nm")
                session("s_admin") = Rs.Fields("us_admn")
                Rs.close
                Sql = "SELECT utils.site_logins FROM utils"
                Rs.Open Conn, Sql
                temp = Rs.Fields("site_logins")
                Rs.Fields("site_logins") = Temp + 1
                Rs.Update
                Rs.Close
                %><script type="text/javascript">
                    opener.focus();
                    opener.location.reload();
                    self.close();
                    self.window.top.close();
                </script><%
            Else 'אם לא
                showmes = "Wrong Username or Password"
            End if

    והודעת השגיאה שאני מקבל היא:


    Error Type:
    ADODB.Recordset (0x800A0BB9)
    Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another.
    /vol2/loginwin.asp, line 26

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

    תודה מראש!

    טל.

  73. Just-Tal הגיב:

    עוד שאלה, בקוד יש….
    הוספה של


    rs.fields("site_logins")

    באחד… והוא לא מוסיף….

  74. BuildHome הגיב:

    אתה צריך להגדיר
    שאתה מעוניין לבצע עדכון נתונים, כך:

    Rs.Open Sql,Conn, 3, 3

  75. Just-Tal הגיב:

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

  76. sirob הגיב:

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

    יש את זה היום ברוב (אם לא כל) חברות האירוח בתשלום…

    לפרטים, חפש עוד על Scripting.FileSystemObject .

שלח תשובה