573
צפיות
צפיות
29
תשובות
תשובות
מעבר ל-sql server
שלום לכולם!
עד היום עבדתי במסד נתונים מסוג access נוצר מצב בלתי אפשרי של מע' עם מעל ל-6000 רשומות של לקוחות אשר צריך לבצע עליהם חיפושים לפי קריטריונים (גיל,איך הגיעו למע' ועוד)
הדו"ח מופק לאט מאוד ולכן הוא נגדע באמצע כי נגמר זמן הסיישן עם השרת
השאלות הן:
1. האם זה ניתן לפתרון במסגרת מסד נתונים access/
2. האם מעבר לsql server יפתור את הבעייה.
3.מה זה מצריך ממני בתור מתכנת והאם זה מסובך או לא???
תודה
29 תשובות
1. ניתן לפיתרון
אם המערכת שבנית לא יעילה זה מן הסתם אשמתך (או אשמת מי שבנה) ולא אשמת האקסס. כי האקסס יכול להכיל הרבה יותר נתונים במערכת יעילה.(ראה את הפורום של איציק1 (האתר נסגר)(אבל נפתח בשם setup.co.il)). כמו כן בדוק שאתה סוגר חיבורים בזמן (אם אתה עובד עם ASP ולא מול המסד) וכדומה
2. אם המערכת יעילה ועדיין היא איטית אז SQL SERVER אמור לפתור את הבעיה
3. זה מצריך ממך ללמוד TSQL
תוספת לניר..
2. מעבר ל MsSQL אולי יזרז לך את העניינים אבל זה בהחלט לא בא כתחליף לתכנות נכון. לא צריך לפתוח 20 רקורדסטים בעמוד, לא צריך להשתמש ביותר מחיבור אחד למסד נתונים בעמוד וכיו'.
3. מסובך זה משהו אינדיוידואלי
והערה קטנה לסיום, Access יכול לעמוד בהרבה יותר מ 6000 רשומות, פשוט צריך לתכנת נכון
צור אינדקסים על השדות שאתה מחפש
לפיהם.
מה ז"א ליצור אינדיקסים???
תוכל לפרט.
אם אתה לא יודע מה זה אינדקסים
רצוי מאוד שעדיין לא תעבור ל-MSSQL.
אינדקסים:
http://www.databasejournal.com/features/mssql/article.php/1443581
(יש בתחתית המאמר עוד קישורים על אינדקסים)
דרך אגב השגיאה שהוא נותן לי היא:
Active Server Pages error 'ASP 0113'
Script timed out
/customer/settle_email_racaz1.asp
The maximum amount of time for a script to execute was exceeded. You can change this limit by specifying a new value for the property Server.ScriptTimeout or by changing the value in the IIS administration tools.
בדקתי וישנה פתיחה אחת של conn
וכל הרקודרדסטים סגורים כמו שצריך.
אני מעוניין להרחיב את השאלה:
זאת השאילתה הארוכה על הטבלה הראשית:
if yesuv<>"" then
sql=sql & " and yeshuv=" & yesuv
end if
if moaza<>"" then
sql=sql & " and moaza=" & moaza
end if
if ech<>"" then
sql=sql & " and ech=" & ech
end if
if came_from<>"" then
sql=sql & " and id=" & came_from
end if
if area<>"" then
sql=sql & " and area=" & area
end if
if niklat<>"" then
sql=sql & " and niklat=" & niklat
end if
if kelet<>"" then
sql=sql & " and kelet=" & kelet
end if
if f_status<>"" then
sql=sql & " and family_status=" & f_status
end if
if children<>"" then
sql=sql & " and children=" & children
end if
if t_age<>"" then
sql=sql & " and birth_date=" & t_age
end if
if interest<>"" then
s="interest"
sql=sql & " and (soog='" & s & "' and prefer=" & interest & ")"
end if
if ofi<>"" then
sql=sql & " and (soog='ofi' and prefer=" & ofi & ")"
end if
sql=sql & " order by client_id "
'Response.Write sql & "<br>"
rs.open sql,conn
האם יש במה לשפר אותה?
הקוד שלך נמשך יותר מידי זמן
סימן שהוא עובר את ה-90 שניות שניתנות כברירת מחדל בשרת(אלא אם שינו את ברירת המחדל)
איך בנוי המס שלך
כך:
ישנה טבלה ראשית עם הלקוחות שלי והשדות של הפרמטרים המאפיינים אותם מסוג מספר אשר מקושרות לתת טבלאות אשר כל טבלה מפרטת את הפרמטר לדוגמא:
טבלה ראשית :
מס"ד-1
שם משפחה-כהן
שם פרטי-יוסי
גיל-2
עיר מגורים-1
מספר ילדים – 3 וכו'
דוקמא לתת טבלה: לדוגמא טבלת גיל:
מס"ד-1
פירוט-צעיר
מס"ד 2-
פירוט-בינוני
מס"ד 3-
פירוט-מבוגר.
בשאילתה שהצגתי אני שולף מהטבלה הראשית ע"פ מספר ובהצגה שלהנתוהנים אני עושה שאילתה ששולפת מהתת טבלה לפי מה שבחר המשתמש את הפירוט.
יש לכם רעיון בנושא
האם כך זה צריך להיות בנוי?????
מנסה עוד פעם
האם מישהו יודע מה לעשות.
האם מישהו יכול לומר לי
האם המס"ד נתונים מתוכנן טוב???
קובץ השליפה שלי בנוי כך:
<%
f_date=Request.Form("f_date")
t_date=Request.Form("t_date")
f_status=Request.Form("f_status")
came_from=46
'response.write logo
response.write yesuv & "<br>"
response.write children & "<br>"
set conn=server.createobject("adodb.connection")
conn.open "mercaz_meida"
set rs93=server.createobject("adodb.recordset")
set rs1=server.createobject("adodb.recordset")
set rs=server.createobject("adodb.recordset")
sql="select client_id,first_name,last_name,enter_date,id,email from settle_detail where diur=no and id=46 order by client_id "
rs.open sql,conn
%>
<html>
<head>
<title>דוח חיתוכים</title>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-1255">
</head>
<body leftmargin="0" topmargin="0" link=blue alink=blue vlink=blue>
<img src=images/logo_or.jpg align=left>
<FORM action="settle_img.asp" method=POST id=form1 name=form1>
<center><b><u><%=date%> דו"ח פנימי חתכים נכון לתאריך </u></b></center><br><br><br><br><br><br><br><br>
<p align=right dir=rtl>לידי:הרשות לפיתוח הנגב<br>
מאת:מרכז מידע נגב<br>
<br><br>
</p>
<%
if came_from<>"" then
sql93="select * from came_from where id=" & came_from
rs93.Open sql93,conn
Response.Write "צורת הגעה: " & rs93("came_from") & ",  "
rs93.Close
sql=sql & " and came_from=" & came_from
end if
Response.Write "</p><br>"
if rs.EOF and rs.BOF then
Response.Write "<br><br><b><center> לא נמצאו במערכת נתונים התואמים את חיפושך "
else
המשך
Response.Write "<table width=775 align=center border=1 bordercolor=#8DA1C8 rules=cols frame=void cellspacing=0 cellpadding=0>"
nu=1
do until rs.eof
if i=1 then
i=10
Response.Write " <tr>"
Response.Write "<td bgcolor=#8f9dc1><div align=center><strong> </strong></div></td>"
Response.Write "<td bgcolor=#8f9dc1><div align=center><strong> </strong></div></td>"
Response.Write "<td bgcolor=#8f9dc1><div align=center><strong> סיכום אחרון </strong></div></td>"
Response.Write "<td bgcolor=#8f9dc1><div align=center><strong> פרטים </strong></div></td>"
Response.Write "<td bgcolor=#8f9dc1><div align=center><strong> שם </strong></div></td>"
Response.Write "<td bgcolor=#8f9dc1><div align=center><strong> מסד </strong></div></td>"
c_num=1
Response.Write "</tr>"
n=1
client_id=0
end if
sql1="select * from kesher_settle_sikumim where client_id=" & rs("client_id") &" order by sikum_date"
'Response.Write sql1
rs1.open sql1,conn,3
if rs1.EOF and rs1.BOF then
sikum=""
sikum_date=""
else
rs1.movelast
sikum=rs1("sikum")
sikum_date=rs1("sikum_date")
end if
g=0
if f_date<>"" then
num=DateDiff("d",rs("enter_date"),f_date)
num2=DateDiff("d",rs("enter_date"),t_date)
if (num=0 or num2=0) or (num<0 and num2>0) then
g=0
else
g=1
end if
end if
if g=0 then
if client_id=rs("client_id") then
mi=1
else
client_id=rs("client_id")
if n=1 then
Response.Write "<tr bgcolor=#E6F5FF height=20 valign=middle>"
n=2
else
Response.Write "<tr bgcolor=#B1DEFF height=20 valign=middle>"
n=1
end if
Response.Write "<td align=center>"
if rs("email")<>"" then
Response.Write "<input type=checkbox name=s" & c_num & " value=" & rs("client_id") & ">"
else
Response.Write " "
end if
Response.Write "</td>"
if p=0 and sikum_date<>"" then
וסופו
day2=day(sikum_date)
mon2=month(sikum_date)
year2=year(sikum_date)
date2=day2 & "/" & mon2 & "/" & year2
Response.Write "<td align=center>" & date2 & "</td>"
else
Response.Write "<td align=center> </td>"
end if
Response.Write "<td align=center>"
if p=0 then
Response.Write sikum
else
Response.Write " – "
end if
Response.Write "</td>"
Response.Write "<td align=right dir=rtl><a href=javascript:detail1(" & rs("client_id") & ") >לחץ</td>"
Response.Write "<td align=right dir=rtl>" & rs("first_name") & " " & rs("last_name") & "</td>"
Response.Write "<td align=right dir=rtl>" & nu & "</td>"
c_num=c_num+1
nu=nu+1
end if
end if
rs1.close
rs.movenext
loop
response.write "<input type=hidden name=total value=" & c_num & ">"
end if
rs.close
set rs=nothing
'end if
%>
</table><br>
<center><b><u> פרטי האימייל </u></b></center><br>
<table width=450 align=center>
<tr>
<td><input name=email_subject size=30></td>
<td> <b> נושא האימייל </b></td>
</tr>
<tr>
<td><textarea name=email_body cols=25 rows=10></textarea></td>
<td> <b> גוף האימייל </b></td>
</tr>
<tr>
<td align=right><input type=checkbox name=email_attach value=yes></td>
<td> <b> אני מעוניין לצרף קובץ </b></td>
</tr>
<tr><td colspan=2 align=center><input type=submit value=" שלח "></td></tr>
</form>
</table>
</body>
</html>
<%
rs93.close
set rs93=nothing
rs1.close
set rs1=nothing
rs.close
set rs=nothing
conn.close
set conn=nothing
%>
ואנחנו אמורים לעבור על כזה קוד?
מנסה לתאר את המסד נתונים האם זו
הדרך היעילה לבנות מסד עם טבלה ראשית ותתי טבלאות אשר ישלפו הנתונים מהטבלה הראשית ע"פ פרמטרים של התתי טבלאות
ישנה טבלה ראשית עם הלקוחות שלי והשדות של הפרמטרים המאפיינים אותם מסוג מספר אשר מקושרות לתת טבלאות אשר כל טבלה מפרטת את הפרמטר לדוגמא:
טבלה ראשית :
מס"ד-1
שם משפחה-כהן
שם פרטי-יוסי
גיל-2
עיר מגורים-1
מספר ילדים – 3 וכו'
דוקמא לתת טבלה: לדוגמא טבלת גיל:
מס"ד-1
פירוט-צעיר
מס"ד 2-
פירוט-בינוני
מס"ד 3-
פירוט-מבוגר.
בשאילתה שהצגתי אני שולף מהטבלה הראשית ע"פ מספר ובהצגה שלהנתוהנים אני עושה שאילתה ששולפת מהתת טבלה לפי מה שבחר המשתמש את הפירוט.
האם עבודה בשיטת GetRows
ייעל את העבודה על המסד נתונים ויריץ את התוצאות של החיפוש יותר מהר???
תלוי
בעיקרון השיטה הזו מקלה על הבסיס נתונים בכך שהיא סוגרת את החיבור לבסיס נתונים יותר מהר.
אם אתה מכניס את הנתונין לצד לקוח ברור שזה היה יותר איטי ביגלל שאז העומס הוא על הלקוח.
אבל אני בכל זאות לא שם לב להבדלים.
הביצוע בצד לקוח הוא יותר מהיר
לפי השגיאה אתה יכול..
לפי השגיאה אתה יכול לשנות את המאפיין Server.ScriptTimeout למספר השניות של הטיים אאוט שאתה רוצה.. תעלה את המספר הזה וזה יפתר אולי.
אבל בכל זאת אם זה עובר את הברירת מחדל זה כנראה איטי מאוד.
אתה יכול לנסות לפצל את זה לשני עמודים ולעשות בעמוד הראשון הפנייה לעמוד השני.
דיברתי עם החברה שהאתר יושב אצלה
והם אמרו לי שהם אינם מוכנים להעלות את זמן ה- Server.ScriptTimeout
ולכן אני חייב למצוא רעיון לספק את השליפה יותר מהר.
אתה יכול להגדיר אותו בעצמך, בעמוד
כך:
Server.ScriptTimeout = 150
כתוב זאת בתחילת העמוד.
המספר מציין את השניות שייקח מקסימום לעמוד להיטען.
זה לא תלוי בבכל השרת ???
והתשובה היא:
לא
תודה רבה לכל העוזרים הפתרון הוא זמני ואני צריך למצוא איך ליעל את הקוד כדי שיעבוד יותר מהר.
ל-IIS בשרת יש את ההגדרה שלו
שהגדרת ברירת המחדל היא 90 שניות.
ניתן לשנות ולהתאים את ההגדרה לעמודים הרצויים לך אך ההגדרה של ה-IIS היא כללית.
אתה יכול להציג את הקוד הרלוונטי
ונראה מה ניתן לייעל בו?
הצגתי את הקוד באמצע ההודעה
תסתכל למעלה ותודה על הנכונות הרבה
ביקשתי את הקוד הרלוונטי ולא את כל
העמוד שלך.
קרא
.רק כך אוכל לעזור לך.