การเร่งการค้นหาเชิงวิเคราะห์ด้วยเครื่องมือคอลัมน์คอลัมน์ใน AlloyDB Omni

1. บทนำ

ใน Codelab นี้ คุณจะได้เรียนรู้วิธีติดตั้งใช้งาน AlloyDB Omni และใช้ Columnar Engine เพื่อปรับปรุงประสิทธิภาพของคำค้นหา

80a4ce38b05ed3c4.png

ข้อกำหนดเบื้องต้น

  • ความเข้าใจพื้นฐานเกี่ยวกับ Google Cloud Console
  • ทักษะพื้นฐานในอินเทอร์เฟซบรรทัดคำสั่งและ Google Shell

สิ่งที่คุณจะได้เรียนรู้

  • วิธีติดตั้งใช้งาน AlloyDB Omni ใน VM ของ GCE ใน Google Cloud
  • วิธีเชื่อมต่อกับ AlloyDB Omni
  • วิธีโหลดข้อมูลไปยัง AlloyDB Omni
  • วิธีเปิดใช้ Columnar Engine
  • วิธีตรวจสอบเครื่องมือ Columnar ในโหมดอัตโนมัติ
  • วิธีป้อนข้อมูลในที่เก็บข้อมูลแบบคอลัมน์ด้วยตนเอง

สิ่งที่คุณต้องมี

  • บัญชี Google Cloud และโปรเจ็กต์ Google Cloud
  • เว็บเบราว์เซอร์ เช่น Chrome

2. การตั้งค่าและข้อกำหนด

การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง

  1. ลงชื่อเข้าใช้ Google Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ หากยังไม่มีบัญชี Gmail หรือ Google Workspace คุณต้องสร้างบัญชี

295004821bab6a87.png

37d264871000675d.png

96d86d3d5655cdbe.png

  • ชื่อโปรเจ็กต์คือชื่อที่แสดงสำหรับผู้เข้าร่วมโปรเจ็กต์นี้ ซึ่งเป็นสตริงอักขระที่ Google APIs ไม่ได้ใช้ คุณอัปเดตได้ทุกเมื่อ
  • รหัสโปรเจ็กต์จะไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมดและเปลี่ยนแปลงไม่ได้ (เปลี่ยนไม่ได้หลังจากตั้งค่าแล้ว) Cloud Console จะสร้างสตริงที่ไม่ซ้ำกันโดยอัตโนมัติ ซึ่งโดยปกติแล้วคุณไม่จำเป็นต้องสนใจว่าสตริงนั้นคืออะไร ใน Codelab ส่วนใหญ่ คุณจะต้องอ้างอิงรหัสโปรเจ็กต์ (โดยปกติจะระบุเป็น PROJECT_ID) หากไม่ชอบรหัสที่สร้างขึ้น คุณอาจสร้างรหัสแบบสุ่มอีกรหัสหนึ่งได้ หรือคุณอาจลองใช้ชื่อของคุณเองและดูว่ามีชื่อนั้นหรือไม่ คุณจะเปลี่ยนแปลงรหัสนี้หลังจากขั้นตอนนี้ไม่ได้ และรหัสจะคงอยู่ตลอดระยะเวลาของโปรเจ็กต์
  • โปรดทราบว่ายังมีค่าที่ 3 ซึ่งก็คือหมายเลขโปรเจ็กต์ที่ API บางตัวใช้ ดูข้อมูลเพิ่มเติมเกี่ยวกับค่าทั้ง 3 นี้ได้ในเอกสารประกอบ
  1. จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร/API ของ Cloud การทำตาม Codelab นี้จะไม่เสียค่าใช้จ่ายมากนัก หรืออาจไม่เสียเลย หากต้องการปิดทรัพยากรเพื่อหลีกเลี่ยงการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ คุณสามารถลบทรัพยากรที่สร้างขึ้นหรือลบโปรเจ็กต์ได้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD

เริ่มต้น Cloud Shell

แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลในแล็ปท็อปได้ แต่ใน Codelab นี้คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานในระบบคลาวด์

จาก Google Cloud Console ให้คลิกไอคอน Cloud Shell ในแถบเครื่องมือด้านขวาบน

เปิดใช้งาน Cloud Shell

การจัดสรรและเชื่อมต่อกับสภาพแวดล้อมจะใช้เวลาเพียงไม่กี่นาที เมื่อเสร็จแล้ว คุณควรเห็นข้อความคล้ายกับตัวอย่างต่อไปนี้

