משיב מוביל
סדר רשומות ב-SELECT

שאלה
-
היי.
שאלה מעניינת: יש לי פונקציה שמקבלת טקסט של מספרים מופרדים בפסיקים ומחזירה טבלה עם עמודת ID מסוג Int של המספרים.
והנה 2 הרצות שלה:
select ID from dbo.udf_NumList2table ('124,126,132,180,176') select RP.ID, My.ID from dbo.udf_NumList2table ('124,126,132,180,176') RP join MyTable My on RP.ID=My.ID
בהרצה הראשונה, סדר התוצאות הוא לפי סדר המספרים ב-string. בהרצה השניה סדר המספרים הוא סדר עולה (176 'עוקף' את 180).
למה?
ההשערה שלי היא שבגלל שבטבלת MyTable עמודת ID היא PK, שכדי לעשות Index seek ה-SQL מעדיף לרוץ לפי הסדר של המפתח.
אשמח אם תאמתו או שתסתרו, מה שנכון.
itaigitt, http://copypastenet.blogspot.com
תשובות
-
ההנחה שלך נכונה.
טבלה ללא קלאסטר אינדקס (היפ) אם תבצע עליה שאילתא תחזיר לך את הנתונים לפי סדר כניסתם לטבלה.
ברגע שיש קלאסטר אינדקס, הנתונים יחזרו לפי הסדר של האינדקס גם אם לא בקשת מיון כלשהו.
במקרה שלך, אפילו אם המפתח הראשי הוא לא קלאסטר, עדיין, זהו השדה היחידי שביקשת מהטבלה הזו בשאילתה וכמובן שהוא ממויין.
-
ההנחה של קלם שם בפורום היא בדיוק מה שכתבתי כאן. זה גם מה שאני יודע
בלי order by אתה לא יכול להיות בטוח אבל ברירת המחדל היא לחזור לפי הסדר בו הנתונים נשמרים בפועל בדרך כלל (clustered index יוצר את הסדר של הרשומות בפועל ולכן זה חלק מהתשובה שלי). אם אין clustered אחר ויש מפתח ראשי הוא יצר את הפעולה.
* תוספת: אם מי שאחראי על מוצר אומר שהמוצר אינו 100% בפעולה מסויימת אז גם אם לא יצא לי לראות את זה ולזכרוני תמיד יצא לי שהנתונים חזרו לפי הסדר בפועל שהם נמצאים הרי שאני אקבל את מה שהוצג לי ולא אקח את זה כמובן מאליו :-) זו התאוריה שאני מכיר בנושא זה.
- נערך על-ידי pituachMVP, Moderator יום שלישי 26 פברואר 2013 11:23
- סומן כתשובה על-ידי itaigitt יום שלישי 26 פברואר 2013 11:56
כל התגובות
-
ההנחה שלך נכונה.
טבלה ללא קלאסטר אינדקס (היפ) אם תבצע עליה שאילתא תחזיר לך את הנתונים לפי סדר כניסתם לטבלה.
ברגע שיש קלאסטר אינדקס, הנתונים יחזרו לפי הסדר של האינדקס גם אם לא בקשת מיון כלשהו.
במקרה שלך, אפילו אם המפתח הראשי הוא לא קלאסטר, עדיין, זהו השדה היחידי שביקשת מהטבלה הזו בשאילתה וכמובן שהוא ממויין.
-
אהלן איתי
אתה מבקש שננחש מה קורה בפונקציה שאין לנו אותה? כיצד נוכל לשער או לנחש מה עושה הפונקציה ולמה היא מחזירה ערך כזה או אחר בסדר כזה או אחר?!?
הערה: נשמע שאתה עושה שימוש בפונקציה SPLIT. מאוד מומלץ לעבוד עם CLR עבור SPLIT.
הערה: בעקרון כאשר אין order by אז סדר רשומות חוזר הוא לפי הסדר בהן הרשומות נשמרות בפועל ב page-ים או בזכרון במקרה של טבלה זמנית (עם זה אין לכך התחייבות והן יכולות להגיע בכל סדר שהוא כתלות בגורמים נוספים כון אינדקסים, דפרגמנטציה ועוד)
-
-
היי.
רונן - אני לא מבקש שתגידו לי מה קורה בפונקציה, כי מה שקורה בתוכה לא רלוונטי. ה-JOIN לטבלה שרשמתי את פרטיה הוא המוקש.
לגבי ההנחה שלי - בפורומים אחר רשמו לי שכל עוד אין order by אז הסדר ייקבע רק בריצה לפי מה שנראה ל-SQL, ולא בטוח שההנחה היא נכונה. מה דעתכם?
http://social.technet.microsoft.com/Forums/en-US/transactsql/thread/f0374df5-3a70-4dcc-baab-0e6ecf9383e8
http://stackoverflow.com/questions/15085359/result-order-of-a-select
itaigitt, http://copypastenet.blogspot.com
-
ההנחה של קלם שם בפורום היא בדיוק מה שכתבתי כאן. זה גם מה שאני יודע
בלי order by אתה לא יכול להיות בטוח אבל ברירת המחדל היא לחזור לפי הסדר בו הנתונים נשמרים בפועל בדרך כלל (clustered index יוצר את הסדר של הרשומות בפועל ולכן זה חלק מהתשובה שלי). אם אין clustered אחר ויש מפתח ראשי הוא יצר את הפעולה.
* תוספת: אם מי שאחראי על מוצר אומר שהמוצר אינו 100% בפעולה מסויימת אז גם אם לא יצא לי לראות את זה ולזכרוני תמיד יצא לי שהנתונים חזרו לפי הסדר בפועל שהם נמצאים הרי שאני אקבל את מה שהוצג לי ולא אקח את זה כמובן מאליו :-) זו התאוריה שאני מכיר בנושא זה.
- נערך על-ידי pituachMVP, Moderator יום שלישי 26 פברואר 2013 11:23
- סומן כתשובה על-ידי itaigitt יום שלישי 26 פברואר 2013 11:56
-