הפתעות בבדיקת יעילות של שאילתות

05/11/2014

אין תגובות

נתונות שתי טבלאות, למשל אלו:

Select * Into #T_Messages From sys.messages;

Alter Table #T_Messages Add Constraint PK_#T_Messages Primary Key Clustered (message_id,language_id);

Go

 

Select * Into #T_Languages From sys.syslanguages;

Alter Table #T_Languages Add Constraint PK_#T_Languages Primary Key Clustered (lcid);

Go

ואני רוצה לבדוק את היעילות של שאילתת ה-Left Join הבאה – כמה זמן הריצה נמשכת, כמה Pages נקראים, אולי השוואה לשאילתה דומה שכתובה קצת אחרת וכו’:

Select    *

From    #T_Messages M

Left Join #T_Languages L

        On M.language_id=L.lcid;

מכיוון שמדובר בשליפה של מאות אלפי שורות – יש לברר מי צריך את כל זה: מישהו מתכוון לעיין בכובד ראש בכל שורה ושורה? בוודאי שלא. אם כך מדוע לא לשלוף רק 20 שורות יצוגיות ולהתרשם מהן, או להפוך לשאילתת Group By שתיתן את הסיכומים בהם מעוניינים.. במקרה שלנו התברר שהנתונים (לא הנ”ל אלא של הטבלאות האמיתיות) נשלפו לאקסל ומנותחים באמצעות תוספי ה-Power למיניהם שהופכים כל עמדה לשרת BI.
אני כמובן אינני זקוק להם לצורך בדיקת הביצועים- זה מעמיס על הרשת, וזמן הריצה הממושך מלמד פחות על יעילות השליפה ויותר על מגבלות התעבורה ברשת והטעינה לצג, ולכן אני בודק את היעילות של ה-Select Count (במקום * Select) כדי להתמקד בשליפה עצמה:

Select    Count(*)

From    #T_Messages M

Left Join #T_Languages L

        On M.language_id=L.lcid;

image

מעשה שטן: לאן נעלמה טבלה T_Languages? ב-Execution Plan רואים רק את T_Messages..
מתברר שהמערכת מספיק מתוחכמת כדי להבין שבגלל שפסוקית ה-On משתמשת בעמודה lcid שהיא המפתח ראשי של T_Languages – לא צפויות הכפלות של שורות, ובגלל שמדובר ב-Left Join לא צפויות העלמויות של שורות, ולכן מספיק לבצע Count על T_Messages..
יפה מאוד, אך כתוצאה מכך אינני מצליח לבדוק את ביצועי ה-Left Join.. הפתרון הוא לבצע Count על אחת מעמודות T_Languages, מה שיחייב את המערכת לבצע את ה-Left Join בין שתיהן:

Select    Count(L.lcid)

From    #T_Messages M

Left Join #T_Languages L

        On M.language_id=L.lcid;

image

הספירה כעת היא של מספר השורות בהן lcid אינו Null, ולשם כך יש לבצע Join ולבדוק לכמה שורות יש התאמה ב-T_Laguages.
כעת הכל בא על מקומו בשלום, ה-Left Join מתבצע כמבוקש, ואפשר לבדוק באופן אמין את ביצועי השרת.

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *