האצת שאילתות ניתוח באמצעות מנוע עמודות ב-AlloyDB Omni.

1. מבוא

בקודלאב הזה תלמדו איך לפרוס את AlloyDB Omni ולהשתמש ב-Columnar Engine כדי לשפר את הביצועים של שאילתות.

7da257ba067ed1b1.png

דרישות מוקדמות

  • הבנה בסיסית של מסוף Google Cloud
  • מיומנויות בסיסיות בממשק שורת הפקודה וב-Google Shell

מה תלמדו

  • איך לפרוס את AlloyDB Omni במכונה וירטואלית של GCE ב-Google Cloud
  • איך מתחברים ל-AlloyDB Omni
  • איך טוענים נתונים ל-AlloyDB Omni
  • איך מפעילים את המנוע מבוסס-העמודות
  • איך בודקים את Columnar Engine במצב אוטומטי
  • איך מאכלסים את Columnar Store באופן ידני

מה צריך להכין

  • חשבון Google Cloud ופרויקט ב-Google Cloud
  • דפדפן אינטרנט כמו Chrome

2. הגדרה ודרישות

הגדרת סביבה בקצב אישי

  1. נכנסים למסוף Google Cloud ויוצרים פרויקט חדש או משתמשים מחדש בפרויקט קיים. אם עדיין אין לכם חשבון Gmail או חשבון Google Workspace, עליכם ליצור חשבון.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • שם הפרויקט הוא השם המוצג של המשתתפים בפרויקט. זוהי מחרוזת תווים שלא משמשת את Google APIs. תמיד תוכלו לעדכן אותו.
  • מזהה הפרויקט הוא ייחודי לכל הפרויקטים ב-Google Cloud ואי אפשר לשנות אותו אחרי שמגדירים אותו. מסוף Cloud יוצר מחרוזת ייחודית באופן אוטומטי. בדרך כלל לא משנה מה המחרוזת הזו. ברוב ה-codelabs תצטרכו להפנות למזהה הפרויקט (בדרך כלל מזהים אותו בתור PROJECT_ID). אם המזהה שנוצר לא מוצא חן בעיניכם, תוכלו ליצור מזהה אקראי אחר. לחלופין, אפשר לנסות כתובת משלכם ולבדוק אם היא זמינה. לא ניתן לשנות את השם אחרי השלב הזה, והוא יישאר למשך כל פרק הזמן של הפרויקט.
  • לידיעתכם, יש ערך שלישי, מספר פרויקט, שחלק מממשקי ה-API משתמשים בו. מידע נוסף על כל שלושת הערכים האלה זמין במסמכי העזרה.
  1. בשלב הבא, כדי להשתמש במשאבים או ב-API של Cloud, תצטרכו להפעיל את החיוב במסוף Cloud. השלמת הקודלאב הזה לא תעלה הרבה, אם בכלל. כדי להשבית את המשאבים ולמנוע חיובים אחרי סיום המדריך, אפשר למחוק את המשאבים שיצרתם או למחוק את הפרויקט. משתמשים חדשים ב-Google Cloud זכאים להשתתף בתוכנית תקופת ניסיון בחינם בסך 300$.

הפעלת Cloud Shell

אפשר להפעיל את Google Cloud מרחוק מהמחשב הנייד, אבל בסדנת הקוד הזו נשתמש ב-Google Cloud Shell, סביבת שורת פקודה שפועלת ב-Cloud.

במסוף Google Cloud, לוחצים על סמל Cloud Shell בסרגל הכלים שבפינה הימנית העליונה:

55efc1aaa7a4d3ad.png

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

7ffe5cbb04455448.png

המכונה הווירטואלית הזו כוללת את כל הכלים הדרושים למפתחים. יש בה ספריית בית בנפח מתמיד של 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. סקר

פלט:

איך תוכלו להשתמש במדריך הזה?

רק לקרוא לקרוא ולבצע את התרגילים