ภาพหน้าจอของเทอร์มินัล Google Cloud Shell ที่แสดงว่าสภาพแวดล้อมเชื่อมต่อแล้ว

เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานบน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานทั้งหมดในโค้ดแล็บนี้ได้ภายในเบราว์เซอร์ คุณไม่จำเป็นต้องติดตั้งอะไร

3. ก่อนเริ่มต้น

เปิดใช้ API

เอาต์พุต:

ใน Cloud Shell ให้ตรวจสอบว่าได้ตั้งค่ารหัสโปรเจ็กต์แล้ว

PROJECT_ID=$(gcloud config get-value project)
echo $PROJECT_ID

ผลลัพธ์ที่คาดหวัง

student@cloudshell:~ (test-project-001-402417)$ PROJECT_ID=$(gcloud config get-value project)
our active configuration is: [cloudshell-14650]
student@cloudshell:~ (test-project-001-402417)$

หากไม่ได้กำหนดไว้ในการกำหนดค่า 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)$ 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 ใน VM ที่ใช้ Debian

สร้าง VM ใน GCE

เราต้องติดตั้งใช้งาน VM ที่มีการกำหนดค่าที่ยอมรับได้สำหรับ CPU, หน่วยความจำ และพื้นที่เก็บข้อมูล เราจะใช้รูปภาพ Debian เริ่มต้นที่มีขนาดดิสก์ของระบบเพิ่มขึ้นเป็น 20 GB เพื่อรองรับไฟล์ฐานข้อมูล 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 VM

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

เอาต์พุตคอนโซลที่คาดไว้

student@cloudshell:~ (test-project-001-402417)$ export ZONE=us-central1-a
export MACHINE_TYPE=n2-highmem-2
export DISK_SIZE=20
export MACHINE_NAME=omni01
student@cloudshell:~ (test-project-001-402417)$ 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/test-project-001-402417/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
student@cloudshell:~ (test-project-001-402417)$ 

ติดตั้ง AlloyDB Omni

เชื่อมต่อกับ VM ที่สร้างขึ้นโดยทำดังนี้

gcloud compute ssh omni01 --zone $ZONE

เอาต์พุตคอนโซลที่คาดไว้

student@cloudshell:~ (test-project-001-402417)$ 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.
student@omni01:~$

เรียกใช้คำสั่งต่อไปนี้ในเทอร์มินัลที่เชื่อมต่อ

ติดตั้ง Docker ใน VM โดยทำดังนี้

sudo apt update
sudo apt-get -y install docker.io

เอาต์พุตคอนโซลที่คาดไว้(แก้ไข)

student@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) ...
student@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

เอาต์พุตคอนโซลที่คาดไว้(แก้ไข)

student@omni01:~$ export PGPASSWORD=StrongPassword
student@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
student@omni01:~$ 

ติดตั้งซอฟต์แวร์ไคลเอ็นต์ PostgreSQL ลงใน VM (ไม่บังคับ - คาดว่าติดตั้งไว้แล้ว)

sudo apt install -y  postgresql-client

เอาต์พุตคอนโซลที่คาดไว้

student@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

เอาต์พุตคอนโซลที่คาดไว้

student@omni01:~$ psql -h localhost -U postgres
WARNING: psql major version 15, server major version 17.
         Some psql features might not work.
Type "help" for help.

postgres=#

ยกเลิกการเชื่อมต่อจาก AlloyDB Omni โดยทำดังนี้

exit

เอาต์พุตคอนโซลที่คาดไว้

postgres=# exit
student@omni01:~$ 

5. เตรียมฐานข้อมูลทดสอบ

หากต้องการทดสอบเครื่องมือ Columnar เราต้องสร้างฐานข้อมูลและป้อนข้อมูลทดสอบบางส่วน

สร้างฐานข้อมูล

เชื่อมต่อกับ VM ของ AlloyDB Omni และสร้างฐานข้อมูล

ในเซสชัน Cloud Shell ให้เรียกใช้คำสั่งต่อไปนี้

เชื่อมต่อกับ VM ของ AlloyDB Omni โดยทำดังนี้

ZONE=us-central1-a
gcloud compute ssh omni01 --zone $ZONE

เอาต์พุตคอนโซลที่คาดไว้

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/catalog/dataset/669

