1. מבוא
בקודלאב הזה תלמדו איך לפרוס את AlloyDB Omni ולהשתמש ב-Columnar Engine כדי לשפר את הביצועים של שאילתות.
דרישות מוקדמות
- הבנה בסיסית של מסוף Google Cloud
- מיומנויות בסיסיות בממשק שורת הפקודה וב-Google Shell
מה תלמדו
- איך לפרוס את AlloyDB Omni במכונה וירטואלית של GCE ב-Google Cloud
- איך מתחברים ל-AlloyDB Omni
- איך טוענים נתונים ל-AlloyDB Omni
- איך מפעילים את המנוע מבוסס-העמודות
- איך בודקים את Columnar Engine במצב אוטומטי
- איך מאכלסים את Columnar Store באופן ידני
מה צריך להכין
- חשבון Google Cloud ופרויקט ב-Google Cloud
- דפדפן אינטרנט כמו Chrome
2. הגדרה ודרישות
הגדרת סביבה בקצב אישי
- נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או משתמשים מחדש בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.
- שם הפרויקט הוא השם המוצג של המשתתפים בפרויקט. זוהי מחרוזת תווים שלא משמשת את Google APIs. תמיד תוכלו לעדכן אותו.
- מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו אחרי שמגדירים אותו. מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי. בדרך כלל לא משנה מה המחרוזת הזו. ברוב ה-codelabs תצטרכו להפנות למזהה הפרויקט (בדרך כלל מזהים אותו בתור
PROJECT_ID
). אם המזהה שנוצר לא מוצא חן בעיניכם, תוכלו ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות כתובת משלכם ולבדוק אם היא זמינה. לא ניתן לשנות את השם אחרי השלב הזה, והוא יישאר למשך כל פרק הזמן של הפרויקט. - לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי העזרה.
- בשלב הבא, כדי להשתמש במשאבים או ב-API של Cloud, תצטרכו להפעיל את החיוב במסוף Cloud. השלמת הקודלאב הזה לא תעלה הרבה, אם בכלל. כדי להשבית את המשאבים ולמנוע חיובים אחרי סיום המדריך, אפשר למחוק את המשאבים שיצרתם או למחוק את הפרויקט. משתמשים חדשים ב-Google Cloud זכאים להשתתף בתוכנית תקופת ניסיון בחינם בסך 300$.
הפעלת Cloud Shell
אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל בסדנת הקוד הזו נשתמש ב-Google Cloud Shell, סביבת שורת פקודה שפועלת ב-Cloud.
במסוף Google Cloud, לוחצים על סמל Cloud Shell בסרגל הכלים שבפינה הימנית העליונה:
תהליך ההקצאה והחיבור לסביבת העבודה אמור להימשך רק כמה רגעים. בסיום, אמור להופיע משהו כזה:
המכונה הווירטואלית הזו כוללת את כל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 5GB והיא פועלת ב-Google Cloud, משפרת מאוד את ביצועי הרשת ואת האימות. אתם יכולים לבצע את כל העבודה בקודלאב הזה בדפדפן. אין צורך להתקין שום דבר.
3. לפני שמתחילים
הפעלת ה-API
פלט:
ב-Cloud Shell, מוודאים שמזהה הפרויקט מוגדר:
PROJECT_ID=$(gcloud config get-value project)
echo $PROJECT_ID
אם הוא לא מוגדר בהגדרות של Cloud Shell, מגדירים אותו באמצעות הפקודות הבאות:
export PROJECT_ID=<your project>
gcloud config set project $PROJECT_ID
מפעילים את כל השירותים הנדרשים:
gcloud services enable compute.googleapis.com
הפלט הצפוי
student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project) Your active configuration is: [cloudshell-14650] student@cloudshell:~ (test-project-001-402417)$ gcloud config set project test-project-001-402417 Updated property [core/project]. student@cloudshell:~ (test-project-001-402417)$ gcloud services enable compute.googleapis.com Operation "operations/acat.p2-4470404856-1f44ebd8-894e-4356-bea7-b84165a57442" finished successfully.
4. פריסת AlloyDB Omni ב-GCE
כדי לפרוס את AlloyDB Omni ב-GCE, צריך להכין מכונה וירטואלית עם הגדרות ותוכנות תואמות. דוגמה לפריסה של AlloyDB Omni במכונה וירטואלית מבוססת Debian.
יצירת מכונה וירטואלית ב-GCE
אנחנו צריכים לפרוס מכונה וירטואלית עם הגדרות מקובלות למעבד (CPU), לזיכרון ולאחסון. אנחנו נשתמש בתמונת ברירת המחדל של Debian עם הגדלת נפח הדיסק המערכתי ל-20GB כדי להכיל את קובצי מסדי הנתונים של AlloyDB Omni.
אפשר להשתמש ב-Cloud Shell המופעל או בטרמינל שבו מותקן Cloud SDK.
כל השלבים מתוארים גם במדריך למתחילים של AlloyDB Omni.
מגדירים את משתני הסביבה לפריסה.
export ZONE=us-central1-a
export MACHINE_TYPE=n2-highmem-2
export DISK_SIZE=20
export MACHINE_NAME=omni01
לאחר מכן, משתמשים ב-gcloud כדי ליצור את המכונה הווירטואלית ב-GCE.
gcloud compute instances create $MACHINE_NAME \
--project=$(gcloud info --format='value(config.project)') \
--zone=$ZONE --machine-type=$MACHINE_TYPE \
--metadata=enable-os-login=true \
--create-disk=auto-delete=yes,boot=yes,size=$DISK_SIZE,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" \
--format="value(name)"),type=pd-ssd
הפלט הצפוי במסוף:
gleb@cloudshell:~ (gleb-test-short-001-415614)$ export ZONE=us-central1-a export MACHINE_TYPE=n2-highmem-2 export DISK_SIZE=20 export MACHINE_NAME=omni01 gleb@cloudshell:~ (gleb-test-short-001-415614)$ gcloud compute instances create $MACHINE_NAME \ --project=$(gcloud info --format='value(config.project)') \ --zone=$ZONE --machine-type=$MACHINE_TYPE \ --metadata=enable-os-login=true \ --create-disk=auto-delete=yes,boot=yes,size=$DISK_SIZE,image=projects/debian-cloud/global/images/$(gcloud compute images list --filter="family=debian-12 AND family!=debian-12-arm64" \ --format="value(name)"),type=pd-ssd Created [https://www.googleapis.com/compute/v1/projects/gleb-test-short-001-415614/zones/us-central1-a/instances/omni01]. WARNING: Some requests generated warnings: - Disk size: '20 GB' is larger than image size: '10 GB'. You might need to resize the root repartition manually if the operating system does not support automatic resizing. See https://cloud.google.com/compute/docs/disks/add-persistent-disk#resize_pd for details. NAME: omni01 ZONE: us-central1-a MACHINE_TYPE: n2-highmem-2 PREEMPTIBLE: INTERNAL_IP: 10.128.0.3 EXTERNAL_IP: 35.232.157.123 STATUS: RUNNING gleb@cloudshell:~ (gleb-test-short-001-415614)$
התקנה של AlloyDB Omni
מתחברים ל-VM שנוצר:
gcloud compute ssh omni01 --zone $ZONE
הפלט הצפוי במסוף:
gleb@cloudshell:~ (gleb-test-short-001-415614)$ gcloud compute ssh omni01 --zone $ZONE Warning: Permanently added 'compute.5615760774496706107' (ECDSA) to the list of known hosts. Linux omni01.us-central1-a.c.gleb-test-short-003-421517.internal 6.1.0-20-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.85-1 (2024-04-11) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. gleb@omni01:~$
מריצים את הפקודה הבאה במסוף המחובר.
מתקינים את Docker ב-VM:
sudo apt update
sudo apt-get -y install docker.io
הפלט הצפוי במסוף(הושמט מידע):
gleb@omni01:~$ sudo apt update sudo apt-get -y install docker.io Get:1 file:/etc/apt/mirrors/debian.list Mirrorlist [30 B] Get:5 file:/etc/apt/mirrors/debian-security.list Mirrorlist [39 B] Get:7 https://packages.cloud.google.com/apt google-compute-engine-bookworm-stable InRelease [5146 B] Get:8 https://packages.cloud.google.com/apt cloud-sdk-bookworm InRelease [6406 B] Get:9 https://packages.cloud.google.com/apt google-compute-engine-bookworm-stable/main amd64 Packages [1916 B] Get:2 https://deb.debian.org/debian bookworm InRelease [151 kB] ... Setting up binutils (2.40-2) ... Setting up needrestart (3.6-4+deb12u1) ... Processing triggers for man-db (2.11.2-2) ... Processing triggers for libc-bin (2.36-9+deb12u4) ... gleb@omni01:~$
מגדירים סיסמה למשתמש postgres:
export PGPASSWORD=<your password>
יוצרים ספרייה לנתוני AlloyDB Omni. זוהי גישה אופציונלית, אבל מומלצת. כברירת מחדל, הנתונים נוצרים באמצעות שכבת מערכת הקבצים הזמנית של Docker, והכול נהרס כשקונטיינר Docker נמחק. שמירת הנתונים בנפרד מאפשרת לכם לנהל קונטיינרים בנפרד מהנתונים, ולבחור אם להעביר אותם לאחסון עם מאפייני IO טובים יותר.
זוהי פקודה ליצירת ספרייה בספריית הבית של המשתמש, שבה יוצבו כל הנתונים:
mkdir -p $HOME/alloydb-data
פריסת הקונטיינר של AlloyDB Omni:
sudo docker run --name my-omni \
-e POSTGRES_PASSWORD=$PGPASSWORD \
-p 5432:5432 \
-v $HOME/alloydb-data:/var/lib/postgresql/data \
-v /dev/shm:/dev/shm \
-d google/alloydbomni
הפלט הצפוי במסוף(הושמט מידע):
gleb@omni01:~$ export PGPASSWORD=StrongPassword gleb@omni01:~$ sudo docker run --name my-omni \ -e POSTGRES_PASSWORD=$PGPASSWORD \ -p 5432:5432 \ -v $HOME/alloydb-data:/var/lib/postgresql/data \ -v /dev/shm:/dev/shm \ -d google/alloydbomni Unable to find image 'google/alloydbomni:latest' locally latest: Pulling from google/alloydbomni 71215d55680c: Pull complete ... 2e0ec3fe1804: Pull complete Digest: sha256:d6b155ea4c7363ef99bf45a9dc988ce5467df5ae8cd3c0f269ae9652dd1982a6 Status: Downloaded newer image for google/alloydbomni:latest 56de4ae0018314093c8b048f69a1e9efe67c6c8117f44c8e1dc829a2d4666cd2 gleb@omni01:~$
מתקינים את תוכנת הלקוח של PostgreSQL במכונה הווירטואלית (אופציונלי – היא אמורה להיות כבר מותקנת):
sudo apt install -y postgresql-client
הפלט הצפוי במסוף:
gleb@omni01:~$ sudo apt install -y postgresql-client Reading package lists... Done Building dependency tree... Done Reading state information... Done postgresql-client is already the newest version (15+248). 0 upgraded, 0 newly installed, 0 to remove and 4 not upgraded.
מתחברים ל-AlloyDB Omni:
psql -h localhost -U postgres
הפלט הצפוי במסוף:
gleb@omni01:~$ psql -h localhost -U postgres psql (15.6 (Debian 15.6-0+deb12u1), server 15.5) Type "help" for help. postgres=#
מתנתקים מ-AlloyDB Omni:
exit
הפלט הצפוי במסוף:
postgres=# exit gleb@omni01:~$
5. הכנת מסד נתונים לבדיקה
כדי לבדוק את Columnar Engine, צריך ליצור מסד נתונים ולמלא אותו בנתוני בדיקה.
יצירת מסד נתונים
התחברות ל-AlloyDB Omni VM ויצירת מסד נתונים
בסשן של Cloud Shell, מריצים את הפקודה:
gcloud config set project $(gcloud config get-value project)
מתחברים ל-VM של AlloyDB Omni:
ZONE=us-central1-a
gcloud compute ssh omni01 --zone $ZONE
הפלט הצפוי במסוף:
student@cloudshell:~ (gleb-test-short-001-416213)$ gcloud config set project $(gcloud config get-value project) Updated property [core/project]. student@cloudshell:~ (gleb-test-short-001-416213)$ ZONE=us-central1-a gcloud compute ssh omni01 --zone $ZONE Linux omni01.us-central1-a.c.gleb-test-short-003-421517.internal 6.1.0-20-cloud-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.1.85-1 (2024-04-11) x86_64 The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. Last login: Mon Mar 4 18:17:55 2024 from 35.237.87.44 student@omni01:~$
בסשן ה-SSH שנוצר, מריצים את הפקודה:
export PGPASSWORD=<your password>
psql -h localhost -U postgres -c "CREATE DATABASE quickstart_db"
הפלט הצפוי במסוף:
student@omni01:~$ psql -h localhost -U postgres -c "CREATE DATABASE quickstart_db" CREATE DATABASE student@omni01:~$
יצירת טבלה עם נתונים לדוגמה
בבדיקות שלנו נשתמש בנתונים ציבוריים על סוכנויות ביטוח מורשות באייווה. מערך הנתונים הזה זמין באתר הממשלתי של איווה בכתובת https://data.iowa.gov/Regulation/Insurance-Producers-Licensed-in-Iowa/n4cc-vqyk/about_data .
קודם כול, צריך ליצור טבלה.
במכונה הווירטואלית של GCE, מריצים את הפקודה:
psql -h localhost -U postgres -d quickstart_db -c "DROP TABLE if exists insurance_producers_licensed_in_iowa;
CREATE TABLE insurance_producers_licensed_in_iowa (
npn int8,
last_name text,
first_name text,
address_line_1 text,
address_line_2 text,
address_line_3 text,
city text,
state text,
zip int4,
firstactivedate timestamp,
expirydate timestamp,
business_phone text,
email text,
physical_location text,
iowaresident text,
loa_has_crop text,
loa_has_surety text,
loa_has_ah text,
loa_has_life text,
loa_has_variable text,
loa_has_personal_lines text,
loa_has_credit text,
loa_has_excess text,
loa_has_property text,
loa_has_casualty text,
loa_has_reciprocal text
);"
הפלט הצפוי במסוף:
otochkin@omni01:~$ psql -h localhost -U postgres -d quickstart_db -c "DROP TABLE if exists insurance_producers_licensed_in_iowa; CREATE TABLE insurance_producers_licensed_in_iowa ( npn int8, last_name text, first_name text, address_line_1 text, address_line_2 text, address_line_3 text, city text, state text, zip int4, firstactivedate timestamp, expirydate timestamp, business_phone text, email text, physical_location text, iowaresident text, loa_has_crop text, loa_has_surety text, loa_has_ah text, loa_has_life text, loa_has_variable text, loa_has_personal_lines text, loa_has_credit text, loa_has_excess text, loa_has_property text, loa_has_casualty text, loa_has_reciprocal text );" NOTICE: table "insurance_producers_licensed_in_iowa" does not exist, skipping DROP TABLE CREATE TABLE otochkin@omni01:~$
טוענים נתונים לטבלה.
במכונה הווירטואלית של GCE, מריצים את הפקודה:
curl https://data.iowa.gov/api/views/n4cc-vqyk/rows.csv | psql -h localhost -U postgres -d quickstart_db -c "\copy insurance_producers_licensed_in_iowa from stdin csv header"
הפלט הצפוי במסוף:
otochkin@omni01:~$ curl https://data.iowa.gov/api/views/n4cc-vqyk/rows.csv | psql -h localhost -U postgres -d quickstart_db -c "\copy insurance_producers_licensed_in_iowa from stdin csv header" % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 39.3M 0 39.3M 0 0 1004k 0 --:--:-- 0:00:40 --:--:-- 1028k COPY 210898 otochkin@omni01:~$
הטענו למסד הנתונים שלנו 210,898 רשומות של סוכני ביטוח, ואנחנו יכולים לבצע כמה בדיקות.
הרצת שאילתות בדיקה
מתחברים ל-quickstart_db באמצעות psql ומפעילים את הטיימינג כדי למדוד את זמן הביצוע של השאילתות שלנו.
במכונה הווירטואלית של GCE, מריצים את הפקודה:
psql -h localhost -U postgres -d quickstart_db
הפלט הצפוי במסוף:
student@omni01:~$ psql -h localhost -U postgres -d quickstart_db psql (13.14 (Debian 13.14-0+deb11u1), server 15.5 WARNING: psql major version 13, server major version 15. Some psql features might not work. Type "help" for help. quickstart_db=#
בסשן PSQL, מריצים את הפקודה:
\timing
הפלט הצפוי במסוף:
quickstart_db=# \timing Timing is on. quickstart_db=#
נמצא את 5 הערים המובילות לפי מספר סוכני הביטוח שמוכרים ביטוח תאונות וביטוח בריאות, ושהרשיון שלהם בתוקף לפחות ל-6 החודשים הקרובים.
בסשן PSQL, מריצים את הפקודה:
SELECT city, count(*)
FROM insurance_producers_licensed_in_iowa
WHERE loa_has_ah ='Yes' and expirydate > now() + interval '6 MONTH'
GROUP BY city ORDER BY count(*) desc limit 5;
הפלט הצפוי במסוף:
quickstart_db=# SELECT city, count(*) FROM insurance_producers_licensed_in_iowa WHERE loa_has_ah ='Yes' and expirydate > now() + interval '6 MONTH' GROUP BY city ORDER BY count(*) desc limit 5; city | count -------------+------- TAMPA | 1885 OMAHA | 1656 KANSAS CITY | 1279 AUSTIN | 1254 MIAMI | 1003 (5 rows) Time: 94.965 ms
כדאי להריץ שאילתה לבדיקה כמה פעמים כדי לקבל זמן ביצוע מהימן.אפשר לראות שהזמן הממוצע להחזרת התוצאה הוא כ-94 אלפיות השנייה. בשלבים הבאים נפעיל את AlloyDB Columnar Engine ונבדוק אם הוא יכול לשפר את הביצועים.
יוצאים מהסשן של psql:
exit
6. הפעלת Columnar Engine
עכשיו צריך להפעיל את Columnar Engine ב-AlloyDB Omni.
עדכון הפרמטרים של AlloyDB Omni
אנחנו צריכים להעביר את הפרמטר של המכונה 'google_columnar_engine.enabled' ל-'on' ב-AlloyDB Omni, ונדרש להפעיל מחדש.
מעדכנים את הקובץ postgresql.conf בספרייה /var/alloydb/config ומפעילים מחדש את המכונה.
במכונה הווירטואלית של GCE, מריצים את הפקודה:
sudo docker exec my-omni /bin/bash -c "echo google_columnar_engine.enabled=true >>/var/lib/postgresql/data/postgresql.conf"
sudo docker exec my-omni /bin/bash -c "echo shared_preload_libraries=\'google_columnar_engine,google_job_scheduler,google_db_advisor,google_storage\' >>/var/lib/postgresql/data/postgresql.conf"
sudo docker stop my-omni
sudo docker start my-omni
הפלט הצפוי במסוף:
student@omni01:~$ sudo docker exec my-omni /bin/bash -c "echo google_columnar_engine.enabled=true >>/var/lib/postgresql/data/postgresql.conf" sudo docker exec my-omni /bin/bash -c "echo shared_preload_libraries=\'google_columnar_engine,google_job_scheduler,google_db_advisor,google_storage\' >>/var/lib/postgresql/data/postgresql.conf" sudo docker stop my-omni sudo docker start my-omni my-omni my-omni student@omni01:~$
אימות המנוע מבוסס-העמודות
מתחברים למסד הנתונים באמצעות psql ומאמתים את המנוע העמודתי.
חיבור למסד הנתונים AlloyDB Omni
בפעילות ה-SSH של המכונה הווירטואלית, מתחברים למסד הנתונים:
psql -h localhost -U postgres -d quickstart_db -c "show google_columnar_engine.enabled"
הפקודה אמורה להציג את המנוע העמודתי המופעל.
הפלט הצפוי במסוף:
student@omni01:~$ psql -h localhost -U postgres -d quickstart_db -c "show google_columnar_engine.enabled" google_columnar_engine.enabled -------------------------------- on (1 row)
7. השוואת ביצועים
עכשיו אפשר לאכלס את המאגר של המנוע העמודתי ולאמת את הביצועים.
אכלוס אוטומטי של מאגר עמודות
כברירת מחדל, המשימה לאכלוס החנות פועלת כל שעה. כדי למנוע המתנה, נצמצם את הזמן הזה ל-10 דקות.
במכונה הווירטואלית של GCE, מריצים את הפקודה:
sudo docker exec my-omni /bin/bash -c "echo google_columnar_engine.auto_columnarization_schedule=\'EVERY 10 MINUTES\' >>/var/lib/postgresql/data/postgresql.conf"
sudo docker stop my-omni
sudo docker start my-omni
זהו הפלט הצפוי:
student@omni01:~$ sudo docker exec my-omni /bin/bash -c "echo google_columnar_engine.auto_columnarization_schedule=\'EVERY 5 MINUTES\' >>/var/lib/postgresql/data/postgresql.conf" sudo docker stop my-omni sudo docker start my-omni my-omni my-omni student@omni01:~$
אימות ההגדרות
במכונה הווירטואלית של GCE, מריצים את הפקודה:
psql -h localhost -U postgres -d quickstart_db -c "show google_columnar_engine.auto_columnarization_schedule;"
הפלט אמור להיראות כך:
student@omni01:~$ psql -h localhost -U postgres -d quickstart_db -c "show google_columnar_engine.auto_columnarization_schedule;" google_columnar_engine.auto_columnarization_schedule ------------------------------------------------------ EVERY 10 MINUTES (1 row) student@omni01:~$
בודקים את האובייקטים במאגר העמודות. השדה צריך להיות ריק.
במכונה הווירטואלית של GCE, מריצים את הפקודה:
psql -h localhost -U postgres -d quickstart_db -c "SELECT database_name, schema_name, relation_name, column_name FROM g_columnar_recommended_columns;"
הפלט אמור להיראות כך:
student@omni01:~$ psql -h localhost -U postgres -d quickstart_db -c "SELECT database_name, schema_name, relation_name, column_name FROM g_columnar_recommended_columns;" database_name | schema_name | relation_name | column_name ---------------+-------------+---------------+------------- (0 rows) student@omni01:~$
מתחברים למסד הנתונים ומריצים כמה פעמים את אותה שאילתה שהרצנו קודם.
במכונה הווירטואלית של GCE, מריצים את הפקודה:
psql -h localhost -U postgres -d quickstart_db
בסשן PSQL.
הפעלת תזמון
\timing
מריצים את השאילתה כמה פעמים:
SELECT city, count(*)
FROM insurance_producers_licensed_in_iowa
WHERE loa_has_ah ='Yes' and expirydate > now() + interval '6 MONTH'
GROUP BY city ORDER BY count(*) desc limit 5;
הפלט אמור להיראות כך:
quickstart_db=# SELECT city, count(*) FROM insurance_producers_licensed_in_iowa WHERE loa_has_ah ='Yes' and expirydate > now() + interval '6 MONTH' GROUP BY city ORDER BY count(*) desc limit 5; city | count -------------+------- TAMPA | 1885 OMAHA | 1656 KANSAS CITY | 1279 AUSTIN | 1254 MIAMI | 1003 (5 rows) Time: 94.289 ms quickstart_db=# SELECT city, count(*) FROM insurance_producers_licensed_in_iowa WHERE loa_has_ah ='Yes' and expirydate > now() + interval '6 MONTH' GROUP BY city ORDER BY count(*) desc limit 5; city | count -------------+------- TAMPA | 1885 OMAHA | 1656 KANSAS CITY | 1279 AUSTIN | 1254 MIAMI | 1003 (5 rows) Time: 94.608 ms quickstart_db=#
ממתינים 10 דקות ובודקים אם העמודות של הטבלה insurance_producers_licensed_in_iowa מאוכלסות במאגר העמודות.
SELECT database_name, schema_name, relation_name, column_name FROM g_columnar_recommended_columns;
הפלט אמור להיראות כך:
quickstart_db=# SELECT database_name, schema_name, relation_name, column_name FROM g_columnar_recommended_columns; database_name | schema_name | relation_name | column_name ---------------+-------------+--------------------------------------+------------- quickstart_db | public | insurance_producers_licensed_in_iowa | city quickstart_db | public | insurance_producers_licensed_in_iowa | expirydate quickstart_db | public | insurance_producers_licensed_in_iowa | loa_has_ah (3 rows) Time: 0.643 ms
עכשיו אפשר להריץ שוב את השאילתה לטבלה insurance_producers_licensed_in_iowa ולבדוק אם הביצועים השתפרו.
SELECT city, count(*)
FROM insurance_producers_licensed_in_iowa
WHERE loa_has_ah ='Yes' and expirydate > now() + interval '6 MONTH'
GROUP BY city ORDER BY count(*) desc limit 5;
הפלט אמור להיראות כך:
quickstart_db=# SELECT city, count(*) FROM insurance_producers_licensed_in_iowa WHERE loa_has_ah ='Yes' and expirydate > now() + interval '6 MONTH' GROUP BY city ORDER BY count(*) desc limit 5; city | count -------------+------- TAMPA | 1885 OMAHA | 1656 KANSAS CITY | 1279 AUSTIN | 1254 MIAMI | 1003 (5 rows) Time: 14.380 ms quickstart_db=# SELECT city, count(*) FROM insurance_producers_licensed_in_iowa WHERE loa_has_ah ='Yes' and expirydate > now() + interval '6 MONTH' GROUP BY city ORDER BY count(*) desc limit 5; city | count -------------+------- TAMPA | 1885 OMAHA | 1656 KANSAS CITY | 1279 AUSTIN | 1254 MIAMI | 1003 (5 rows) Time: 13.279 ms
זמן הביצוע ירד מ-94 אלפיות שנייה ל-14 אלפיות שנייה. אם לא רואים שיפורים, אפשר לבדוק אם העמודות מאוכלסות במאגר העמודות על ידי בדיקת התצוגה g_columnar_columns.
SELECT relation_name,column_name,column_type,status,size_in_bytes from g_columnar_columns;
הפלט אמור להיראות כך:
quickstart_db=# select relation_name,column_name,column_type,status,size_in_bytes from g_columnar_columns; relation_name | column_name | column_type | status | size_in_bytes --------------------------------------+-------------+-------------+--------+--------------- insurance_producers_licensed_in_iowa | city | text | Usable | 664231 insurance_producers_licensed_in_iowa | expirydate | timestamp | Usable | 212434 insurance_producers_licensed_in_iowa | loa_has_ah | text | Usable | 211734 (3 rows)
עכשיו אפשר לבדוק אם תוכנית הביצוע של השאילתה משתמשת במנוע העמודות.
בסשן PSQL, מריצים את הפקודה:
EXPLAIN (ANALYZE,SETTINGS,BUFFERS)
SELECT city, count(*)
FROM insurance_producers_licensed_in_iowa
WHERE loa_has_ah ='Yes' and expirydate > now() + interval '6 MONTH'
GROUP BY city ORDER BY count(*) desc limit 5;
הפלט אמור להיראות כך:
quickstart_db=# EXPLAIN (ANALYZE,SETTINGS,BUFFERS) SELECT city, count(*) FROM insurance_producers_licensed_in_iowa WHERE loa_has_ah ='Yes' and expirydate > now() + interval '6 MONTH' GROUP BY city ORDER BY count(*) desc limit 5; QUERY PLAN --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Limit (cost=2279.72..2279.73 rows=5 width=17) (actual time=12.248..12.252 rows=5 loops=1) -> Sort (cost=2279.72..2292.91 rows=5277 width=17) (actual time=12.246..12.248 rows=5 loops=1) Sort Key: (count(*)) DESC Sort Method: top-N heapsort Memory: 25kB -> HashAggregate (cost=2139.30..2192.07 rows=5277 width=17) (actual time=10.235..11.250 rows=7555 loops=1) Group Key: city Batches: 1 Memory Usage: 1169kB -> Append (cost=20.00..1669.24 rows=94012 width=9) (actual time=10.231..10.233 rows=94286 loops=1) -> Custom Scan (columnar scan) on insurance_producers_licensed_in_iowa (cost=20.00..1665.22 rows=94011 width=9) (actual time=10.229..10.231 rows=94286 loops=1) Filter: ((loa_has_ah = 'Yes'::text) AND (expirydate > (now() + '6 mons'::interval))) Rows Removed by Columnar Filter: 116612 Rows Aggregated by Columnar Scan: 94286 Columnar cache search mode: native -> Seq Scan on insurance_producers_licensed_in_iowa (cost=0.00..4.02 rows=1 width=9) (never executed) Filter: ((loa_has_ah = 'Yes'::text) AND (expirydate > (now() + '6 mons'::interval))) Planning Time: 0.216 ms Execution Time: 12.353 ms
אפשר לראות גם שהפעולה 'סריקה רציפה' בקטע של טבלת business_licenses מעולם לא בוצעה, ובמקום זאת השתמשו ב'סריקה מותאמת אישית (סריקה בעמודות)'. כך הצלחנו לשפר את זמן התגובה מ-94 ל-12 אלפיות השנייה.
אם רוצים לנקות את התוכן המאוכלס באופן אוטומטי מהמנוע העמודתי, אפשר לעשות זאת באמצעות פונקציית SQL google_columnar_engine_reset_recommendation.
בסשן PSQL, מריצים את הפקודה:
SELECT google_columnar_engine_reset_recommendation(drop_columns => true);
הפקודה תנקה את העמודות שאוכלסו, ותוכלו לוודא זאת בתצוגות g_columnar_columns ו-g_columnar_recommended_columns, כפי שצוין קודם.
SELECT database_name, schema_name, relation_name, column_name FROM g_columnar_recommended_columns;
SELECT relation_name,column_name,column_type,status,size_in_bytes from g_columnar_columns;
הפלט אמור להיראות כך:
quickstart_db=# SELECT database_name, schema_name, relation_name, column_name FROM g_columnar_recommended_columns; database_name | schema_name | relation_name | column_name ---------------+-------------+---------------+------------- (0 rows) Time: 0.447 ms quickstart_db=# select relation_name,column_name,column_type,status,size_in_bytes from g_columnar_columns; relation_name | column_name | column_type | status | size_in_bytes ---------------+-------------+-------------+--------+--------------- (0 rows) Time: 0.556 ms quickstart_db=#
איכלוס ידני של מאגר עמודות
אפשר להוסיף עמודות ל-Columnar Engine Store באופן ידני באמצעות פונקציות SQL, או לציין את הישויות הנדרשות בדגלים של המכונה כדי לטעון אותן באופן אוטומטי כשהמכונה מופעלת.
נוסיף את אותן עמודות כמו קודם באמצעות פונקציית SQL google_columnar_engine_add.
בסשן PSQL, מריצים את הפקודה:
SELECT google_columnar_engine_add(relation => 'insurance_producers_licensed_in_iowa', columns => 'city,expirydate,loa_has_ah');
אפשר לאמת את התוצאה באמצעות אותה תצוגה g_columnar_columns:
SELECT relation_name,column_name,column_type,status,size_in_bytes from g_columnar_columns;
הפלט אמור להיראות כך:
quickstart_db=# SELECT relation_name,column_name,column_type,status,size_in_bytes from g_columnar_columns; relation_name | column_name | column_type | status | size_in_bytes --------------------------------------+-------------+-------------+--------+--------------- insurance_producers_licensed_in_iowa | city | text | Usable | 664231 insurance_producers_licensed_in_iowa | expirydate | timestamp | Usable | 212434 insurance_producers_licensed_in_iowa | loa_has_ah | text | Usable | 211734 (3 rows) Time: 0.692 ms quickstart_db=#
כדי לוודא שהמאגר העמודתי נמצא בשימוש, מריצים את אותה שאילתה כמו קודם ובודקים את תוכנית הביצוע:
EXPLAIN (ANALYZE,SETTINGS,BUFFERS)
SELECT city, count(*)
FROM insurance_producers_licensed_in_iowa
WHERE loa_has_ah ='Yes' and expirydate > now() + interval '6 MONTH'
GROUP BY city ORDER BY count(*) desc limit 5;
יוצאים מהסשן של psql:
exit
אם נפעיל מחדש את הקונטיינר של AlloyDB Omni, נוכל לראות שכל המידע בעמודות אבד.
בסשן המעטפת, מריצים את הפקודה:
sudo docker stop my-omni
sudo docker start my-omni
ממתינים 5-10 שניות ומריצים את הפקודה:
psql -h localhost -U postgres -d quickstart_db -c "SELECT relation_name,column_name,column_type,status,size_in_bytes from g_columnar_columns"
הפלט אמור להיראות כך:
student@omni01:~$ psql -h localhost -U postgres -d quickstart_db -c "SELECT relation_name,column_name,column_type,status,size_in_bytes from g_columnar_columns" relation_name | column_name | column_type | status | size_in_bytes ---------------+-------------+-------------+--------+--------------- (0 rows)
כדי לאכלס מחדש את העמודות באופן אוטומטי במהלך ההפעלה מחדש, אפשר להוסיף אותן כדגלים של מסדי נתונים לפרמטרים של AlloyDB Omni. אנחנו מוסיפים את הדגל google_columnar_engine.relations=‘quickstart_db.public.insurance_producers_licensed_in_iowa(city,expirydate,loa_has_ah)' ומפעילים מחדש את המאגר.
בסשן המעטפת, מריצים את הפקודה:
sudo docker exec my-omni /bin/bash -c "echo google_columnar_engine.relations=\'quickstart_db.public.insurance_producers_licensed_in_iowa\(city,expirydate,loa_has_ah\)\' >>/var/lib/postgresql/data/postgresql.conf"
sudo docker stop my-omni
sudo docker start my-omni
לאחר מכן אפשר לראות שהעמודות נוספו ל-Columnar Store באופן אוטומטי אחרי ההפעלה.
ממתינים 5-10 שניות ומריצים את הפקודה:
psql -h localhost -U postgres -d quickstart_db -c "SELECT relation_name,column_name,column_type,status,size_in_bytes from g_columnar_columns"
הפלט אמור להיראות כך:
student@omni01:~$ psql -h localhost -U postgres -d quickstart_db -c "SELECT relation_name,column_name,column_type,status,size_in_bytes from g_columnar_columns" relation_name | column_name | column_type | status | size_in_bytes --------------------------------------+-------------+-------------+--------+--------------- insurance_producers_licensed_in_iowa | city | text | Usable | 664231 insurance_producers_licensed_in_iowa | expirydate | timestamp | Usable | 212434 insurance_producers_licensed_in_iowa | loa_has_ah | text | Usable | 211734 (3 rows)
8. פינוי הסביבה
עכשיו אפשר למחוק את המכונה הווירטואלית של AlloyDB Omni
מחיקת מכונה וירטואלית ב-GCE
ב-Cloud Shell, מריצים את הפקודה:
export GCEVM=omni01
export ZONE=us-central1-a
gcloud compute instances delete $GCEVM \
--zone=$ZONE \
--quiet
הפלט הצפוי במסוף:
student@cloudshell:~ (test-project-001-402417)$ export GCEVM=omni01 export ZONE=us-central1-a gcloud compute instances delete $GCEVM \ --zone=$ZONE \ --quiet Deleted
9. מזל טוב
כל הכבוד על השלמת ה-Codelab.
מה עסקנו בו
- איך לפרוס את AlloyDB Omni במכונה וירטואלית של GCE ב-Google Cloud
- איך מתחברים ל-AlloyDB Omni
- איך טוענים נתונים ל-AlloyDB Omni
- איך מפעילים את המנוע מבוסס-העמודות
- איך בודקים את Columnar Engine במצב אוטומטי
- איך מאכלסים את Columnar Store באופן ידני
מידע נוסף על עבודה עם מנוע העמודות זמין במסמכי העזרה.
10. סקר
פלט: