SP או שאילתא רגילה? (באקסס)

SP או שאילתא רגילה? (באקסס)

הרצתי את השאילתא הבאה בתור SP במסד NorthWind:
PARAMETERS p_RequiredDate DateTime; SELECT [Order Details].OrderID, [Order Details].ProductID, [Order Details].UnitPrice, Orders.CustomerID, Orders.EmployeeID, Orders.ShipCity FROM Orders INNER JOIN [Order Details] ON Orders.OrderID = [Order Details].OrderID WHERE (((Orders.RequiredDate)>[p_RequiredDate]));​
ואת אותה שאילתא (בלי שורת ה-PARAMETERS) כ-SQL רגיל כאשר במקום הפרמטר הכנסתי ערך (#03-Oct-94#) בהרצה אחת של השאילתא + לקיחת הרשומות שחוזרות והצבתן בתוך משתנה ע"י getString קיבלתי תוצאות זהות בשתי ההרצות: 140 מילי שניות עם סטייה של 10 מילי שניות בהרצות חוזרות (ריענון הדף). האם הבדיקה שלי אמינה ?(אני סבור שכן אבל לא בטוח) מי שרוצה את הבדיקה+המסד שישלח לי מסר עם המייל שלו, כי הקובץ קצת גדול עבור תפוז (430 KB). (להפוך את הקובץ המצורף ל-ZIP)
 
בדיקה חוזרת

של הרצת השאילתות בלופ של 1000 פעמים:
Regular Query: 4467ms, 4436ms, 4487ms SP: 7301ms, 6689ms, 7140ms​
(שמתי לולאה של 1000 איטרציות על השורה של הרצת השאילתא והחזרת ה-RS). אם הבדיקה שלי אמינה - כדאי להתרחק מהSP באקסס.
 

Yoava333

New member
SP הוא לא טוב בכלל לא רק ב-ACCSES

http://weblogs.asp.net/fbouma/archive/2003/11/18/38178.aspx​
 

Yoava333

New member
אתה מוכן להראות test case

כי אצלי היחס הזה הוא לטובת ה-SQL...
 

אוריקס

New member
אין מה להראות, הפעלה פשוטה

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

הפעלתי שאילתא(במתכונת של SP | סתם שאילתא רגילה) שמחזירה הרבה מאוד רשומות (בסביבות ה-2000 - לא סתם הלכתי ל-Northwind) והרצתי אותה 1000 פעמים. איפה הטעות ?
 

אוריקס

New member
2 דברים:

ממבט *מאד* מהיר על הקוד שלך: 1. הקוד שלך מסובך מידי ואתה לא משווה בדיוק אחד לאחד. עזוב את כל ה DAL שאתה בונה סביב כל זה, הוא מיותר לחלוטין. תשווה אחד לאחד. 2. אתה לא יוצר אובייקט RS אלא פותח אותו באמצעות ה CONN שזאת למעשה הדרך הכי יקרה. מה שאתה עושה זה כמו להשוות מי יותר מהיר סוס או כלב אבל לכלב יש ניוון שרירים. תשווה אחד לאחד כבר אמרתי
 

Yoava333

New member
אוריקס זאת הבדיקה שלי:

SQL: 1266ms SP: 1437ms var objConn = Server.CreateObject("ADODB.connection"); objConn.Open("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA SOURCE="+Server.MapPath(sDB)); var d = new Date().getTime(); for (var i=0;i<500;i++) objConn.Execute("select * from articale where section_Id = '8'"); Response.Write("SQL: "+(new Date().getTime()-d)+"ms<br/>"); delete d; var d = new Date().getTime(); for (var i=0;i<500;i++) objConn.Execute("Execute SP 8"); Response.Write("SP: "+(new Date().getTime()-d)+"ms<br/>"); objConn.Close(); objConn = null; delete objConn;​
 

אוריקס

New member
כמה הערות לשניכם

1. אף אחד לא דיבר על פרמטרים. כזה מגיע לפרמטרים ידוע שאקסס לא מטפל בהם טוב. למרות זאת, היחס הוא לא כמו שאתה תארתם. בבדיקות שלכם אתם מפעילים את *אותה שאילתה בדיוק* שוב ושוב. אף אחד לא הבטיח לכם שהנתונים כבר לא שוכבים איפשהו ומחכים שתאחזרו אותם, כנ"ל לגבי ה query plan, ומכאן הקושי לבדוק את זה בצורה מדוייקת. בלי הפרמטר אקסס מריץ את ה SP יותר מהר, עם פרמט ההבדלים מזעריים (ראו תמונה מצורפת). הקריאות מתבצעות כך:
sql+="SELECT TOP 200 * FROM tbl WHERE id Not In (1,2,3) OR id =" + Math.round(Math.random()*1000) + ";"; ו sql+="EXECUTE MySpWithParams @iID=" + Math.round(Math.random()*1000);​
2. ב SP לא משתמשים רק מסיבות של מהירות אלא גם מסיבות של אבטחה (יש עוד סיבות אבל באקסס זה בעיקר אבטחה). ניר, אתה יכול להשאר עם SQL דינמי אם אתה רוצה, רק קח בחשבון שמישהו מיומן יוכל לעשות לך מה שהוא רוצה בנתונים (אלא אם כן אתה מתחיל להחליף תווים ואז זה יהיה הרבה יותר איטי משימוש ב SP, שלא לדבר על אי שמירה על שלמות הנתונים). 3. בדוט נט יש אופציה לכתוב שאילתת פרמטר ולהפעיל אותה בלי שהיא תיהיה SP במסד. אני מניח שזה קיים גם ב ASP, אבל לא ממש ניסיתי את זה אף פעם, אתם מוזמנים לנסות ולהשוות מהירות. בכל מקרה, במקומכם לא הייתי עוזב את ה SP כ"כ מהר.
 
../images/Emo13.gif

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

אוריקס

New member
תשובות

(אני חי הפוך בזמן האחרון, אני אני מנסה לתקן את זה עקב אירוע חשוב ביום שני. זה אומר שעכשיו אני כותב לך אחרי שינה קצרה שהתחילה ב 8 בבוקר). 1. נכון, אבל לא רק. יש SP שמשמשים יותר כ VIEWS. 2. אתה צריך SP + Command גם ככה מסיבות של אבטחה, אין דרך אחרת חוץ מסינונים קפדניים ואיטיים.
 
אגב, שלמות הנתונים...

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

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