549
צפיות
צפיות
39
תשובות
תשובות
שיטות לקריאת נתונים מACCESS DB
[מדובר על ASP]
אני עובד כבר זמן רב עם השיטה "הרגילה" (אם אפשר לקרוא לה כך) לקריאת נתונים מהדאטא. השיטה היא לולאת WHILE שעוברת על כל הרשומות ומציגה את הנתונים שצריך.
אך ישנם עוד שני שיטות לקריאת נתונים מהדאטא, והן: GetString ו-GetRows.
השאלה שלי היא האם 2 השיטות שצוינו לעיל, מהירות בהרבה מ"השיטה הרגילה" בהנחה שיש לרשומה שדות רבים (וגם כשאין, מה יותר עדיף)? אם כן, מי מהיר יותר?
*כמובן שהמהירות שאני מתכוון אליה היא מהירות ניתוק ההתקשרות לדאטא בייס.
אגב, הפורום כאן ממש מהיר. הוא מבוסס על MS ACCESS DB או MSSQL/MYSQL DB?
ובאיזו שיטה השתמשו כאן?
תודה רבה מראש לעונים,
נתנאל.
39 תשובות
שני השיטות מהירות בהרבה
מהשיטה הרגילה.
getRows זו שיטה שיותר נוח לעבוד בה בשרת כמערך
getString זו שיטה שבשרת אפשר לקנפג כטבלה למשל וכדומה את הנתונים בתוך משתנה או להעביר אותה ללקוח במהירות ושם לפצל למערך ולעבוד כמו עם getRows רק בצד הלקוח
כאן יש שממחיש איזו מהשיטות יותר מהירה
גם את getRows אפשר להעביר ללקוח אבל זה דיי לא מומלץ בגלל הלולאות בשרת
כמו שדגון אומר
זה לא אבסולוטי ועל מסות של נתונים getRows יעבוד מהר יותר.
מסכים שזה לא אבסולוטי

