שימוש ב TOP ב SQL

rozeyoter

New member
שימוש ב TOP ב SQL

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

bugg

New member
TOP

אז ככה. קודם כל, כמו שאתה בטח מבין, TOP X מחזיר את X הרשומות הראשונות בשאילתה. אבל שים לב - בשאילתה, ולא בטבלה. כלומר, אם אתה ממיין את השאילתה בסדר מבויים, ומבקש TOP 4 תקבל את 4 הרשומות הראשונות מהטבלה כאשר היא מסודרת בסדר שביקשת (לפי ORDER BY). אם אתה לא משתמש במיון, אז הסדר הוא שרירותי (או לפחות סדר ההכנסה של הרשומות לטבלה). למיטב הבנתי, TOP 1 יכולה להיות נורא יעילה במקרה שאתה מסדר את הטבלה לפי אינדקס. מכיוון שאז ACCESS ניגש לאינדקס (שהוא ממויין), שולף את X הערכים הראשונים ואת הרשומות בהתאם. אבל אם אתה לא ממיין את הטבלה לפי אינדקס אין ברירה אלא לעבורעל כל הרשומות, למיין אותן בסדר שביקשת, ורק אז לשלוף את X הערכים (והרשומות) הראשונים. מה שכן, לא ממש הבנתי מה הקשר בין זה ל-INSERT...
 

rozeyoter

New member
OK אולי לא הסברתי כהלכה

עזוב את ה INSERT זה בעיה אחרת. מה שאני שואל זה ב2 מצבים. 1: כאשר בטבלא מוגדרים אינדקסים 2: כאשר בטבלא לא מוגדרים איהדקסים. בשני המקרים אני כותב משהו כמו:
select top 1 * from myLargLargTable​
כלומר אני לא מבקש סריקת אינדקסים. לא מעניין אותי מה אני מקבל כי אני בסה"כ מעוניין להוסיף רשומה (אני משתמש באובייקט DAO של VB) השאלה אם במקרה הזה מסד הנתונים יעשה משהו חוץ מלהביא לי רשומה אקראית ראשונה... במילים אחרות, האם להוסיף ORDER BY או לא... (בהנחה ששדה אחד שלי לפחות הוא אינדקס והוא ישמש לי לכך) בברכה
 

bugg

New member
זה מה שהסברתי

לא משנה אם בטבלה מוגדרים אינדקסים או לא. כשאתה שולף רשומות בלי ORDER BY, הסדר הוא שרירותי. תסלח לי אם לא הבנתי, אבל איפה נכנס ה-SELECT TOP שלך בהכנסת נתונים? איפה הוא משתלב?
 

rozeyoter

New member
בכדי להוסיף רשומה

באובייקט DAO או ADO צריך קודם ליצור קשר לטבלא משהו דומה אתה אולי מכיר משרת SQL שאתה רושם משפט SELECT שמציג לך את הרשומות ואז אתה יכול לערוך או למחוק או להוסיף. אז זה אותו דבר.
 

bugg

New member
עכשיו הבנתי אותך

אני מכיר DAO, יותר מ-ADO, אבל נדמה לי שהעקרון אמור להיות דומה. אפשר בשתי דרכים: להריץ שאילתת INSERT בעזרת Execute. או לפתוח את הטבלה בעזרת OpenRecordset. עכשיו, ההגיון אומר (לי לפחות***) שכשאתה פותח טבלה (לא שאילתה) ACCESS לא קורא את כל הרשומות. הוא פשוט יוצר קשר לטבלה, ולכן,
openrecordset("table_name")​
אמור להיות מהיר יותר אפילו מ-SELECT TOP. *** לראיה, RecordCount שהוא מאפיין של RECORDSET מחזיר את מספר הרשומות שניגשת אליהן (אם פתחת אותו ב-Dynaset או Snapshot) אבל מחזיר את מספר הרשומות בטבלה אם פתחת אותו כ-Table (ז"א אם רשמת רק שם של טבלה בארגומנט)
 
למעלה