ก่อนอื่น เราต้องสร้างตาราง

ใน GCE VM ให้เรียกใช้คำสั่งต่อไปนี้

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,
        city text,
        state text,
        zip_code int4,
        first_active_date timestamp,
        expiry_date timestamp,
        business_phone text,
        email text,
        iowa_resident 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,
        latitude text,
        longitude text,
        physical_location text,
        address_line_2 text,
        address_line_3 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 VM ให้เรียกใช้คำสั่งต่อไปนี้

curl -L https://idh-be.iowa.gov/api/v1/datasets/669/rows.csv | sed '$d' | psql -h localhost -U postgres -d quickstart_db -c "\copy insurance_producers_licensed_in_iowa from stdin csv header"

เอาต์พุตคอนโซลที่คาดไว้

otochkin@omni01:~$ curl -L https://idh-be.iowa.gov/api/v1/datasets/669/rows.csv | sed '$d' | 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 48.0M    0 48.0M    0     0  33.9M      0 --:--:--  0:00:01 --:--:-- 33.9M
COPY 226772
otochkin@omni01:~$

เราได้โหลดระเบียน 226772 รายการเกี่ยวกับผู้ผลิตประกันภัยลงในฐานข้อมูลของเราและสามารถทำการทดสอบได้ จำนวนแถวสำหรับคุณอาจแตกต่างกันเนื่องจากชุดข้อมูลได้รับการอัปเดตทุกวัน

เรียกใช้การทดสอบการค้นหา

เชื่อมต่อกับ quickstart_db โดยใช้ psql และเปิดใช้การจับเวลาเพื่อวัดเวลาในการดำเนินการสำหรับการค้นหา

ใน GCE VM ให้เรียกใช้คำสั่งต่อไปนี้

psql -h localhost -U postgres -d quickstart_db

เอาต์พุตคอนโซลที่คาดไว้

student@omni01:~$ psql -h localhost -U postgres -d quickstart_db
psql (15.18 (Debian 15.18-0+deb12u1), server 17.7)
WARNING: psql major version 15, server major version 17.
         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 expiry_date > now() + interval '6 MONTH' 
GROUP BY city ORDER BY count(*) desc limit 5;

เอาต์พุตคอนโซลที่คาดไว้

quickstart_db=# SELECT city, count(*)
quickstart_db-# FROM insurance_producers_licensed_in_iowa
quickstart_db-# WHERE loa_has_ah ='Yes' and expiry_date > now() + interval '6 MONTH'
quickstart_db-# GROUP BY city ORDER BY count(*) desc limit 5;
    city     | count
-------------+-------
 TAMPA       |  2159
 OMAHA       |  1527
 MIAMI       |  1293
 KANSAS CITY |  1091
 DALLAS      |  1000
(5 rows)

Time: 90.492 ms

เรียกใช้การค้นหาทดสอบหลายครั้งเพื่อดูเวลาในการดำเนินการที่เชื่อถือได้ เราเห็นว่าเวลาเฉลี่ยในการแสดงผลลัพธ์อยู่ที่ประมาณ 94 มิลลิวินาที ในขั้นตอนต่อไป เราจะเปิดใช้เครื่องมือแบบคอลัมน์ของ AlloyDB และดูว่าเครื่องมือนี้จะช่วยปรับปรุงประสิทธิภาพได้หรือไม่

ออกจากเซสชัน psql โดยทำดังนี้

exit

6. เปิดใช้ Columnar Engine

ตอนนี้เราต้องเปิดใช้ Columnar Engine ใน AlloyDB Omni

อัปเดตพารามิเตอร์ AlloyDB Omni

เราต้องเปลี่ยนพารามิเตอร์อินสแตนซ์ "google_columnar_engine.enabled" เป็น "on" สำหรับ AlloyDB Omni และต้องรีสตาร์ท

อัปเดต postgresql.conf ในไดเรกทอรี /var/alloydb/config แล้วรีสตาร์ทอินสแตนซ์

ใน GCE VM ให้เรียกใช้คำสั่งต่อไปนี้

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 restart 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 restart my-omni
my-omni
student@omni01:~$

ยืนยัน Columnar Engine

เชื่อมต่อกับฐานข้อมูลโดยใช้ psql และยืนยันเครื่องมือแบบคอลัมน์

เชื่อมต่อกับฐานข้อมูล AlloyDB Omni

