התכונה "תובנות מתקדמות לגבי שאילתות" מאפשרת לזהות, לאבחן ולמנוע בעיות בביצועים של שאילתות במסד הנתונים של AlloyDB Omni. הוא מתעד נתוני טלמטריה של מסד הנתונים, כולל נתונים סטטיסטיים מנורמלים של שאילתות, אירועי המתנה, כתובות ה-IP של הלקוחות, תגים ועומס על המכונה, ושומר מדדים היסטוריים למשך 30 יום.
אפשר להשתמש בתובנות מתקדמות לגבי שאילתות כדי לבצע את המשימות הבאות:
- לזהות שאילתות עם חביון גבוה ושאילתות שצורכות הרבה משאבים על ידי ניתוח של זמן הביצוע, זמן הקלט/פלט, זמן ההמתנה, פעילות מאגר הנתונים הזמני המשותף ומספר השורות.
- פתרון בעיות של צווארי בקבוק על ידי התאמה בין שאילתות איטיות לבין אירועי המתנה וסוגים של אירועי המתנה.
- אפשר לעקוב אחרי ביצועי שאילתות לרכיבי אפליקציה ספציפיים על ידי תיוג שאילתות במטא-נתונים של SQLCommenter.
- מעקב אחרי שאילתות פעילות ועסקאות פתוחות בזמן אמת, והפסקת סשנים בעייתיים.
לפני שמתחילים
לפני שמפעילים את התובנות המתקדמות לגבי שאילתות, צריך לוודא שהדרישות הבאות מתקיימות:
אתם מפעילים מופע עצמאי של AlloyDB Omni שהותקן באמצעות חבילות Linux RPM.
יש לכם גישת משתמש-על ב-
postgresלמכונה של מסד הנתונים, והרשאת אדמין להפעלה מחדש של שירות מסד הנתונים.מסד הנתונים
alloydbadminקיים במכונה שלכם. AlloyDB Omni יוצר את מסד הנתונים הזה כברירת מחדל במהלך האתחול.
הפעלת תובנות מתקדמות לגבי שאילתות
כדי להפעיל את התובנות המתקדמות לגבי שאילתות:
מתחברים למסד הנתונים
postgresבתור משתמש העלpostgres:sudo -u postgres /usr/lib/postgresql/18/bin/psql -U postgres -d postgresבודקים את הספריות שנטענו ב-
shared_preload_libraries, מוסיפים את התובנות המתקדמות לגבי שאילתות לרשימת הטעינה מראש, מפעילים את התוסף ויוצאים מ-psql:SHOW shared_preload_libraries; ALTER SYSTEM SET shared_preload_libraries = 'LIBRARY_1','LIBRARY_2','google_insights_v2'; ALTER SYSTEM SET google_insights_v2.enabled = on; \qמחליפים את
LIBRARY_1,LIBRARY_2וכל ספרייה קיימת נוספת בשמות הספריות שמוחזרים על ידיSHOW shared_preload_libraries. צריך להקיף כל רשומה של ספרייה במירכאות בודדות, כמו'g_stats','google_columnar_engine','google_insights_v2', ולכלול את כל הספריות הקיימות שנדרשות ל-AlloyDB Omni כדי לא להחליף אותן.מפעילים מחדש את שרת AlloyDB Omni כדי להחיל את הגדרות הטעינה מראש:
sudo systemctl restart alloydbomni18מתחברים למסד הנתונים
alloydbadminכמשתמש העלpostgres:sudo -u postgres /usr/lib/postgresql/18/bin/psql -U postgres -d alloydbadminיוצרים את התוסף של תובנות מתקדמות לגבי שאילתות במסד הנתונים
alloydbadmin:CREATE EXTENSION IF NOT EXISTS google_insights_v2;מוודאים שהספרייה נטענת, שהתוסף מופעל ושהתוסף
google_insights_v2מותקן ב-alloydbadmin:SHOW shared_preload_libraries; SHOW google_insights_v2.enabled; SELECT extname, extversion FROM pg_extension WHERE extname = 'google_insights_v2';עליך לאשר ש
shared_preload_librariesכוללgoogle_insights_v2,google_insights_v2.enabledהחזרותon, וpg_extensionמחזיר שורה עבורgoogle_insights_v2.
מאפיינים ופרמטרים של יכולות
ב-AlloyDB Omni, התכונה "תובנות מתקדמות לגבי שאילתות" מתעדת את נתוני הטלמטריה של מסד הנתונים בטבלאות, בתצוגות ובפונקציות של SQL במסד הנתונים alloydbadmin, לפי המאפיינים והיכולות הבאים:
- שאילתות: משמשות לזיהוי הצהרות SQL איטיות או כאלה שצורכות הרבה משאבים, כשזמן האחזור של השאילתות עולה.
- סוגי אירועי המתנה: משמשים כדי לקבוע אם צווארי בקבוק בעומס העבודה נגרמים בגלל CPU, קלט/פלט של דיסק או תחרות על נעילה.
- אירועי המתנה: משמשים לזיהוי אירוע המתנה ספציפי של PostgreSQL, כמו
DataFileReadאוWALWrite, שגורם לעיכוב בהרצת השאילתה. - מסדי נתונים: השוואה בין צריכת המשאבים במסדי נתונים לוגיים, ובידוד של מסדי נתונים עם עומס גבוה במכונות משותפות.
- משתמשים וכתובות IP של לקוחות: משמשים לשיוך עומס השאילתות לתפקידים ספציפיים במסד הנתונים או לכתובות ה-IP של הלקוחות, ולזיהוי לקוחות בעייתיים של אפליקציות.
- תגים: משמשים כדי ליצור קורלציה בין עומס מסד הנתונים לבין שירותי אפליקציה, מסלולים או פעולות ORM ספציפיים שתויגו באמצעות SQLCommenter.
- שאילתות פעילות: משמשות לאבחון עליות חדות בביצועים בזמן אמת, עסקאות חסומות וסשנים ארוכים בזמן אמת.
כשמגדירים את google_insights_v2.enabled לערך on, AlloyDB Omni אוסף באופן אוטומטי מדדים של שאילתות, סוגי אירועי המתנה, אירועי המתנה, מסדי נתונים ומשתמשים.
כדי לעדכן פרמטר google_insights_v2.* בזמן הריצה בלי להפעיל מחדש את שרת מסד הנתונים, מריצים את הפקודה ALTER SYSTEM SET וטוענים מחדש את ההגדרה:
ALTER SYSTEM SET PARAMETER_NAME = VALUE;
SELECT pg_reload_conf();
מחליפים את מה שכתוב בשדות הבאים:
-
PARAMETER_NAME: השם של הפרמטר המתקדם של תובנות לגבי שאילתות שרוצים להגדיר, כמוgoogle_insights_v2.qi_track_active_queries,google_insights_v2.qi_track_tagאוgoogle_insights_v2.qi_track_client_address. -
VALUE: הערך החדש של הפרמטר, למשלon.
במאמר הפניה לתובנות מתקדמות לגבי שאילתות מופיעים תיאורים של כל פרמטר, תצוגות התוצאות התואמות, המדדים והעמודות שמוחזרים בכל תצוגה.
יחידות זמן
כל תצוגה היסטורית של observability_service_* זמינה בשלוש רמות פירוט של זמן:
- תצוגות בסיסיות (
*_view): מרווחי זמן של 15 שניות בין ריקון לריקון. התצוגות האלה מאפשרות לחקור עליות חדות או אירועים שהתרחשו בשעה עד 6 השעות האחרונות. - צפיות ברמה גסה 1 (
*_coarse_1_view): מרווחי זמן מצטברים של 5 דקות עבור 2,000 השאילתות המובילות. אתם יכולים להשתמש בתצוגות האלה כדי לנתח מגמות בביצועים בטווח של 6 עד 24 שעות. - צפיות ברמה 2 (
*_coarse_2_view): מרווחי זמן מצטברים של 30 דקות עבור 2,000 השאילתות המובילות. אפשר להשתמש בתצוגות האלה כדי לנתח מגמות של כמה ימים עד למגבלת השמירה של 30 יום.
בתצוגות ההיסטוריות של יכולת הצפייה מאוחסנות כל העמודות של זמן ההמתנה, זמן הביצוע וזמן הקלט/פלט במיקרו-שניות, כולל total_execution_time, total_wait_time, total_read_time, total_write_time ו-time_spent.
מדדי ביצועים היסטוריים של שאילתות
מתחברים למסד הנתונים alloydbadmin כדי להריץ שאילתות אבחון בתצוגות ההיסטוריות של יכולת התצפית. מידע נוסף זמין במאמר הפעלה והתחברות ל-AlloyDB Omni.
הצהרות ה-SQL בקטע הזה הן דוגמאות לשאילתות לתרחישי פתרון בעיות נפוצים במאפיינים. אתם יכולים להתאים אישית את הדוגמאות האלה, למשל לשנות את recorded_on חלון הזמן, לסנן לפי מסדי נתונים או תפקידים ספציפיים, או לשלוח שאילתות ל-*_coarse_1_view ול-*_coarse_2_view לניתוח רב-יומי, כדי להתאים אותן לעומס העבודה שלכם.
זיהוי שאילתות עם זמן אחזור ארוך
כדי למצוא את 10 השאילתות המנורמלות המובילות עם זמן הביצוע הכולל הגבוה ביותר בשעה האחרונה, מריצים את השאילתה לדוגמה הבאה ב-google_insights_v2.observability_service_query_view:
SELECT
query_id,
database,
username,
left(query, 100) AS normalized_query,
sum(count) AS total_executions,
sum(total_execution_time) AS total_execution_time_us,
round((sum(total_execution_time)::numeric / NULLIF(sum(count), 0)), 2) AS avg_execution_time_us,
sum(total_rows) AS total_rows,
sum(total_shared_blocks_hit) AS shared_blocks_hit,
sum(total_shared_blocks_read) AS shared_blocks_read
FROM google_insights_v2.observability_service_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY query_id, database, username, left(query, 100)
ORDER BY total_execution_time_us DESC
LIMIT 10;
ניתוח אירועים של המתנה לפי שאילתה
כדי לזהות אילו קטגוריות של אירועי המתנה (wait_class) ואירועי המתנה המפורטים (wait_event) תורמים הכי הרבה זמן המתנה ל-query_id ספציפי, מריצים את שאילתת הדוגמה הבאה מול google_insights_v2.observability_service_wait_event_stats_by_query_view:
SELECT
query_id,
database,
username,
wait_class,
wait_event,
sum(count) AS wait_occurrences,
sum(time_spent) AS total_wait_time_us
FROM google_insights_v2.observability_service_wait_event_stats_by_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
AND query_id = QUERY_ID
GROUP BY query_id, database, username, wait_class, wait_event
ORDER BY total_wait_time_us DESC;
מחליפים את QUERY_ID בערך query_id שמוחזר על ידי observability_service_query_view.
ניתוח העומס על מסד הנתונים, המשתמשים וכתובות ה-IP של הלקוחות
כדי להשוות בין זמן הביצוע הכולל, זמן ההמתנה ונפח השאילתות במסדי נתונים לוגיים ובתפקידים במסדי נתונים בשעה האחרונה, מריצים את השאילתה לדוגמה הבאה ב-google_insights_v2.observability_service_db_load_conn_view:
SELECT
database,
username,
sum(count) AS total_executions,
sum(total_execution_time) AS total_execution_time_us,
sum(total_wait_time) AS total_wait_time_us
FROM google_insights_v2.observability_service_db_load_conn_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY database, username
ORDER BY total_execution_time_us DESC;
אם מפעילים את google_insights_v2.qi_track_client_address, אפשר גם לזהות אילו כתובות ה-IP של הלקוחות המתחברים יוצרות את זמן השאילתה הארוך ביותר באמצעות השאילתה לדוגמה הבאה מול google_insights_v2.observability_service_client_address_stats_by_query_view:
SELECT
client_address,
username,
database,
query_id,
sum(count) AS total_executions,
sum(time_spent) AS total_time_spent_us
FROM google_insights_v2.observability_service_client_address_stats_by_query_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY client_address, username, database, query_id
ORDER BY total_time_spent_us DESC
LIMIT 10;
מעקב אחרי ביצועי שאילתות לפי תגים
אם הערך של google_insights_v2.qi_track_tag הוא on והשאילתות כוללות הערות של SQLCommenter, מריצים את השאילתה לדוגמה הבאה כדי לצבור את זמן הביצוע לפי מטא-נתונים של תג האפליקציה באמצעות google_insights_v2.observability_service_tag_view:
SELECT
application,
framework_name,
framework_controller,
framework_action,
framework_route,
database,
username,
sum(count) AS total_executions,
sum(total_execution_time) AS total_execution_time_us,
round((sum(total_execution_time)::numeric / NULLIF(sum(count), 0)), 2) AS avg_execution_time_us
FROM google_insights_v2.observability_service_tag_view
WHERE recorded_on >= now() - INTERVAL '1 hour'
GROUP BY
application,
framework_name,
framework_controller,
framework_action,
framework_route,
database,
username
ORDER BY total_execution_time_us DESC
LIMIT 10;
מעקב אחרי שאילתות פעילות
כשמגדירים את google_insights_v2.qi_track_active_queries לערך on, אפשר לעקוב אחרי שאילתות פעילות ועסקאות פתוחות בזמן אמת על ידי שליחת שאילתות אל google_insights_v2.stat_activity ו-google_insights_v2.stat_activity_v3 במסד הנתונים alloydbadmin.
בתצוגות האלה מוצגים חיבורים פעילים של לקוחות, משך הסשן והעסקאות ואירועי המתנה נוכחיים, תוך החרגה של עובדים ברקע וחיבורים של alloydbadmin.
שאילתות על סשנים פעילים ומשכי זמן של טרנזקציות
כדי לזהות אילו שאילתות פועלות כרגע באופן פעיל במופע ואילו עסקאות פועלות הכי הרבה זמן, מריצים את השאילתה הבאה לדוגמה ב-alloydbadmin:
SELECT
pid AS "Process ID",
left(normalized_query, 40) AS "Query",
state AS "Status",
round(EXTRACT(EPOCH FROM (clock_timestamp() - backend_start))::numeric, 2) AS "Session duration (secs)",
CASE
WHEN xact_start IS NOT NULL
THEN round(EXTRACT(EPOCH FROM (clock_timestamp() - xact_start))::numeric, 2)
ELSE NULL
END AS "Transaction duration (secs)",
CASE
WHEN query_start IS NOT NULL
THEN round(EXTRACT(EPOCH FROM (clock_timestamp() - query_start))::numeric, 2)
ELSE NULL
END AS "Query duration (secs)",
COALESCE(wait_event_type, '') AS "Wait event type",
COALESCE(wait_event, '') AS "Wait event",
database AS "Database",
COALESCE(application_name, '') AS "Application name",
username AS "Username",
COALESCE(client_addr::text, '') AS "Client address"
FROM google_insights_v2.stat_activity_v3
WHERE state = 'active'
ORDER BY query_start ASC;
עצירת שאילתה או טרנזקציה שפועלת במשך זמן רב
כדי לעצור שאילתה שפועלת זמן רב או טרנזקציה חסומה שזוהתה ב-google_insights_v2.stat_activity_v3, מעבירים את מזהה התהליך שלה אל pg_terminate_backend:
SELECT pg_terminate_backend(PROCESS_ID);
מחליפים את PROCESS_ID בערך Process ID (pid) שמוחזר על ידי google_insights_v2.stat_activity_v3.
השבתה של תובנות מתקדמות לגבי שאילתות
כדי להפסיק את איסוף נתוני הטלמטריה בלי להפעיל מחדש את המכונה של AlloyDB Omni, מגדירים את google_insights_v2.enabled לערך off וטוענים מחדש את ההגדרות:
ALTER SYSTEM SET google_insights_v2.enabled = off;
SELECT pg_reload_conf();
כדי להסיר את אובייקטי התוסף ואת הנתונים ההיסטוריים שנשמרו ממסד הנתונים alloydbadmin, מתחברים אל alloydbadmin ומסירים את התוסף:
DROP EXTENSION IF EXISTS google_insights_v2 CASCADE;