אבל בדוגמא שאני הבאתי (והילדה יצרה) יש לא מעט נתונים (22048 נתונים)
שזה דיי הרבה
תודה רבה על הדוגמא. [ועוד דבר]
תודה רבה על הדוגמא.
ומישהו יכול להגיד לי אולי כיצד הפורום הזה בנוי?
עם איזו שיטת קריאה הוא משתמש, ועל איזה מאגר מידע הוא מאוחסן?
ועוד דבר קטן, האם הוא יושב על שרת משלו, או שרת משותף?
🙂
אשמח אם תענו לי על השאלות.
פשוט יש לי אתר עם דאטא בייס דיי גדול (משהו כמו 10 טבלאות, כשבטבלאות השימושיות ביותר יש בסביבות 400 רשומות) ויש לו קצת בעיית איטיות.
ושוב תודה.
זה דטהבייס קטן
ולא מדגדג את היכולות של אקסס. האיטיות של היא בטח כי אתה על שרת חינמי, או שאתה לא עובד נכון מול בסיס הנתונים שלך [סגירת מהיא של חיבורים, שימוש ב getRows ו getString וכו'.].
איך הפורום כאן בנוי – בעקרון הוא מה שקרוי רקורסיבי, אני מניח שבלי הרקורסיה.
האתר על SQL Server, למרות שאפילו אתר כזה אקסס החזיק עד לא מזמן.
אקסס יכול להגיע בכיף ל 100000 רשומות.
השרת הוא לא חינמי
דווקא השרת הוא לא חינמי, והאתר עצמו הוא מסחרי.
אני כן סוגר את הדאטא בייס מהר, אבל עד עכשיו השתמשתי בשיטה הרגילה, ולא ב-Get String.
תודה על התשובה.
400 רשומות זו טבלה כ"כ קטנה שאין
שום סיבה לאיטיות. כמה משתמשים מחוברים בו זמנית לאתר בשעות העומס?
בנוסף
תעביר את עיבוד הדף לקליינט, אין סיבה שהוא יתבצע בשרת [עם GetRows או עם GetString, כמפורט במאמרים באתר]
נגיד משהו כמו 120 איש בו זמנית
בשעות העומס.
הקטע הוא שבכל דף מוצגים נתונים מכמה טבלאות (4) + אימות שם משתמש וסיסמא, כך שכל יוזר שנכנס לכל דף עושה בעצם 5 שאילתות בדף, ורק אז הקישור לדאטא בייס נסגר.
מז"א להעביר את עיבוד הדף לצד הקליינט?
אפשר להעביר את כל התוכן שצריך מהמסד
לצד הלקוח לסקריפט JS. ע"י כך ששולפים את הנתונים מעבירים אותם עם getString (הכי מומלץ) לצד הלקוח
<%
strRsGetString = rs.getString(….)
%>
<script>
var strRec = <% =strRsGetString %>
</script>
ואל תשכח העברה ללקוח בדר"כ מתבצעת
יותר מהר דרך getString
אז אתה עובד לא כ"כ נכון.
אתה לא צריך להגיע למצב שיש לך 4-5 חיבורים.
ניר – תודה. | אוריקס [בפנים]
ניר, הבנתי עכשיו למה אתה מתכוון.
זה 5 שאילתות שונות.
[1] אימות משתמש
[2] חדשות
[3] מוצרים על פי שאילתא א'
[4] מוצרים על פי שאילתא ב'
[5] מוצרים על פי שאילתא ג'
כמובן שבשאילתות 3,4,5 זה מראה מוצרים אחרים, ואני צריך בהם רק את ה5 מוצרים האחרונים שנוספו למאגר ע"י קריטריונים שנמצאים בשאילתא.
חשבתי לעשות חיבור אחד, לשלוף את כל המוצרים (או לשם סינון, נגיד את ה100 האחרונים – שזה יהיה בתור הנחה שב100 האחרונים יש 5 מוצרים מכל שאילתא) ואז לעבור עליהם אחד אחד.
אבל זה ניראה לי יותר מתי מבחינת זמן ומשאבי שרת/לקוח.
יש לך רעיון אחר?
I feel lonely in these hours 🙂
אמממ…
1. אימות משתמש עושים רק פעם אחת, בכניסה למערכת
2. חדשות – תבדוק את האפשרות לשמור אותן במשתנה אפליקציה
3,4,5 – בלי לראות את השאילתות אי אפשר לייעץ לך.
בכל מקרה, גם אם מדובר על 3 שאילתות, אתה מבצע אותן בתחילת הדף, מכניס למשתנים/מערכים/אובייקטים/מעביר ללקוח , סוגר את החיבור ורק אז מתחיל בהצגת הנתונים.
העברת העיבוד ללקוח לא תמיד רצוי
ולא הייתי לוקחת את זה כברירת מחדל – "עיבוד נתונים בלקוח זה תמיד יותר טוב".
מהסיבה הפשוטה שמנועי חיפוש לא מאנדקסים נתונים שנכתבו בלקוח, אלא רק את הטקסטים בקוד ה-HTML.
אם אתה עושה אותה שאילתא
ב-3 האחרונים רק שב-WHERE אתה מחפש תוכן אחר של שדה הייתי מציע לך להשתמש ב-SP זה יותר מהיר בדברים האלו למיטב הבנתי
השאילתות הדומות, לעיל:
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?
ותודה רבה על הרעיונות!
עושים לוגין פעם אחת לאתר
ואת הנתונים שמים בתוך סיישן session שאותו המשתמש לא יכול לזייף… (המשתמש הרגיל והפשוט)
הבעיה ב-Session היא כזו
היא נשמר לתקופת זמן מוגבל מאוד. 20, או מספר הדקות שאני אומר לו להישמר, או עד שהמשתמש יוצא מהאתר/סוגר את הדפדפן.
זאת אומרת שכל ביקור שלו באתר הוא יצטרך להתחבר מחדש —> מסורבל למשתמש.
תלוי בסוג האתר שאתה בונה
וגם בעומס שיש לך על השרת וכו'…
בכל מקרה, אני מעדיף לעבד בלקוח.
זהה אותו עם עוגיות
וגם
גוגל מזהה ומאנדקס קישורים שנכתבו ב JS.
אוקיי, ומה אתה אומר על יצירת App.
יצירת משתני APPLICATION, ואז להכניס לתוכם את המידע שאני משיג מהשאילתות.
כמובן שהמשתנים יתעדכנו כל פעם שהמשתנים ריקים או כל פעם שהדאטא בייס מתעדכן.
מה אתה אומר על השיטה?
זה טוב במקרים מסויימים
בעיקר בדפים נצפים במיוחד.
אוקיי, אז זה טוב גם במקרה הזה בגלל
שהשאילתות האלו בעצם נמצאות בכל העמודים באתר.
נשמע לי פיתרון נחמד.
מימשתי את זה בסופו של דבר, והתוצאה:
דווקא האתר עם השיטה הישנה, עלה מהר יותר…
מוזר מאוד.
שמתי בשני העמודים האלה, טיימר מתחילת הדף עד לסוף הדף.
אוריקס, אשמח אם תשאיר לי דרך ליצור איתך קשר בפרטי (אי-מייל), כדי שאני אשלח לך קישור לעמודים המדוברים (זהו אתר מסחרי, ולכן אני לא יכול לפרסם אותו כאן). ביחד עם הקישורים, אני אשלח לך אם תרצה, את הקוד החדש שתבדוק אותו אם תוכל.
תודה מראש,
נתנאל.
מה בדיוק עשית?
הרעיון הוא להכניס את ה GetRows למשתנה אפליקציה.
קודם כל, עשיתי זאת עם GetString
לקחתי את מה שקיבלתי מGetString, פירקתי את הנתונים (כל רשומה לתוך מערך א', ואת כל שדות אותה רשומה בתוך מערך ב', שמתעדכן בלולאה שרצה על כל איברי מערך א'), ושמתי את הנתונים בתוך התבנית הרצויה.
את כל הנתונים+התבנית אכסנתי במשתנה האפליקציה.
אני דיי בטוח, שתגיד לי לאכסן את הסטרינג הפשוט במשתנה האפליקציה, ולעשות את עיבוד הנתונים מהמשתנה בצד הלקוח.
אבל המחשבה שלי הייתה בעצם לשמור את זה פעם אחת (כל עדכון), ולחסוך זמן בעיבוד הנתונים הללו.
לוידע.
HTML שלם נראה לי קצת כבד על משתנה אפליקציה אחד.
הבנתי. אני אעביר לצד לקוח ואטפל
בנתונים שם.
נתקלתי בבעיה קטנה
משתנה האפליקציה שומר את החדשות בפורמט מעוצב HTML-י (החדשות נכתבות במן עורך טקסט נחמד).
כאשר אני מעביר את תוכן משתנה האפליקציה אל תוך משתנה בג'אווה, ע"י:
var News = "<%=Application("News")%>";
נוצר מצב שבו משתנה הניוז מורכב מהרבה גרשיים כפולים (גם מהתגיות של ההטמל, של החדשות המעוצבות).
איך אני יכול להיפתר מהבעיה הזו בצד הלקוח?
או אפילו להשתמש בפונקציה
replace()
בצד השרת, על מנת להפוך את כל " לקוד של הגרשיים
&Code;
או למשהו אחר.
כמובן שלא הצלחתי ע"י
Replace(STR,"["]","'")
כי הבעיה נוצרת היכן שהסוגרים המרובעים (כמובן שהקוד עצמו הוא בלי הסוגרים הנ"ל.
אני יודע שבג'אווה סקריפט ניתן לכתוב תו מיוחד ע"י הוספת לוכסן ימני לפניו, אך בVBSCRIPT זה לא כ"כ עובד…
אוקיי, העברתי את העיבוד לצד השרת
(**על הבעיה שכתבתי מקודם עדיין לא הצלחתי להתגבר.)
כך שמשתני האפליקציה מכילים רק טקסט עם סימנים מפרידים. אני טוען אותם בצד הלקוח, וכך העיבוד לתבנית HTML נעשית בצד הלקוח.
כרגע, עשיתי רק את השאילתות על המוצרים (3), ועוד שאילתת של אימות משתמש.
והדף נטען תוך 0.062 שניות (וזה כאשר משתני האפליקציה מלאים, כלומר אין צורך לקרוא את הנתונים של שלושת השאילתות מהמאגר).
בשיטה הרגילה, הכל הכל הכל (חדשות, שאילתות מוצרים ואימות לקוח) נטען לי תוך 0.015 שניות. וזה עוד כאשר הוא כן מתחבר למאגר ולוקח ממנו נתונים.
השאלה אם זה בגלל שכרגע אין עומס, ונוצר מצב שהמחשב שהשרת מסוגל לשלוח אליי את הנתונים יותר מהר ממה שאני מסוגל לעבד אותם בעצמי. כלומר השיטה הזאת יכולה לעזור בשעות עומס בדר"כ. ננסה מחר בצהריים 🙂
[ועדיין אשמח לקבל תשובה על השאלה הקודמת]
[עדיין מחכה לתשובה] 🙂
בתודה מראש,
נתנאל.
אז תגדיר SESSION ל-10 שעות או……
250 שעות, אפשר לשנות את הזמן ברירת מחדל שלו.
מזהה כן
אבל הוא לא מאנדקס טסטים דינאמיים
אמרתי שהוא מאנדקס?
במקום להחליף במרכאות כפולות,
תחליף ב-;quot&
אבל הבעיה היא ש…
במשפט:
Replace(STR,"["]","'")
איך אני כותב את הגרשיים בASP? כלומר, שצד השרת ישנה בסטרינג את כל תווי ה-" (גרשיים כפולים) לתו גרש. איך אני יכול לכתוב את הגרשיים השניים כך שהקוד הזה יעבוד?