ในเซสชัน SSH ของ VM ให้เชื่อมต่อกับฐานข้อมูลโดยใช้คำสั่งต่อไปนี้

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 VM ให้เรียกใช้คำสั่งต่อไปนี้

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 restart my-omni 

และนี่คือเอาต์พุตที่คาดไว้

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 restart my-omni
my-omni

ยืนยันการตั้งค่า

ใน GCE VM ให้เรียกใช้คำสั่งต่อไปนี้

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 VM ให้เรียกใช้คำสั่งต่อไปนี้

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 VM ให้เรียกใช้คำสั่งต่อไปนี้

psql -h localhost -U postgres -d quickstart_db 

ในเซสชัน PSQL

เปิดใช้การจับเวลา

\timing

เรียกใช้การค้นหา 2-3 ครั้ง

SELECT city, count(*) 
FROM insurance_producers_licensed_in_iowa 
WHERE loa_has_ah ='Yes' and expiry_date > 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: 81.428 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: 82.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 | expiry_date
 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 expiry_date > now() + interval '6 MONTH' 
GROUP BY city ORDER BY count(*) desc limit 5;

ผลลัพธ์ที่คาดไว้

quickstart_db=# SELECT city, count(*)
quickstart_db-# FROM insurance_producers_licensed_in_iowa
quickstart_db-# WHERE loa_has_ah ='Yes' and expiry_date > now() + interval '6 MONTH'
quickstart_db-# GROUP BY city ORDER BY count(*) desc limit 5;
    city     | count
-------------+-------
 TAMPA       |  2159
 OMAHA       |  1527
 MIAMI       |  1293
 KANSAS CITY |  1091
 DALLAS      |  1000
(5 rows)

Time: 11.757 ms
quickstart_db=# SELECT city, count(*)
FROM insurance_producers_licensed_in_iowa
WHERE loa_has_ah ='Yes' and expiry_date > now() + interval '6 MONTH'
GROUP BY city ORDER BY count(*) desc limit 5;
    city     | count
-------------+-------
 TAMPA       |  2159
 OMAHA       |  1527
 MIAMI       |  1293
 KANSAS CITY |  1091
 DALLAS      |  1000
(5 rows)

Time: 10.839 ms

เวลาในการดำเนินการลดลงจาก 82 มิลลิวินาทีเป็น 11 มิลลิวินาที หากไม่เห็นการปรับปรุงใดๆ คุณสามารถตรวจสอบว่าระบบได้ป้อนข้อมูลคอลัมน์ลงในที่เก็บข้อมูลแบบคอลัมน์เรียบร้อยแล้วหรือไม่โดยตรวจสอบมุมมอง 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 |        637312
 insurance_producers_licensed_in_iowa | expiry_date | timestamp   | Usable |        228356
 insurance_producers_licensed_in_iowa | loa_has_ah  | text        | Usable |        227608
(3 rows)

ตอนนี้เราสามารถตรวจสอบได้ว่าแผนการดำเนินการค้นหาใช้เครื่องมือแบบคอลัมน์หรือไม่

ในเซสชัน PSQL ให้ดำเนินการดังนี้

EXPLAIN (ANALYZE,SETTINGS,BUFFERS)
SELECT city, count(*) 
FROM insurance_producers_licensed_in_iowa 
WHERE loa_has_ah ='Yes' and expiry_date > now() + interval '6 MONTH' 
GROUP BY city ORDER BY count(*) desc limit 5;

ผลลัพธ์ที่คาดไว้

