ראשי > SQL Server, פיתוח > איך לדפדף עם SQL Server 2011

איך לדפדף עם SQL Server 2011

ב- SQL Server 2011 ישנה אופציה חביבה המפשטת מאד את פעולת ההבאה של קבוצת נתונים (או דף) מתוך כלל תוצאותיה של שאילתא. מדובר בביטוי חדש בשם OFFSET הבא כתוספת לאחר ביטוי Order by והמבנה שלו הוא זה:

 

<offset_fetch> ::=

{

OFFSET { integer_constant | offset_row_count_expression } { ROW | ROWS }

[

FETCH { FIRST | NEXT } {integer_constant | fetch_row_count_expression }

{ ROW | ROWS } ONLY

]

}

לדוגמה: נניח שאנו מחלקים את תוצאות השאילתה לדפים בגודל 10 שורות כ"א. אם נרצה לשלוף את הדף השני נבצע משהו כזה:

select *

from Production.Product

order by name asc

offset 10 rows

fetch first 10 rows only

 בדוגמה שלפנו מטבלת המוצרים את 10 המוצרים שבדף השני (מיון לפי שם המוצר), כלומר המוצרים במיקום 11 עד 20 ע"פ המיון שנבחר.

אין ספק שזה נוח להפליא. השאלה היא: האם SQL Server חכם מספיק כדי לשלוף את הדף הרצוי בצורה המהירה ביותר?

התשובה: שיחקתי עם זה קצת ובחנתי את ה-execution plans, ואכן ה-SQL Server יודע לשנות את ה-plan לפי ה-offset ולפי כמות הנתונים המבוקשת:

  • מספר הקריאות הלוגיות הוא אופטימלי (נשלפים רק הנתונים הדרושים).
  • נבחרים האינדקסים המתאימים לפי המיון. כלומר – אם יש אינדקס על שדה המיון (בדוגמה זה השדה name), אזי הנתונים עשויים להישלף בעזרת האינדקס (תלוי כמה נתונים אנו שולפים).

 

הפיצ'ר הזה לדעתי הוא פיצ'ר שישפר את הביצועים באופן אמיתי כשמדובר בשליפת "דפים" כשמשווים אותו לכל צורת דפדוף אחרת (לרוב בשימוש עם row_number() ועם שאילתא בתוך שאילתא).

אין ספק שזו תוספת נחמדה ומקורית (אני לא מכיר כזה פיצ'ר באורקל).


מודעות פרסומת
  1. 16/02/2011 בשעה 19:51

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

    • 16/02/2011 בשעה 22:15

      אשמח אם תשלח לי לינק להסתייגויות ולבעיות לגבי הפיצ'ר הזה. ישנם המון אנשים שבוחנים את המוצר ובטוח שהם עושים את זה באופן יסודי בהרבה ממני וגם מוצאים בו כל מיני "עיזים". צריך גם לזכור שהמוצר ב-CTP (שזה אומר גרסת ביתא) ויש באגים ודברים שלא עובדים (ורשימה של known issues).
      אף פעם לא הבנתי למה מיקרוסופט אוהבת את המונח הזה "Community Technology Preview". למה לא לקרוא לזה פשוט beta? נו טוף…. שיהיה.

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

  1. No trackbacks yet.

כתיבת תגובה

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

הלוגו של WordPress.com

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

תמונת Twitter

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

תמונת Facebook

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

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

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

מתחבר ל-%s

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