הנתונים הסטטיסטיים של השאילתות הפעילות הכי ישנות

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

‫Spanner מספק טבלה מובנית,SPANNER_SYS.OLDEST_ACTIVE_QUERIES, שמציגה את השאילתות שפועלות, כולל שאילתות שמכילות הצהרות DML, ממוינות לפי זמן התחלה, בסדר עולה. היא לא כוללת שאילתות של שינוי הסטרימינג.

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

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

גישה לנתונים סטטיסטיים של שאילתות פעילות ישנות

הנתונים של SPANNER_SYS זמינים רק דרך ממשקי SQL, למשל:

‫Spanner לא תומך ב-SPANNER_SYS בשיטות הקריאה הבאות:

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

OLDEST_ACTIVE_QUERIES נתונים סטטיסטיים

SPANNER_SYS.OLDEST_ACTIVE_QUERIES מחזירה רשימה של שאילתות פעילות שממוינות לפי שעת ההתחלה. אם יש הרבה שאילתות שפועלות, יכול להיות שהתוצאות יוגבלו לחלק מהשאילתות הכוללות בגלל מגבלות הזיכרון ש-Spanner אוכף על איסוף הנתונים האלה. כדי לראות נתונים סטטיסטיים של סיכום לכל השאילתות הפעילות, אפשר לעיין במאמר ACTIVE_QUERIES_SUMMARY.

סכמה של טבלת הנתונים הסטטיסטיים של כל השאילתות הפעילות הכי ישנות

שם העמודה סוג תיאור
START_TIME TIMESTAMP שעת ההתחלה של השאילתה.
TEXT_FINGERPRINT INT64 טביעת האצבע היא גיבוב של תג הבקשה, או אם אין תג, גיבוב של טקסט השאילתה.
TEXT STRING הטקסט של הצהרת השאילתה.
TEXT_TRUNCATED BOOL אם הטקסט של השאילתה בשדה TEXT נחתך, הערך הזה הוא TRUE. אם טקסט השאילתה לא נחתך, הערך הוא FALSE.
SESSION_ID STRING המזהה של הסשן שבו מתבצעת השאילתה.
QUERY_ID STRING המזהה של השאילתה. אפשר להשתמש במזהה הזה עם CALL cancel_query(query_id) כדי לבטל את השאילתה.
CLIENT_IP_ADDRESS STRING כתובת ה-IP של הלקוח שביקש את השאילתה. לפעמים, כתובת ה-IP של הלקוח עשויה להיות מצונזרת. כתובת ה-IP שמוצגת כאן עקבית עם יומני הביקורת, והיא עומדת באותן הנחיות לצנזורה. מידע נוסף זמין במאמר בנושא כתובת ה-IP של המתקשר ביומני ביקורת. מומלץ לבקש את כתובת ה-IP של הלקוח רק כשצריך אותה, כי בקשות לכתובות IP של לקוחות עלולות לגרום לזמן אחזור נוסף.
API_CLIENT_HEADER STRING הכותרת api_client מהלקוח.
USER_AGENT_HEADER STRING הכותרת user_agent ש-Spanner קיבל מהלקוח.
SERVER_REGION STRING האזור שבו שרת הבסיס של Spanner מעבד את השאילתה. מידע נוסף זמין במאמר משך החיים של שאילתה.
PRIORITY STRING העדיפות של השאילתה. כדי לראות את העדיפויות הזמינות, אפשר לעיין ב-RequestOptions.
TRANSACTION_TYPE STRING סוג העסקה של השאילתה. הערכים האפשריים הם READ_ONLY, READ_WRITE ו-NONE.

שאילתות לדוגמה

אפשר להריץ את ההוראות הבאות של SQL באמצעות ספריות הלקוח,‏ Google Cloud CLI או מסוףGoogle Cloud .

רשימה של שאילתות פעילות ישנות

השאילתה הבאה מחזירה רשימה של השאילתות הכי ישנות שפועלות, ממוינות לפי שעת ההתחלה של השאילתה.

SELECT start_time,
       text_fingerprint,
       text,
       text_truncated,
       session_id,
       query_id,
       api_client_header,
       server_region,
       priority,
       transaction_type
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC;
פלט השאילתה

בטבלה הבאה מוצג הפלט של הרצת השאילתה שצוינה למעלה:

start_time text_fingerprint טקסט text_truncated session_id query_id api_client_header server_region עדיפות transaction_type
2025-05-20T03:29:54.287255Z -3426560921851907385 SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId as b_id, b.AlbumId as b_albumid, b.TrackId as b_trackId FROM Songs as a CROSS JOIN Songs as b; לא נכון AG46FS6K3adF 9023439241169932454 gl-go/1.25.0-20250216-RC00 gccl/1.73.0 gapic/1.73.0 gax/2.14.1 grpc/1.69.2 us-central1 PRIORITY_HIGH READ_ONLY
2025-05-20T03:31:52.40808Z 1688332608621812214 SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Songs as a JOIN Singers as s ON s.SingerId = a.SingerId WHERE STARTS_WITH(s.FirstName, 'FirstName') LIMIT 1000000; לא נכון AG46FS6paJPKDOb 2729381896189388167 gl-go/1.25.0-20250216-RC00 gccl/1.73.0 gapic/1.73.0 gax/2.14.1 grpc/1.69.2 us-central1 PRIORITY_HIGH READ_WRITE
2025-05-20T03:31:52.591212Z 6561582859583559006 ‪SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Songs as a JOIN Singers as s ON s.SingerId = a.SingerId WHERE a.SingerId > 10 LIMIT 1000000; לא נכון AG46FS7Pb_9H6J6p 9125776389780080794 gl-go/1.25.0-20250216-RC00 gccl/1.73.0 gapic/1.73.0 gax/2.14.1 grpc/1.69.2 us-central1 PRIORITY_LOW READ_ONLY

הצגת 2 השאילתות הכי ישנות שפועלות

הדוגמה הזו היא וריאציה קלה של השאילתה הקודמת. היא מחזירה את 2 השאילתות הכי ישנות שפועלות, ממוינות לפי שעת ההתחלה של השאילתה.

SELECT start_time,
       text_fingerprint,
       text,
       text_truncated,
       session_id
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC LIMIT 2;
פלט השאילתה

בטבלה הבאה מוצג הפלט של הרצת השאילתה שצוינה למעלה:

start_time text_fingerprint טקסט text_truncated session_id
2039-07-18T07:52:28.225877Z -3426560921851907385 SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId as b_id, b.AlbumId as b_albumid, b.TrackId as b_trackId FROM Songs as a CROSS JOIN Songs as b; לא נכון ACjbPvYsuRt
2039-07-18T07:54:08.622081Z -9206690983832919848 SELECT a.SingerId, a.AlbumId, a.TrackId, a.SongName, s.FirstName, s.LastName FROM Songs as a JOIN Singers as s ON s.SingerId = a.SingerId WHERE STARTS_WITH(s.FirstName, 'FirstName') LIMIT 1000000; לא נכון ACjbPvaF3yK

ACTIVE_QUERIES_SUMMARY

SPANNER_SYS.ACTIVE_QUERIES_SUMMARY בטבלת הנתונים הסטטיסטיים מוצגים נתונים סטטיסטיים מסכמים של כל השאילתות הפעילות. השאילתות מקובצות לדליים הבאים:

  • נתונים שנאספו לפני יותר משנייה
  • יותר מ-10 שניות
  • יותר מ-100 שניות

סכמת טבלאות ל-ACTIVE_QUERIES_SUMMARY

שם העמודה סוג תיאור
ACTIVE_COUNT INT64 המספר הכולל של השאילתות שמופעלות.
OLDEST_START_TIME TIMESTAMP גבול עליון של שעת ההתחלה של השאילתה הכי ישנה שפועלת.
COUNT_OLDER_THAN_1S INT64 מספר השאילתות שהן בנות יותר משנייה.
COUNT_OLDER_THAN_10S INT64 מספר השאילתות שהן בנות יותר מ-10 שניות.
COUNT_OLDER_THAN_100S INT64 מספר השאילתות שהן בנות יותר מ-100 שניות.

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

שאילתות לדוגמה

אפשר להריץ את הצהרות ה-SQL הבאות באמצעות ספריות הלקוח, gcloud spanner או מסוףGoogle Cloud .

אחזור סיכום של שאילתות פעילות

השאילתה הבאה מחזירה את נתוני הסיכום לגבי שאילתות שפועלות.

SELECT active_count,
       oldest_start_time,
       count_older_than_1s,
       count_older_than_10s,
       count_older_than_100s
FROM spanner_sys.active_queries_summary;
פלט השאילתה
active_count oldest_start_time count_older_than_1s count_older_than_10s count_older_than_100s
22 2039-07-18T07:52:28.225877Z 21 21 1

מגבלות

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

  • שאילתות DML‏ (UPDATE, ‏ INSERT, ‏ DELETE) לא נכללות אם הן בשלב Apply mutations.

  • שאילתה לא נכללת אם היא באמצע הפעלה מחדש בגלל שגיאה זמנית.

  • השאילתות משרתים עמוסים או לא מגיבים לא נכללות.

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

  • אם העמודה CLIENT_IP_ADDRESS מחזירה מחרוזת <error>, המשמעות היא שיש בעיה זמנית שלא אמורה להשפיע על שאר השאילתה. מנסים שוב להריץ את השאילתה כדי לאחזר את כתובת ה-IP של הלקוח.

שימוש בנתונים של שאילתות פעילות כדי לפתור בעיות שקשורות לניצול גבוה של CPU

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

  • כמה שאילתות פועלות כרגע?
  • מהן השאילתות האלה?
  • כמה שאילתות פועלות במשך זמן רב, כלומר יותר מ-100 שניות?
  • באיזה סשן מורצת השאילתה?

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

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

במדריך הזה נבדוק את השאילתות הפעילות שלנו ונקבע איזו פעולה צריך לבצע, אם בכלל.

אחזור סיכום של שאילתות פעילות

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

SELECT active_count,
       oldest_start_time,
       count_older_than_1s,
       count_older_than_10s,
       count_older_than_100s
FROM spanner_sys.active_queries_summary;

השאילתה מניבה את התוצאות הבאות.

active_count oldest_start_time count_older_than_1s count_older_than_10s count_older_than_100s
22 2039-07-18T07:52:28.225877Z 21 21 1

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

אחזור רשימה של שאילתות פעילות

בשלב הקודם קבענו שיש שאילתה שפועלת כבר יותר מ-100 שניות.כדי לבדוק את הנושא לעומק, אנחנו מריצים את השאילתה הבאה כדי לקבל מידע נוסף על 5 השאילתות הכי ישנות שפועלות.

SELECT start_time,
       text_fingerprint,
       text,
       text_truncated,
       session_id,
       query_id
FROM spanner_sys.oldest_active_queries
ORDER BY start_time ASC LIMIT 5;

בדוגמה הזו, הפעלנו את השאילתה ב-28 במרץ 2024 בערך בשעה 16:44:09 (שעון החוף המזרחי) והיא החזירה את התוצאות הבאות. (יכול להיות שתצטרכו לגלול אופקית כדי לראות את הפלט כולו).

start_time text_fingerprint טקסט text_truncated session_id query_id
2024-03-28 16:44:09.356939+00:00 -2833175298673875968 select * from spanner_sys.oldest_active_queries FALSE ACjbPvYsucrtcffHrRK6aObeIjZf12tSUwOsim-g1WC3IhqF4epzICCQR3GCHw 37190103859320827
2039-07-18T07:52:28.225877Z -3426560921851907385 SELECT a.SingerId, a.AlbumId, a.TrackId, b.SingerId as b_id, b.AlbumId as b_albumid, b.TrackId as b_trackId FROM Songs as a CROSS JOIN Songs as b; FALSE ACjbPvaF3yKiNfxXFod2LPoFaXjKR759Bw1o34206vv0t7eOrD3wxZhu8U6ohQ 48946620525959556

השאילתה הכי ישנה (טביעת אצבע = -2833175298673875968) מודגשת בטבלה. זהו CROSS JOIN יקר. אנחנו מחליטים לנקוט פעולה.

ביטול שאילתה יקרה

בדוגמה הזו, מצאנו שאילתה שמריצה פעולה יקרה CROSS JOIN ולכן החלטנו לבטל את השאילתה. תוצאות השאילתה שקיבלנו בשלב הקודם כללו query_id. כדי לבטל את השאילתה, אפשר להריץ את הפקודה הבאה של GoogleSQL או את הפקודה הבאה של PostgreSQL.CALL cancel_query(query_id)spanner.cancel_query(query_id)

GoogleSQL

CALL cancel_query(query_id)

PostgreSQL

CALL spanner.cancel_query(query_id)

לדוגמה, בהמשך, ההצהרה CALL מבטלת שאילתה עם המזהה 37190103859320827:

CALL cancel_query('37190103859320827')

כדי לוודא שהשאילתה בוטלה, צריך להריץ שאילתה בטבלה spanner_sys.oldest_active_queries.

במדריך הזה מוסבר איך להשתמש ב-SPANNER_SYS.OLDEST_ACTIVE_QUERIES וב-SPANNER_SYS.ACTIVE_QUERIES_SUMMARY כדי לנתח את השאילתות הפעילות שלנו ולבצע פעולה אם יש צורך בשאילתות שגורמות לשימוש גבוה ביחידת העיבוד המרכזית (CPU). כמובן שתמיד עדיף להימנע מפעולות יקרות ולתכנן את הסכימה המתאימה לתרחישי השימוש שלכם. מידע נוסף על בניית הצהרות SQL שפועלות ביעילות זמין במאמר שיטות מומלצות ל-SQL.

המאמרים הבאים