שימוש באינדקסים

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

אם לא - נבנה אותם. צריכים לזכור שעודף האינדקסים טומן בתוכו בעיות:

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

הדבר היחיד שאנחנו יכולים לומר במידה רבה של ודאות - מפתחות זרים, ושדה בהם הטבלות מחוברים, חובה לאנדקס.

פקודה EXPLAIN ANALYZE

פקודה EXPLAIN  [שאילתה] מראה כיצד PostgreSQL הולך לבצע את בקשתך.

פקודה EXPLAIN ANALYZE [בקשה] מבצע את השאילתה ומציגה גם את התכנית המקורית, וגם את תהליך בפועל של יישומו.

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

  • שימוש בסריקה מלאה של הטבלה (seq scan)

  • שימוש בדרך הפרימיטיבית ביותר של חיבור בין טבלאות (nested loop)

לEXPLAIN ANALYZE:

האם אין הבדלים גדולים במספר המוערך של רשומות ושנבחרו בפועל?

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

חייבים לציין שסריקה מלאה של הטבלה לא תמיד איטית בהשוואה לסריקת אינדקסים.

אם, למשל, בטבלה יש כמה מאות רשומות אשר נמצאות בבלוק אחד או שניים בדיסק, אז שימוש באינדקס ייא לקריאה מיותרת של בלוקים נוספים עבור אינדקסים. אם בשאילתה נצטרך לבחור 80% מהרשומות של הטבלה הגדולה, אז הסריקה המלאה שוב תהיה מהירה יותר.

כאשר בוחנים שאילתות עם EXPLAIN ANALYZE אפשר להשתמש בהגדרות המונעות ממתכנן השאילתות להשתמש בתכניות ביצוע ספציפיות. לדוגמה:

SET enable_seqscan=false;

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

 

בשום מקרה לא לקבוע את ההגדרות אלה ב postgresql.conf!

זה יכול לזרז את ביצוע של שאילתות בודדות, אך יפגע מאד בביצועים של כל השאר!