الانتقال إلى المحتوى الرئيسي
يضع Join Order Benchmark (JOB) محسّن الاستعلامات تحت الضغط عبر 113 استعلامًا تحليليًا على مجموعة بيانات واقعية عالية الارتباط (لقطة من IMDb). ومنذ تقديمه، أصبح اختبار JOB المعيار الفعلي لتقييم أداء محسّنات استعلامات قواعد البيانات العلائقية، بما في ذلك تقدير الكاردينالية وتحسين ترتيب الربط. وعلى عكس الاختبارات المعيارية الاصطناعية التي تفترض بيانات متجانسة ومستقلة، يستخدم JOB بيانات حقيقية تتضمن انحرافًا وارتباطات، مما يجعله اختبارًا صعبًا لترتيب عمليات الربط وتقدير الكاردينالية. تضم مجموعة البيانات نحو 74 مليون صف موزعة على 21 جدولًا، وتشغل حوالي 1.15 GiB بصيغة مضغوطة في ClickHouse. تُنظَّم الاستعلامات البالغ عددها 113 ضمن 33 عائلة (133). وتشترك الاستعلامات داخل العائلة الواحدة (a, b, c, …) في مخطط الربط نفسه، لكنها تختلف في شروط التصفية الخاصة بها. المراجع

إنشاء الجداول

مجموعة بيانات JOB هي لقطة من IMDb تضم 21 جدولًا. تتوفر تعريفات الجداول في init_cloud.sql في مستودع ClickHouse. يستخدم كل جدول المحرّك MergeTree، ويُرتَّب حسب عمود المفتاح الأساسي id، بما يعكس مخطط PostgreSQL الأصلي حيث يعرّف كل جدول id integer NOT NULL PRIMARY KEY. وتُعيَّن أعمدة PostgreSQL التي تقبل NULL إلى الأنواع Nullable(...). أنشئ الجداول:
curl -O https://raw.githubusercontent.com/ClickHouse/ClickHouse/master/tests/benchmarks/job/init_cloud.sql
clickhouse client --query "CREATE DATABASE IF NOT EXISTS job"
clickhouse client --database job --queries-file init_cloud.sql

تحميل البيانات

تأتي البيانات من لقطة IMDb الأصلية المستخدمة في JOB، والموزعة على شكل ملف CSV واحد لكل جدول (aka_name.csv, title.csv, …). تستخدم ملفات CSV هذه دلالات COPY الخاصة بـ PostgreSQL مع ESCAPE '\': إذ يُستخدم backslash لتجاهل تأثير حرف الاقتباس فقط داخل حقل محاط بعلامتَي اقتباس، بينما يكون backslash خارج علامات الاقتباس حرفًا عاديًا. ويتوقع ClickHouse ملفات CSV المتوافقة مع RFC 4180 (علامات اقتباس مزدوجة، من دون استخدام backslash كحرف هروب)، لذا يجب إعادة ترميز الملفات أولًا. ينفّذ convert_csv.py عملية إعادة الترميز هذه. فهو يقرأ ملف CSV الأصلي من stdin ويكتب ملف CSV قياسيًا إلى stdout، مع مضاعفة علامات الاقتباس المضمّنة والحفاظ على الحقول الفارغة غير المحاطة بعلامات اقتباس (والتي يعيّنها ClickHouse إلى NULL في الأعمدة من النوع Nullable). لبناء الجداول من ملفات CSV الأصلية:
  • أنشئ الجداول (انظر أعلاه).
  • نزّل مجموعة بيانات IMDb كملف imdb.tgz، باتباع التعليمات الواردة في مستودع Join Order Benchmark.
  • حوّل البيانات واستوردها:
set -euo pipefail

for table in aka_name aka_title cast_info char_name comp_cast_type company_name \
             company_type complete_cast info_type keyword kind_type link_type \
             movie_companies movie_info movie_info_idx movie_keyword movie_link \
             name person_info role_type title; do
    echo "Loading ${table} ..."
    python3 convert_csv.py < "${table}.csv" > "${table}.clean.csv"
    clickhouse client --database job --query "INSERT INTO ${table} FORMAT CSV" < "${table}.clean.csv"
done
بعد تعبئة الجداول بالبيانات، يمكن تصديرها إلى Parquet لتسريع إعادة استيرادها لاحقًا، على سبيل المثال: clickhouse client --database job --query "SELECT * FROM title ORDER BY id FORMAT Parquet" > title.parquet. الأحجام التفصيلية للجداول:
Tableالحجم (عدد الصفوف)الحجم (بعد الضغط في ClickHouse)
aka_name901,34331.86 MiB
aka_title361,47214.32 MiB
cast_info36,244,344296.25 MiB
char_name3,140,339107.95 MiB
comp_cast_type4132.00 B
company_name234,9978.38 MiB
company_type4162.00 B
complete_cast135,086748.80 KiB
info_type1131.25 KiB
keyword134,1701.88 MiB
kind_type7177.00 B
link_type18284.00 B
movie_companies2,609,12921.20 MiB
movie_info14,835,720300.46 MiB
movie_info_idx1,380,0358.01 MiB
movie_keyword4,523,93021.06 MiB
movie_link29,997178.21 KiB
name4,167,491131.16 MiB
person_info2,963,664154.12 MiB
role_type12246.00 B
title2,528,31278.04 MiB
الإجمالي74,190,1871.15 GiB
(أُخذت الأحجام المضغوطة في ClickHouse من system.tables.total_bytes، وهي تستند إلى تعريفات الجداول الواردة أعلاه.)

الاستعلامات

يمكن العثور على استعلامات JOB البالغ عددها 113 هنا في مستودع ClickHouse. أما الإعدادات المستخدمة لتشغيلها، فهي موجودة في settings.json. راجِع ملف README للاطلاع على المشكلات المعروفة والملاحظات المتعلقة ببعض الاستعلامات. تشير الاستعلامات إلى الجداول بأسمائها، لذا شغّلها على قاعدة البيانات job (على سبيل المثال، باستخدام clickhouse client --database job). مثال على استعلام (1a):
SELECT MIN(mc.note) AS production_note,
       MIN(t.title) AS movie_title,
       MIN(t.production_year) AS movie_year
FROM company_type AS ct,
     info_type AS it,
     movie_companies AS mc,
     movie_info_idx AS mi_idx,
     title AS t
WHERE ct.kind = 'production companies'
  AND it.info = 'top 250 rank'
  AND mc.note NOT LIKE '%(as Metro-Goldwyn-Mayer Pictures)%'
  AND (mc.note LIKE '%(co-production)%'
       OR mc.note LIKE '%(presents)%')
  AND ct.id = mc.company_type_id
  AND t.id = mc.movie_id
  AND t.id = mi_idx.movie_id
  AND mc.movie_id = mi_idx.movie_id
  AND it.id = mi_idx.info_type_id;
آخر تعديل في ٢٥ يونيو ٢٠٢٦