התכונה 'תובנות מתקדמות לגבי שאילתות' מאפשרת לכם לזהות, לאבחן ולמנוע בעיות בביצועים של שאילתות במסד הנתונים שלכם ב-AlloyDB Omni. הוא מתעד נתוני טלמטריה של מסד הנתונים, כולל נתונים סטטיסטיים מנורמלים של שאילתות, אירועי המתנה, כתובות ה-IP של הלקוחות, תגים ועומס על המכונה, ושומר מדדים היסטוריים למשך 30 יום.
אפשר להשתמש בתובנות מתקדמות לגבי שאילתות כדי לבצע את המשימות הבאות:
- לזהות שאילתות עם חביון גבוה ושאילתות שצורכות הרבה משאבים על ידי ניתוח של זמן הביצוע, זמן הקלט/פלט, זמן ההמתנה, פעילות מאגר הנתונים הזמני המשותף ומספר השורות.
- פתרון בעיות של צווארי בקבוק על ידי התאמה בין שאילתות איטיות לבין אירועי המתנה וסוגים של אירועי המתנה.
- אפשר לעקוב אחרי ביצועי שאילתות לרכיבי אפליקציה ספציפיים על ידי תיוג שאילתות במטא-נתונים של SQLCommenter.
- מעקב אחרי שאילתות פעילות ועסקאות פתוחות בזמן אמת, והפסקת סשנים בעייתיים.
לפני שמתחילים
לפני שמפעילים את התובנות המתקדמות לגבי שאילתות, צריך לוודא שהדרישות הבאות מתקיימות:
אתם מפעילים מכונת עצמאית של AlloyDB Omni במאגר.
יש לכם גישת משתמש-על (
postgres) למכונה של מסד הנתונים והרשאת אדמין להפעלה מחדש של הקונטיינר.מסד הנתונים
alloydbadminקיים במופע שלכם. AlloyDB Omni יוצר את מסד הנתונים הזה כברירת מחדל במהלך האתחול.
הפעלת תובנות מתקדמות לגבי שאילתות
כדי להפעיל את התובנות המתקדמות לגבי שאילתות:
מתחברים למסד הנתונים
postgresבתור משתמש-העלpostgres:Docker
docker exec -it CONTAINER_NAME psql -U postgres -d postgres
Docker
docker exec -it CONTAINER_NAME psql -U postgres -d postgres
Podman
podman exec -it CONTAINER_NAME psql -U postgres -d postgres
Podman
podman exec -it CONTAINER_NAME psql -U postgres -d postgres
מחליפים את
CONTAINER_NAMEבשם של קונטיינר AlloyDB Omni, למשלmy-omni-1.בודקים את הספריות שנטענו ב-
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 כדי להחיל את הגדרות הטעינה מראש:
Docker
docker restart CONTAINER_NAME
Docker
docker restart CONTAINER_NAME
Podman
podman restart CONTAINER_NAME
Podman
podman restart CONTAINER_NAME
מתחברים למסד הנתונים
alloydbadminכמשתמש העלpostgres:Docker
docker exec -it CONTAINER_NAME psql -U postgres -d alloydbadmin
Docker
docker exec -it CONTAINER_NAME psql -U postgres -d alloydbadmin
Podman
podman exec -it CONTAINER_NAME psql -U postgres -d alloydbadmin
Podman
podman exec -it CONTAINER_NAME psql -U postgres -d alloydbadmin
יוצרים את התוסף advanced query insights במסד הנתונים
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;