שלח תשובה

זירת השאלות

549
צפיות
39
תשובות

שיטות לקריאת נתונים מACCESS DB

,‏ 9 במאי, 2004

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

אך ישנם עוד שני שיטות לקריאת נתונים מהדאטא, והן: GetString ו-GetRows.

השאלה שלי היא האם 2 השיטות שצוינו לעיל, מהירות בהרבה מ"השיטה הרגילה" בהנחה שיש לרשומה שדות רבים (וגם כשאין, מה יותר עדיף)? אם כן, מי מהיר יותר?

*כמובן שהמהירות שאני מתכוון אליה היא מהירות ניתוק ההתקשרות לדאטא בייס.


אגב, הפורום כאן ממש מהיר. הוא מבוסס על MS ACCESS DB או MSSQL/MYSQL DB?
ובאיזו שיטה השתמשו כאן?


תודה רבה מראש לעונים,
נתנאל.

תגיות:

39 תשובות

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

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

    גם את getRows אפשר להעביר ללקוח אבל זה דיי לא מומלץ בגלל הלולאות בשרת

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

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

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

    מסכים שזה לא אבסולוטי
    אבל בדוגמא שאני הבאתי (והילדה יצרה) יש לא מעט נתונים (22048 נתונים)
    שזה דיי הרבה

  4. Shreky הגיב:

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

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

    ושוב תודה.

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

    זה דטהבייס קטן
    ולא מדגדג את היכולות של אקסס. האיטיות של היא בטח כי אתה על שרת חינמי, או שאתה לא עובד נכון מול בסיס הנתונים שלך [סגירת מהיא של חיבורים, שימוש ב getRows ו getString וכו'.].

    איך הפורום כאן בנוי – בעקרון הוא מה שקרוי רקורסיבי, אני מניח שבלי הרקורסיה.
    האתר על SQL Server, למרות שאפילו אתר כזה אקסס החזיק עד לא מזמן.
    אקסס יכול להגיע בכיף ל 100000 רשומות.

  6. Shreky הגיב:

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

    תודה על התשובה.

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

    400 רשומות זו טבלה כ"כ קטנה שאין
    שום סיבה לאיטיות. כמה משתמשים מחוברים בו זמנית לאתר בשעות העומס?

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

    בנוסף
    תעביר את עיבוד הדף לקליינט, אין סיבה שהוא יתבצע בשרת [עם GetRows או עם GetString, כמפורט במאמרים באתר]

  9. Shreky הגיב:

    נגיד משהו כמו 120 איש בו זמנית
    בשעות העומס.
    הקטע הוא שבכל דף מוצגים נתונים מכמה טבלאות (4) + אימות שם משתמש וסיסמא, כך שכל יוזר שנכנס לכל דף עושה בעצם 5 שאילתות בדף, ורק אז הקישור לדאטא בייס נסגר.

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

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

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

    <%
    strRsGetString = rs.getString(….)
    %>
    <script>
    var strRec = <% =strRsGetString %>
    </script>

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

    ואל תשכח העברה ללקוח בדר"כ מתבצעת
    יותר מהר דרך getString

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

    אז אתה עובד לא כ"כ נכון.
    אתה לא צריך להגיע למצב שיש לך 4-5 חיבורים.

  13. Shreky הגיב:

    ניר – תודה. | אוריקס [בפנים]
    ניר, הבנתי עכשיו למה אתה מתכוון.

    זה 5 שאילתות שונות.

    [1] אימות משתמש
    [2] חדשות
    [3] מוצרים על פי שאילתא א'
    [4] מוצרים על פי שאילתא ב'
    [5] מוצרים על פי שאילתא ג'

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

    חשבתי לעשות חיבור אחד, לשלוף את כל המוצרים (או לשם סינון, נגיד את ה100 האחרונים – שזה יהיה בתור הנחה שב100 האחרונים יש 5 מוצרים מכל שאילתא) ואז לעבור עליהם אחד אחד.

    אבל זה ניראה לי יותר מתי מבחינת זמן ומשאבי שרת/לקוח.

    יש לך רעיון אחר?

  14. אמממ…
    1. אימות משתמש עושים רק פעם אחת, בכניסה למערכת
    2. חדשות – תבדוק את האפשרות לשמור אותן במשתנה אפליקציה
    3,4,5 – בלי לראות את השאילתות אי אפשר לייעץ לך.
    בכל מקרה, גם אם מדובר על 3 שאילתות, אתה מבצע אותן בתחילת הדף, מכניס למשתנים/מערכים/אובייקטים/מעביר ללקוח , סוגר את החיבור ורק אז מתחיל בהצגת הנתונים.

  15. העברת העיבוד ללקוח לא תמיד רצוי
    ולא הייתי לוקחת את זה כברירת מחדל – "עיבוד נתונים בלקוח זה תמיד יותר טוב".

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

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

    אם אתה עושה אותה שאילתא
    ב-3 האחרונים רק שב-WHERE אתה מחפש תוכן אחר של שדה הייתי מציע לך להשתמש ב-SP זה יותר מהיר בדברים האלו למיטב הבנתי

  17. Shreky הגיב:

    השאילתות הדומות, לעיל:

    SQL_New_Products_Query="SELECT [FIELDS] FROM tbl_products ORDER BY [product_id] DESC"

    SQL_Recommended_Products_Query="SELECT [FIELDS] FROM tbl_products WHERE ([isRec]='+') ORDER BY [product_id] DESC"

    SQL_Pre_Order_Products_Query="SELECT [FIELDS] FROM tbl_products WHERE ([isPre]='yes') ORDER BY [predate] DESC"

    אלו הם השאילתות בעיקרון.
    במקום כל השדות הרצוים, כתבתי [FIELDS] שיהיה נחמד ונקי יותר לקריאה (רצויים פה בסביבות ה12 שדות, כאשר בכל השאילתות אני רוצה את אותן 12 שדות).

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

    אגב, אמרת שאפשר לאכסן את החדשות במשתנה אפליקציה.
    מודה, לא חשבתי על זה 🙂
    אז באותה מידה אפשר גם לעשות את זה לשלושת השאילתות הקבועות שציונו לעיל.
    Am I right?

    ותודה רבה על הרעיונות!

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

    עושים לוגין פעם אחת לאתר
    ואת הנתונים שמים בתוך סיישן session שאותו המשתמש לא יכול לזייף… (המשתמש הרגיל והפשוט)

  19. Shreky הגיב:

    הבעיה ב-Session היא כזו
    היא נשמר לתקופת זמן מוגבל מאוד. 20, או מספר הדקות שאני אומר לו להישמר, או עד שהמשתמש יוצא מהאתר/סוגר את הדפדפן.

    זאת אומרת שכל ביקור שלו באתר הוא יצטרך להתחבר מחדש —> מסורבל למשתמש.

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

    תלוי בסוג האתר שאתה בונה
    וגם בעומס שיש לך על השרת וכו'…

    בכל מקרה, אני מעדיף לעבד בלקוח.

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

    וגם
    גוגל מזהה ומאנדקס קישורים שנכתבו ב JS.

  22. Shreky הגיב:

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

    מה אתה אומר על השיטה?

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

    זה טוב במקרים מסויימים
    בעיקר בדפים נצפים במיוחד.

  24. Shreky הגיב:

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

  25. Shreky הגיב:

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

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

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

    תודה מראש,
    נתנאל.

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

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

  27. Shreky הגיב:

    קודם כל, עשיתי זאת עם GetString
    לקחתי את מה שקיבלתי מGetString, פירקתי את הנתונים (כל רשומה לתוך מערך א', ואת כל שדות אותה רשומה בתוך מערך ב', שמתעדכן בלולאה שרצה על כל איברי מערך א'), ושמתי את הנתונים בתוך התבנית הרצויה.
    את כל הנתונים+התבנית אכסנתי במשתנה האפליקציה.

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

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

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

  29. Shreky הגיב:

    הבנתי. אני אעביר לצד לקוח ואטפל
    בנתונים שם.

  30. Shreky הגיב:

    נתקלתי בבעיה קטנה
    משתנה האפליקציה שומר את החדשות בפורמט מעוצב HTML-י (החדשות נכתבות במן עורך טקסט נחמד).
    כאשר אני מעביר את תוכן משתנה האפליקציה אל תוך משתנה בג'אווה, ע"י:


    var News = "<%=Application("News")%>";

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

    איך אני יכול להיפתר מהבעיה הזו בצד הלקוח?
    או אפילו להשתמש בפונקציה
    replace()
    בצד השרת, על מנת להפוך את כל " לקוד של הגרשיים
    &Code;
    או למשהו אחר.

    כמובן שלא הצלחתי ע"י

    Replace(STR,"["]","'")

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

    אני יודע שבג'אווה סקריפט ניתן לכתוב תו מיוחד ע"י הוספת לוכסן ימני לפניו, אך בVBSCRIPT זה לא כ"כ עובד…

  31. Shreky הגיב:

    אוקיי, העברתי את העיבוד לצד השרת
    (**על הבעיה שכתבתי מקודם עדיין לא הצלחתי להתגבר.)

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

    כרגע, עשיתי רק את השאילתות על המוצרים (3), ועוד שאילתת של אימות משתמש.

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

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

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

    [ועדיין אשמח לקבל תשובה על השאלה הקודמת]

  32. Shreky הגיב:

    [עדיין מחכה לתשובה] 🙂
    בתודה מראש,
    נתנאל.

  33. mrmistory הגיב:

    אז תגדיר SESSION ל-10 שעות או……
    250 שעות, אפשר לשנות את הזמן ברירת מחדל שלו.

  34. מזהה כן
    אבל הוא לא מאנדקס טסטים דינאמיים

  35. במקום להחליף במרכאות כפולות,
    תחליף ב-;quot&

  36. Shreky הגיב:

    אבל הבעיה היא ש…
    במשפט:

    Replace(STR,"["]","'")

    איך אני כותב את הגרשיים בASP? כלומר, שצד השרת ישנה בסטרינג את כל תווי ה-" (גרשיים כפולים) לתו גרש. איך אני יכול לכתוב את הגרשיים השניים כך שהקוד הזה יעבוד?

שלח תשובה