506
צפיות
צפיות
54
תשובות
תשובות
שאלה
במאמר הבא לפורום שנמצא ב-SQL-TEAM:
עד כמה באמת הוא יעיל. הם משתמשים שם ב-שדה LEVELID ו-SORTID וההזחה נעשית ברמת המסד.
הכתוב שם באמת יעיל ?
במאמר הבא לפורום שנמצא ב-SQL-TEAM:
עד כמה באמת הוא יעיל. הם משתמשים שם ב-שדה LEVELID ו-SORTID וההזחה נעשית ברמת המסד.
הכתוב שם באמת יעיל ?
54 תשובות
לא נעים להגיד
אבל מאמר גרוע
צריך ללמוד לסנן את החומרים שיש באינטרנט – ההצפה יכולה לגרום לבלבול מסויים…
ולשאלתינו: שדות כמו sortID או OrderID הם מיותרים ונועדים למתכנת עצלן שקשר לו לרשום padding.
כמו שחשבתי רק רציתי להיות בטוח
תודה
חלוקה לעמודים
שיטות חלוקה לעמודים .
הערה: אני מתייחס פה רק ל-ACCESS ול-MSSQL
1. שימוש ב-SELECT TOP בשילוב תת שאילתא:
sql = "SELECT TOP 15 <fields> FROM <tables> WHERE tbl.fldID NOT IN (SELECT TOP "&(15*pageId)&" fldID FROM tbl ORDER BY fldID [DESC/ASC])"
rs.Open(sql , objConn)
2. לא ניתן לבצעו באקסס. שימוש ב-SQL דינמי ע"י הכנסת השאילתא למשתנה ומימושה ע"י EXEC
CREATE PROCEDURE spPagging(@pageId int, @numOfRecInPage int)
AS
DECLARE @strSQL varChar(300)
SET @strSQL = 'SELECT TOP '&@numOfRecInPage&' <fields> FROM <tables> WHERE tbl.fldID NOT IN(SELECT TOP '&(@numOfRecInPage*@pageId)&' fldID FROM tbl)'
EXEC (@strSQL);
3. חלוקה לעמודים ברמת ה-MSSQL / מאת הילדה בלבן
https://www.webmaster.org.il/showArticle.asp?id=62
4. ברמת ה-ASP :
עמוד ראשון – שליפה של מס' הרשומות הנדרשות
SELECT TOP 10 <fields>, fldID FROM tbl
בכל עמוד שעוברים מעבירים את ה-ID האחרון שנשלף ב-query string ומבצעים את השאילתא הבאה:
sql = "SELECT TOP 10 <fields>, fldId FROM tbl WHERE fldID>"&cInt(Request.QueryString("lastId"))
אפשר לייעל זאת ע"י כך שנשים את השאילתא השנייה בתוך SP ונשלח פרמטר lastId שישמש אותנו להעברת ה-ID האחרון שהנמצא ב-QS
ACCESS:
PARAMETERS p_lastId int;
SELECT TOP 10 <fields>, fldId FROM tbl WHERE fldId>[p_lastId];
קריאה מה-ASP
sql = "EXECUTE spName @p_lastId="&cInt(Request.QueryString("lastId"))
rs.Open(sql, objConn)
MSSQL:
CREATE PROCEDURE spPagging(@p_lastId int) AS
DECLARE @strSQL varChar(300)
IF @lastId=0 THEN
SET @strSQL="SELECT TOP 10 <fields>, fldID FROM tbl"
ELSE
SET @strSQL="SELECT TOP 10 <fields>, fldId FROM tbl WHERE fldID>"&@lastId
END IF
EXEC(@strSQL)
קריאה מה-ASP:
sql = EXECUTE spPagging EXECUTE @p_lastId="&cInt(Request.QueryString("lastId"))
rs.Open(sql, objConn)
וילדה אל תעירי לי על ה-@ במשפטי ה-EXECUTE שמבוצעים על ACCESS כי בלעדיהם ה-EXECUTE לא עובד (לפחות אצלי)
פוקק
כאילו דההה
regExp
במערכת החדשות שאני בונה אני בודק אם ה-ID שנשלח ב-QS הוא מספר
אז אני בודק אם הוא נשלח ו/או מבצע עליו את regExp שבודק האם הוא מכיל אותיות
אם הוא עונה על אחד מהתנאים אני שולח אותו בחזרה לעמוד אינדקס הכתבות
if (artId=="NaN" || /*[a-z]*/gi.test(artId))
Response.Redirect("index.asp?pageId=1");
הבעיה היא שגולש עדיין יכול להכניס לי תווים ב-QS שהם לא מספרים ולא אותיות (כמו & ו-" ; ") ואז תתקבל שגיאה (שאני רוצה למנוע)
איך אני משדרג את ה-regExp כשלי כך שהוא לא יאפשר גם תווים מיוחדים (לדוגמאת : "&", ";")
/*[a-z]*/gi
[ללא נושא]
var artId = Request.QueryString("id"), rExp=/D*/gi, rExp1=/d*/gi
if (artId=="NaN" || (!rExp.test(artId) && rExp1.test(artId)))
Response.Redirect("index.asp?pageId=1");
יש פיתרון יותר טוב? אשמח לשמוע
cint??
קודם כל parseInt
אפשרי במשפט IF לבדוק האם הערך הוא מספרי ע"י הסבתו?
לא מעירה
הבעיה עם ה-@ היא בתוך ה-SP ולא בקוד ה-ASP.
תאריכים לפי אזורים (ל-FAQ )
שאלה
איך מחזירים את התאריך שנמצא באובייקט התאריך ב-JS כתאריך שלם בשפה האזורית?
תשובה
משתמשים בשיטה toLocaleString() של אובייקט התאריך
var todayDate = new Date()
alert(todayDate.toLocaleString());
יש פונקציה הבודקת אם הוא שווה לערך
מספרי.
דוגמא:
<%
ID = Request.QueryString("ID")
If IsNumeric(ID) Then
OK
Else
Error!
End If
%>
מקווה שלזה התכוונת
מכיר :- אבל אני עובד על JS
ואים פונקציה כזו ב-JS
יש את isNan….
זה מה שאתה מחפש?
isNan()
הדפסת תאריך בצרפתית
או בכל שפה שרוצים, למעשה… VBscript צד לקוח:
קובץ מצורף…
חיפוש פנימי
במערכת החדשות שאני עושה באתר אני מאפשר למשתמש לעשות חיפוש פנימי בתוך כתבה (ע"י JS ו-DHTML) הסימון עובד והחיפוש מתבצע כיאה.
אז בעצם ככה הולך הסקריפט שלי
מקבל משדה קלט (Input) מסוים את הערכים לחיפוש ומפצל אותם איפה שיש ערכים ריקים (ע"י regExp : /s/g) למערך. לאחר מכן מאתחל שני משתנים strArticle ו-strArticleCng ומציב בהם את ה-HTML של הכתבה (ע"יinnerHTML).
מבצע לולאה על על המערך של מילות החיפוש ועושה replace איפה שצריך במשתנה strArticleCng (ממרקר את הטקסט שחופש בצהוב).
לאחר מכן משווה בין שני הערכים של המשתנים strArticle ו-strArticleCng
ואם הם שווים (סימן שלא חל שינוי ושלא נמצא שום הערך המבוקש) אז מופיע alert שכתוב בו " לא נמצאו תוצאות"
ואם הם שונים (סימן שכן נמצא) זה פשוט מכניס את הערך החדש בתוך ה-DIV
var strToSearch=""+document.getElementById("search").value, strArticle=""+document.
getElementById("Content").innerHTML, strArticleCng;
case "by word":
strToSearch= strToSearch.split(/s/g);
var strArticleCng1 = strArticleCng;
strArticleCng = strArticle;
for (var i=0;i<strToSearch.length;i++)
strArticleCng = strArticleCng.replace(new RegExp(strToSearch[i],"gi
"),"<span style="background-color:yellow;"> "+strToSearch[i]+" </span>");
if (strArticleCng1==strArticleCng) alert("לא נמצאו תוצאות");
else document.getElementById("Content").innerHTML = strArticleCng;
break;
(אל תתיחסו לזה שאין SWITCH כי זה רק חלק מהקוד)
הטקסט מסומן כשזה מוצא אבל אם זה לא מוצא אז שום דבר לא קורה ואין ALERT
איך אני פותר את הבעיה תודה (ניסיתי כל מיני דברים והם לא עבדו)
אפשר, אבל לא צריך…
var x="nir";
alert(isNaN(x));//not a number
x="123";
alert(isNaN(x));//number
תודה חשבתי שזה שייך ל-VBS
ועוד שאלה
יש איזה שהיא פונקציה ב-JS שהופכת תווים ל-ASCII שעובדת עם regExp ?
מה הכוונה עובדת עם RegEx?
טוב לא חייב שתעבוד עםregExp
והכוונה הייתה שאחד הפרמטרים שלה יהיה ביטוי רגולרי (new RegExp)
העיקר שתהפוך קבוצת תווים ל-ASCII אני פשוט רוצה להפעיל את ה-regExp הבא:
rExp = /W/g
הפכת שתי שורות:
var strArticleCng1 = strArticleCng;
strArticleCng = strArticle;
צריך להיות:
strArticleCng = strArticle;
var strArticleCng1 = strArticleCng;
תודה
איך לא שמתי לב
בקשר למאמר של deviation
לפי מה ש-deviation אומר במאמר חלק ב' אפשר להסיק שכל הלולאה שאנו עושים על הרקורדסט היא לא רצויה (ובכלל על מערך getRows)
כי זה מעין מעבר ליניארי על כל השדות שנצאים במסד.
אז אם זה כך יש פיתרון אחר?
לא נכון.
אתה חייב לעבור בצורה לינארית על הקלט שלך, כי זה הכי יעיל. זה נקרא סיבוכיות O(n) כש n הוא אורך הקלט שלך (מספר ההודעות בפורום, למשל).
הבעייה מתחילה להסתבך, כשעל כל פעם שאתה עובד, אתה עובד עוד פעם, ועוד פעם… ואז ה n מקבל חזקה.
במקרה שלך – סיבוכיות זמן הריצה תלויה ברמה הכי ארוכה בעץ. הסיבוכיות שלך ברקורסיה היא O(n^x) כשה X הוא הרמה הכי עמוקה בעץ. וזה _מאד_לא_יעיל.
לא דיברתי על רקורסיה
דיברתי בכלליות
תודה על ההסבר
הרקורסיה הייתה דוגמא
לאלגוריתם עם סיבוכיות גבוהה
הצלחתי לשפר ביצועים (יש)
1. לולאה על getRows יצאה יותר מהירה מלולאה על הרקורדסט (כשיש רשומה אחת )
2. אני עושה חלוקה לדפים בעזרת not in ותת שאילתא (כמו שיש כאן באחת מההודעות הקודמות בשרשור) כדי לעשות דפדוף עלי לעשות שליפה חוזרת של מס' הרשומות שיש לי במסד (ע"י פונקציית COUNT) . אז לפני הדפדוף בדקתי אם צריך בכלל לדפדף (אם ה-rs.recordCount קטן מ-10 במקרה שלי)(או לפי אורך המערך ((arr.length<10*cntFields+cntFields)-(ע"פ השיטה שלי למערכי getRows)) ואם לא צריך אז שפשוט לא יופיע הדפדפוף (ה-SELECT של הדפדוף נעשה בצד הלקוח בסקריפט JS כאשר מס' הרשומות מועברות כפרמטר לפונקציה )
getRows שיפר את הביצועים
ב-60 עד 100 מילישניות
והדפדוף ב-60
כמה זמן לוקח כל העסק? לכמה רשומות?
זה נשמע כמו המון זמן….
רשומה אחת היית מאמין ?!
המסד בנוי נכון ומסודר כמו שצריך.
העסק עצמו לקח כ-150 ms בטעינה ראשונה לפני שיפור הביצועים לאחר השיפור 50 ms(דפדוף ו-getRows)
בסוף הורדתי את השיפור של הדפדוף
כי זה יצר באג מערכת שניתן לתקנו רק ע"י שליפה של מס' הרשומות שיש לי במסד (פתיחת רקורדסט) שבכל מקרה אני עושה זאת בדפדפוף אז למה עוד פעם!
בלי הדפדוף
100 ms
וכשיש 16 רשומות ומתוכן נשלף רק 10 אז 600 ms לדעתי זה שיפור ביצועים
ודרך אגב כך נראית השאילתא שלי:
SELECT TOP 10 articles.artId, articles.artSubject, (RIGHT(articles.strArticle,250) & IIF(LEN(articles.strArticle)>250,"…","")) AS str80Article, articles.publishDate, Writers.writerName
FROM articles INNER JOIN writers ON articles.writerId=writers.writerId
ORDER BY articles.artId DESC;
בעמוד הראשון
זה ***המון*** לדעתי…
ניסית פתרון של FSO? זה ייקח משהו כמו 50ms להכל (מנסיון העבר)…
מצטער לומר לך אבל FSO זה
לא טוב במקרה שלי
אני בונה מערכת חדשות ואני צריך את אפשרות החיפוש. חיפוש ב-FSO זה דבר נוראי שמבזבז הרבה משאבים וגם דפדוף אני מעדיך לעשות מהמסד יותר נוח.
חוץ מזה במסד יותר נוח לאחזר ולעדכן מאמרים
איך שבא לך 🙂
זה הרבה זמן,
הייתי בודק את עצמי
איך לעשות זאת?
בטעינה ראשונה!
לאחר שאני עושה refresh זהי יורד ל-100 ואז ל-60
פרטים של דוגמא:
caching לא נחשב 🙂
לא שם את הקישור:
http://aspprofiler.sourceforge.net/
לא יודע…
לא ראיתי את הדף שלך
עזוב טעינה ראשונה
דפי ASP לא מתקמפלים בכל פעם שמתבצעת בקשה
זו טעות
הבאתי נתונים של העמוד הלא נכון
זה טוען ישר על 100 ms זה כבר יותר נורמלי ?!
אם לא הולכים על תעינה ראשונה זה
צריך להיות באזור ה-0.020 שניות. לא הרבה יותר.הדפים שלי עולים ב-0.008 בפעם השניה.
0.100 זה סביר, אבל לא בשביל 16 רשומות….
שמע…
הדפים שלי עולים לפעמים 0.1 לפעמים 0.08
אתה בעצם אומר שהעמוד שלך עולה תוך 8 מאיות שנייה(שיא)
מה יש בו כבר?!
שאילתא בעמוד הראשון (שלוקח לו בין 0.07 ל-0.1 שניות לעלות):
SELECT top10Articles.artId, top10Articles.artSubject, top10Articles.str80Article, top10Articles.publishDate, top10Articles.writerName FROM top10Articles WHERE catId=1
שקורא ל-VIEW
SELECT TOP 10 articles.artId, articles.artSubject, (RIGHT(articles.strArticle,250) & IIF(LEN(articles.strArticle)>250,"…","")) AS str80Article, articles.publishDate, Writers.writerName, articles.catId
FROM articles INNER JOIN writers ON articles.writerId=writers.writerId
ORDER BY articles.artId DESC;
לאחר מכן לולאה על getRows
לאחר מכן עוד שאילתת COUNT לדפדוף
SELECT Count([artId]) AS cntId
FROM articles;
בעמוד אחרים שבחלוקה(השאילתא של הצגת הכתבות בעמוד 2):
SELECT TOP 10 articles.artId, articles.artSubject, (RIGHT(articles.strArticle,250) & IIF(LEN(articles.strArticle)>250,"…","")) AS str80Article, articles.publishDate, Writers.writerName FROM articles INNER JOIN writers ON articles.writerId=writers.writerId WHERE articles.artId NOT IN(SELECT TOP 15 articles.artId FROM articles ORDER BY articles.artId DESC) AND articles.catId=1 ORDER BY articles.artId DESC
והדפדוף עדיין נשאר
גיליתי ששאילתת ה-COUNT
מכבידה על עליית העמוד ב-10 עד 40 (ms)
האובייקט ASPProfiler עובד מעולה.
הדף שלי מבצע לולאה אחת 165 פעם, וכל הלולאה לוקחת 10 מילישניות.
הדף כולו עולה ב-31 מילישניות, כשקריאת הנתונים באופן מעשי לוקחת כ-5 מילישניות. הכל עם FSO כמובן.
אני משתמש ב-DB כדי ליצור
חלוקה לעמודים נאותה וגם חיפוש
ב-FSO צרילך לפתוח ולסגור את הקובץ
ואנו עובדים בשתי שיטות שונות אז כבר אי אפשר להשוות
אתה עם FSO ואני עם DB
שאלת יעילות ועוד משהו
אני יודע שמבחינת יעילות אם אני אעביר את הנתונים ללקוח העמוד יעלה יותר מהר
אבל מצד שני העמוד שאני בונה הוא עמוד אינדקס של כתבות האם זה חשוב שהוא יקוטלג באתרי חיפוש (כמו גוגל)
כי בעצם באותו עמוד אני מציג את נושא המאמר, ע"י מי זה נכתב, תאריך פרסום ו-120 תווים ראשונים של המאמר.
האם זה באמת חשוב שאותו עמוד יקוטלג באתרי חיפוש?!
כן, זה חשוב
למה? כי הקישור למאמר נמצא בעמוד זה?
בעקרון זו העדפה אישית שלך
אבל נראה לי שחשוב שהאינדקס יקוטלג… ככה האתר שלך יפול בהרבה מנועי חיפוש.
האמת שזה לא לאתר שלי
אני בונה את המערכת לאתר אוונסנס הישראלי