הבלוג של גרי רשף

22/11/2010

הצגת "דפים" מתוך טבלה – מחידושי Denali

Filed under: Uncategorized — תגיות: , , , , — גרי רשף @ 08:26

בימי SQL Server 2000 העליזים, כשהיינו צריכים להציג את שורות מספר 21-30 (למשל) מתוך הטבלה (בדרך כלל עבור אתרי אינטרנט בהם מציגים מסך של תוצאות וניתן לעבור למסך הקודם או הבא על ידי Prev ו-Next בהתאמה)- היינו שולפים את 30 השורות הראשונות, ממיינים הפוך ושולפים את 10 הראשונות (ליתר דיוק- 10 האחרונות מתוך ה-30), וזו השליפה המבוקשת:

Select Top 10 name
From    (Select Top 30 name
        From sys.objects
        Order By name) T
Order By name Desc;
Go

 

עשיתי לעצמי כאן הנחה קטנה: את התוצאה של השליפה הזו צריך למיין חזרה לפי name, ולשם כך יש להפוך את מה שכתבתי לשאילתת משנה שניתן להוסיף לה מיון..

בגרסת 2005 התווספה אופציית מספור השורות, וכעת ניתן היה לשלוף את שורות 21-30 בקלות רבה יותר ועם קוד מובן יותר:

Select  name
From    (Select Row_Number() Over (Order By name) Mispar,
                name
        From    sys.objects) T
Where   Mispar Between 21 And 30;

 

 

בהחלט שיפור בבהירות, ובנוסף- משתי רמות של קינון (בהנחה שנוסיף לשליפה הראשונה מיון עולה כנדרש)- ירדנו לרמת קינון אחת.

גרסת Denali – SQL 2011 – מביאה את בשורת ה-Offset:

Select  name
From    sys.objects
Order By name
Offset 20 Rows Fetch Next 10 Rows Only;

 

כעת אין צורך בקינון כלל, ומדובר בפתרון יעודי לבעייה ספציפית (תרגום: נדלג על 20 ונשלוף את 10 הבאות).

ומה המחיר הקמעונאי ללקוח:

clip_image002

ניתן לראות שיפור הדרגתי של כ-10% בביצועים (במקרה זה!), ולמרות שזו אינה מהפכה – זה בגדר Nice to have.

כדאי לשים לב שבשליפות הראשונה והאחרונה המערכת העדיפה לבצע Scan לאינדקס ולא לטבלה (Clustered Index) ולשלם ב-Key LookUp שכן מדובר בשליפה של חלק מהשורות, ואילו בשליפה השניה- יש צורך למספר את כל השורות ולכן מתבצע Clustered Index Scan על כל הטבלה. מה שלא הצלחתי להבין זה מדוע יש צורך ב-LookUp אם התבצע Scan על אינדקס של עמודת name (אם הוא לא על name- מדוע נבחר האינדקס הזה?).

מודעות פרסומת

6 תגובות »

  1. אז מה המסקנה? שהבשורות לא כל כך גדולות?
    אתה יודע אולי איך זה ממומש ב MYSQL ששם לדוגמא זה דבר שקיים שנים רבות, ע"י השימוש בפקודה LIMIT? (גם באוראקל?)

    תגובה של פלג — 23/11/2010 @ 10:35

  2. תראה מה קורה בדפדפוף כשקופצים למספרי עמודים גבוהים
    http://www.sqlservercentral.com/blogs/dave_ballantynes_blog/archive/2010/11/10/denali-paging_1320_is-it-win_2F00_win-_3F00_.aspx

    תגובה של פלג — 23/11/2010 @ 10:13

    • נכון, אבל בעצם למה ניתן לצפות? איך המערכת יכולה למצוא את הדף ה-200 בגודל 50 חוץ מלבצע Scan עד 9951 ומשם לשלוף את 50 הבאים?

      אני איכשהו יכול להבין שמצפים שאם אני בעמוד 199 במסך באינטרנט ולוחץ על Next לעמוד הבא – המערכת איכשהו תזכור היכן אני נמצא בטבלה ותמשיך משם ולא תספור בכל Next או Previous את השורות מההתחלה..

      תגובה של גרי רשף — 23/11/2010 @ 10:33

  3. "מה שלא הצלחתי להבין זה מדוע יש צורך ב-LookUp אם התבצע Scan על אינדקס של עמודת name "
    גרי האם ייתכן, שבאיזשהו מקום, התהליך בונה מאחורה טבלה כלשהיא על מנת לפלטר ממנה את השורות המבוקשות ומכאן הסריקה המיותרת? האם ידוע מה התהליך שקורה מאחורה שיכול לשפוך יותר אור על החיפוש המיותר (שככה הוא בעינינו אבל לא בעיניי ה SQL?)

    תגובה של פלג — 22/11/2010 @ 09:48


RSS feed for comments on this post. TrackBack URI

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

בלוג בוורדפרס.קום.

%d בלוגרים אהבו את זה: