השאילתות הפעילות הכי ישנות, שנקראות גם השאילתות שפועלות הכי הרבה זמן, היא רשימה של שאילתות שפעילות במסד הנתונים שלכם, ממוינות לפי משך הזמן שהן פועלות. התובנות לגבי השאילתות האלה יכולות לעזור לכם לזהות את הסיבות לחביון המערכת ולשימוש גבוה במעבד בזמן שהן מתרחשות.
Spanner מספק טבלה מובנית,SPANNER_SYS.OLDEST_ACTIVE_QUERIES, שמציגה את השאילתות שפועלות, כולל שאילתות שמכילות הצהרות DML, ממוינות לפי זמן התחלה, בסדר עולה. היא לא כוללת שאילתות של שינוי הסטרימינג.
אם יש הרבה שאילתות שפועלות, יכול להיות שהתוצאות יוגבלו לחלק מהשאילתות הכוללות בגלל מגבלות הזיכרון שהמערכת מטילה על איסוף הנתונים האלה. לכן, ב-Spanner יש טבלה נוספת, SPANNER_SYS.ACTIVE_QUERIES_SUMMARY, שבה מוצגים נתונים סטטיסטיים מסכמים של כל השאילתות הפעילות (חוץ משאילתות של עדכון נתונים).
אפשר לאחזר מידע משתי הטבלאות המובנות האלה באמצעות הצהרות SQL.
במסמך הזה נתאר את שתי הטבלאות, נציג כמה דוגמאות לשאילתות שמשתמשות בטבלאות האלה, ולבסוף נסביר איך להשתמש בהן כדי לצמצם בעיות שנגרמות משאילתות פעילות.
גישה לנתונים סטטיסטיים של שאילתות פעילות ישנות
הנתונים של SPANNER_SYS זמינים רק דרך ממשקי SQL, למשל:
דף Spanner Studio של מסד נתונים במסוף Google Cloud
השיטה
executeSqlאו השיטהexecuteStreamingSql
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.
המאמרים הבאים
- מידע נוסף על כלים אחרים לבדיקת תכונות
- מידע נוסף על נתונים אחרים שמאוחסנים ב-Spanner לכל מסד נתונים זמין בטבלאות של סכימת המידע של מסד הנתונים.
- מידע נוסף על שיטות מומלצות ל-SQL ב-Spanner