quickstart_db=# EXPLAIN (ANALYZE,SETTINGS,BUFFERS)
quickstart_db-# SELECT city, count(*)
quickstart_db-# FROM insurance_producers_licensed_in_iowa
quickstart_db-# WHERE loa_has_ah ='Yes' and expiry_date > now() + interval '6 MONTH'
quickstart_db-# GROUP BY city ORDER BY count(*) desc limit 5;
                                                                                     QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 Limit  (cost=2398.48..2398.49 rows=5 width=17) (actual time=10.018..10.021 rows=5 loops=1)
   ->  Sort  (cost=2398.48..2411.61 rows=5252 width=17) (actual time=10.017..10.019 rows=5 loops=1)
         Sort Key: (count(*)) DESC
         Sort Method: top-N heapsort  Memory: 25kB
         ->  HashAggregate  (cost=2258.73..2311.25 rows=5252 width=17) (actual time=8.320..9.212 rows=7695 loops=1)
               Group Key: city
               Batches: 1  Memory Usage: 913kB
               ->  Append  (cost=20.00..1762.13 rows=99320 width=9) (actual time=8.314..8.315 rows=8595 loops=1)
                     ->  Custom Scan (columnar scan) on insurance_producers_licensed_in_iowa  (cost=20.00..1758.11 rows=99319 width=9) (actual time=8.311..8.312 rows=8595 loops=1)
                           Filter: ((loa_has_ah = 'Yes'::text) AND (expiry_date > (now() + '6 mons'::interval)))
                           Rows Removed by Columnar Filter: 127723
                           Rows Aggregated by Columnar Scan: 99049
                           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 (expiry_date > (now() + '6 mons'::interval)))
 Planning Time: 0.221 ms
 Execution Time: 10.127 ms
(17 rows)

Time: 11.171 ms

และเราเห็นว่าการดำเนินการ "Seq Scan" ในส่วนตาราง business_licenses ไม่เคยดำเนินการ และใช้ "Custom Scan (columnar scan)" แทน ซึ่งช่วยให้เราปรับปรุงเวลาในการตอบสนองจาก 82 มิลลิวินาทีเป็น 11 มิลลิวินาที

หากต้องการล้างเนื้อหาที่ป้อนอัตโนมัติจากเครื่องมือแบบคอลัมน์ เราสามารถทำได้โดยใช้ฟังก์ชัน 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=#

การสร้างที่เก็บข้อมูลแบบคอลัมน์ด้วยตนเอง

เราสามารถเพิ่มคอลัมน์ลงในที่เก็บเครื่องมือแบบคอลัมน์ได้ด้วยตนเองโดยใช้ฟังก์ชัน SQL หรือระบุเอนทิตีที่จำเป็นในแฟล็กอินสแตนซ์เพื่อโหลดโดยอัตโนมัติเมื่ออินสแตนซ์เริ่มต้น

มาเพิ่มคอลัมน์เดียวกันกับก่อนหน้านี้โดยใช้ฟังก์ชัน SQL google_columnar_engine_add กัน

ในเซสชัน PSQL ให้ดำเนินการดังนี้

SELECT google_columnar_engine_add(relation => 'insurance_producers_licensed_in_iowa', columns => 'city,expiry_date,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 expiry_date > now() + interval '6 MONTH' 
GROUP BY city ORDER BY count(*) desc limit 5;

ออกจากเซสชัน psql โดยใช้คำสั่งต่อไปนี้

exit

หากรีสตาร์ทคอนเทนเนอร์ AlloyDB Omni เราจะเห็นว่าข้อมูลแบบคอลัมน์ทั้งหมดหายไป

ในเซสชันเชลล์ ให้เรียกใช้คำสั่งต่อไปนี้

sudo docker restart 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,expiry_date,loa_has_ah\)\' >>/var/lib/postgresql/data/postgresql.conf" && \
sudo docker restart 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
--------------------------------------+-------------+-------------+--------+---------------
 insurance_producers_licensed_in_iowa | city        | text        | Usable |        637312
 insurance_producers_licensed_in_iowa | expiry_date | timestamp   | Usable |        228356
 insurance_producers_licensed_in_iowa | loa_has_ah  | text        | Usable |        227608
(3 rows)

8. ล้างสภาพแวดล้อม

ตอนนี้เราสามารถทำลาย VM ของ AlloyDB Omni ได้แล้ว

ลบ VM ของ 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 ใน VM ของ GCE ใน Google Cloud
  • วิธีเชื่อมต่อกับ AlloyDB Omni
  • วิธีโหลดข้อมูลไปยัง AlloyDB Omni
  • วิธีเปิดใช้ Columnar Engine
  • วิธีตรวจสอบเครื่องมือ Columnar ในโหมดอัตโนมัติ
  • วิธีป้อนข้อมูลในที่เก็บข้อมูลแบบคอลัมน์ด้วยตนเอง

อ่านเพิ่มเติมเกี่ยวกับการทำงานกับ Columnar Engine ได้ในเอกสารประกอบ

10. แบบสำรวจ

เอาต์พุต:

คุณจะใช้บทแนะนำนี้อย่างไร

อ่านผ่านๆ อ่านและทำแบบฝึกหัดให้เสร็จ