تسريع طلبات البحث التحليلية باستخدام محرّك الأعمدة في AlloyDB Omni

1. مقدمة

في هذا الدرس التطبيقي حول الترميز، ستتعرّف على كيفية نشر AlloyDB Omni واستخدام Columnar Engine لتحسين أداء طلبات البحث.

7da257ba067ed1b1.png

المتطلبات الأساسية

  • فهم أساسي لواجهة Google Cloud Console
  • المهارات الأساسية في واجهة سطر الأوامر وGoogle Shell

ما ستتعرّف عليه

  • كيفية نشر AlloyDB Omni على جهاز GCE الافتراضي في Google Cloud
  • كيفية الاتصال بخدمة AlloyDB Omni
  • كيفية تحميل البيانات إلى AlloyDB Omni
  • كيفية تفعيل محرّك الأعمدة
  • كيفية التحقّق من "محرك الأعمدة" في الوضع التلقائي
  • كيفية تعبئة "متجر الأعمدة" يدويًا

المتطلبات

  • حساب Google Cloud ومشروع Google Cloud
  • متصفح ويب، مثل Chrome

2. الإعداد والمتطلبات

إعداد البيئة حسب السرعة التي تناسبك

  1. سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

fbef9caa1602edd0.png

a99b7ace416376c4.png

5e3ff691252acf41.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها واجهات برمجة تطبيقات Google. ويمكنك تعديلها في أي وقت.
  • يكون معرّف المشروع فريدًا في جميع مشاريع Google Cloud وغير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تُنشئ وحدة تحكّم Cloud Console سلسلة فريدة تلقائيًا، ولا يهمّك عادةً معرفة محتواها. في معظم مختبرات الرموز البرمجية، ستحتاج إلى الإشارة إلى معرّف المشروع (يُعرَف عادةً باسم PROJECT_ID). إذا لم يعجبك المعرّف الذي تم إنشاؤه، يمكنك إنشاء معرّف آخر عشوائي. يمكنك بدلاً من ذلك تجربة عنوانك الخاص لمعرفة ما إذا كان متاحًا. ولا يمكن تغييره بعد هذه الخطوة ويبقى ساريًا طوال مدة المشروع.
  • يُرجى العِلم أنّ هناك قيمة ثالثة، وهي رقم المشروع، تستخدمها بعض واجهات برمجة التطبيقات. اطّلِع على مزيد من المعلومات عن كلّ من هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تُكلّفك المشاركة في هذا الدليل التعليمي للترميز الكثير، إن لم يكن أيّ تكلفة على الإطلاق. لإيقاف الموارد لتجنُّب تحصيل رسوم بعد انتهاء هذا الدليل التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يكون مستخدمو Google Cloud الجدد مؤهّلين للاستفادة من برنامج الفترة التجريبية المجانية التي تقدّم رصيدًا بقيمة 300 دولار أمريكي.

بدء Cloud Shell

على الرغم من أنّه يمكن تشغيل Google Cloud عن بُعد من الكمبيوتر المحمول، ستستخدم في هذا الدليل التعليمي Google Cloud Shell، وهي بيئة سطر أوامر تعمل في السحابة الإلكترونية.

من Google Cloud Console، انقر على رمز Cloud Shell في شريط الأدوات أعلى يسار الصفحة:

55efc1aaa7a4d3ad.png

من المفترض ألا تستغرق عملية توفير البيئة والاتصال بها سوى بضع لحظات. عند الانتهاء، من المفترض أن يظهر لك ما يلي:

7ffe5cbb04455448.png

يتم تحميل هذه الآلة الافتراضية مزوّدة بكل أدوات التطوير التي ستحتاج إليها. ويقدّم هذا الدليل دليلاً منزليًا دائمًا بسعة 5 غيغابايت، ويتم تشغيله على Google Cloud، ما يُحسِّن بشكل كبير أداء الشبكة والمصادقة. يمكنك تنفيذ جميع أعمالك في هذا الدليل التعليمي للترميز داخل متصفّح. لست بحاجة إلى تثبيت أي تطبيق.

3- قبل البدء

تفعيل واجهة برمجة التطبيقات

إخراج:

في 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.

إنشاء جهاز افتراضي على Google Compute Engine

يجب نشر جهاز افتراضي بإعدادات مقبولة لوحدة المعالجة المركزية والذاكرة وسعة التخزين. سنستخدم صورة Debian التلقائية مع زيادة حجم قرص النظام إلى 20 غيغابايت لاستيعاب ملفات قاعدة بيانات 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

يُرجى اتّباع الخطوات التالية للاتصال بالجهاز الافتراضي الذي تم إنشاؤه:

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 على الجهاز الظاهري:

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. من خلال الاحتفاظ بها بشكل منفصل، يمكنك إدارة الحاويات بشكل مستقل عن بياناتك واختياريًا وضعها في مساحة تخزين ذات خصائص أفضل لعمليات الإدخال/الإخراج.

في ما يلي أمر لإنشاء دليل في الدليل الرئيسي للمستخدم حيث سيتم وضع جميع البيانات:

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- إعداد قاعدة بيانات اختبارية

لاختبار "محرك الأعمدة"، نحتاج إلى إنشاء قاعدة بيانات وملؤها ببعض البيانات الاختبارية.

إنشاء قاعدة بيانات

الاتصال بجهاز AlloyDB Omni VM وإنشاء قاعدة بيانات

في جلسة Cloud Shell، نفِّذ ما يلي:

gcloud config set project $(gcloud config get-value project)

يُرجى اتّباع الخطوات التالية للاتصال بجهاز 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:~$

لقد حمّلنا 210898 سجلّاً عن منتجي التأمين إلى قاعدة بياناتنا ويمكننا إجراء بعض الاختبارات.

تنفيذ طلبات البحث الاختبارية

اربط بقاعدة بيانات 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 مدن حسب عدد جهات إصدار التأمين التي تبيع تأمينات الحوادث والتأمين الصحي والتي يكون ترخيصها صالحًا على الأقل خلال الأشهر الستة المقبلة.

في جلسة 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 العمودي وسنرى ما إذا كان بإمكانه تحسين الأداء.

يمكنك الخروج من جلسة psql باتّباع الخطوات التالية:

exit

6- تفعيل محرّك الأعمدة

نحتاج الآن إلى تفعيل "محرك الأعمدة" في 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:~$

التحقّق من Columnar Engine

اتصل بقاعدة البيانات باستخدام 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=#

ملء قاعدة بيانات العمودين يدويًا

يمكننا إضافة أعمدة إلى "متجر محرّك الأعمدة" يدويًا باستخدام دوالّ 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، يمكننا ملاحظة فقدان جميع المعلومات العمودية.

في جلسة shell، نفِّذ ما يلي:

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)' وإعادة تشغيل الحاوية.

في جلسة shell، نفِّذ ما يلي:

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

وبعد ذلك، يمكننا الاطّلاع على أنّه تمت إضافة الأعمدة إلى "متجر الأعمدة" تلقائيًا بعد بدء التشغيل.

انتظِر من 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. تهانينا

تهانينا على إكمال ورشة رموز البرامج.

المواضيع التي تناولناها

  • كيفية نشر AlloyDB Omni على جهاز GCE الافتراضي في Google Cloud
  • كيفية الاتصال بخدمة AlloyDB Omni
  • كيفية تحميل البيانات إلى AlloyDB Omni
  • كيفية تفعيل محرّك الأعمدة
  • كيفية التحقّق من "محرك الأعمدة" في الوضع التلقائي
  • كيفية تعبئة "متجر الأعمدة" يدويًا

يمكنك الاطّلاع على مزيد من المعلومات حول العمل مع "محرك الأعمدة" في المستندات.

10. استطلاع

إخراج:

كيف ستستخدم هذا الدليل التعليمي؟

قراءة الدليل فقط قراءة الدليل وإكمال التمارين