الانتقال إلى المحتوى الرئيسي
يتيح هذا المحرّك تكامل ClickHouse مع RocksDB.

إنشاء جدول

CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
    name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1],
    name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2],
    ...
) ENGINE = EmbeddedRocksDB([ttl, rocksdb_dir, read_only]) PRIMARY KEY(primary_key_name)
[ SETTINGS name=value, ... ]
معلمات المحرك:
  • ttl - مدة بقاء القيم. تُقبل قيمة TTL بالثواني. إذا كانت TTL تساوي 0، فسيُستخدم مثيل RocksDB عادي (من دون TTL).
  • rocksdb_dir - المسار إلى دليل RocksDB موجودة، أو مسار الوجهة لـ RocksDB التي سيتم إنشاؤها. يُفتح الجدول باستخدام rocksdb_dir المحدد.
  • read_only - عند تعيين read_only إلى true، يُستخدم وضع القراءة فقط. بالنسبة إلى التخزين الذي يستخدم TTL، لن يتم تشغيل عملية compaction (لا يدويًا ولا تلقائيًا)، لذلك لن تُزال أي مدخلات منتهية الصلاحية.
  • primary_key_name – أي اسم عمود في قائمة الأعمدة.
  • يجب تحديد primary key، وهو يدعم عمودًا واحدًا فقط في المفتاح الأساسي. سيُسلسل المفتاح الأساسي بصيغة binary باعتباره rocksdb key.
  • ستُسلسل الأعمدة الأخرى غير المفتاح الأساسي بصيغة binary كقيمة rocksdb بالترتيب المقابل.
  • ستُحسَّن الاستعلامات التي تتضمن تصفية للمفتاح باستخدام equals أو in إلى عمليات lookup متعددة المفاتيح من rocksdb.
إعدادات المحرك:
  • optimize_for_bulk_insert – جرى تحسين الجدول لعمليات الإدراج المجمّعة (سينشئ مسار insert ملفات SST ويستوردها إلى قاعدة بيانات rocksdb بدلًا من الكتابة إلى memtables)؛ القيمة الافتراضية: 1.
  • bulk_insert_block_size - الحد الأدنى لحجم ملفات SST (من حيث عدد الصفوف) التي ينشئها الإدراج المجمّع؛ القيمة الافتراضية: 1048449.
مثال:
CREATE TABLE test
(
    `key` String,
    `v1` UInt32,
    `v2` String,
    `v3` Float32
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key

المقاييس

يوجد أيضًا جدول system.rocksdb، ويعرض إحصاءات rocksdb:
SELECT
    name,
    value
FROM system.rocksdb

┌─name──────────────────────┬─value─┐
no.file.opens             │     1
number.block.decompressed1
└───────────────────────────┴───────┘

التهيئة

يمكنك أيضًا تغيير أي من خيارات RocksDB باستخدام config:
<rocksdb>
    <options>
        <max_background_jobs>8</max_background_jobs>
    </options>
    <column_family_options>
        <num_levels>2</num_levels>
    </column_family_options>
    <tables>
        <table>
            <name>TABLE</name>
            <options>
                <max_background_jobs>8</max_background_jobs>
            </options>
            <column_family_options>
                <num_levels>2</num_levels>
            </column_family_options>
        </table>
    </tables>
</rocksdb>
افتراضيًا، يكون تحسين العدّ التقريبي البسيط معطّلًا، وقد يؤثر ذلك في أداء استعلامات count(). لتمكين هذا التحسين، اضبط optimize_trivial_approximate_count_query = 1. يؤثر هذا الإعداد أيضًا في system.tables لمحرك EmbeddedRocksDB، لذا فعِّل هذا الإعداد لرؤية القيم التقريبية لكلٍّ من total_rows وtotal_bytes.

العمليات المدعومة

عمليات الإدراج

عند إدراج صفوف جديدة في EmbeddedRocksDB، إذا كان المفتاح موجودًا مسبقًا، فستُحدَّث القيمة، وإلا فسيُنشأ مفتاح جديد. مثال:
INSERT INTO test VALUES ('some key', 1, 'value', 3.2);

الحذف

يمكن حذف الصفوف باستخدام استعلام DELETE أو الأمر TRUNCATE.
DELETE FROM test WHERE key LIKE 'some%' AND v1 > 1;
ALTER TABLE test DELETE WHERE key LIKE 'some%' AND v1 > 1;
TRUNCATE TABLE test;

التحديثات

يمكن تعديل القيم باستخدام الاستعلام ALTER TABLE. ولا يمكن تعديل المفتاح الأساسي.
ALTER TABLE test UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;

عمليات ربط

يُدعَم ربط خاص من نوع direct مع جداول EmbeddedRocksDB. يتجنب هذا الـ ربط المباشر إنشاء hash table في الذاكرة، ويصل إلى البيانات مباشرةً من EmbeddedRocksDB. مع عمليات ربط الكبيرة، قد تلاحظ انخفاضًا ملحوظًا في memory usage عند استخدام direct joins لأنه لا يتم إنشاء hash table. لتمكين direct joins:
SET join_algorithm = 'direct, hash'
عند ضبط join_algorithm على direct, hash، ستُستخدم عمليات الربط المباشر كلما أمكن، وإلا فستُستخدم hash.

مثال

إنشاء جدول EmbeddedRocksDB وملؤه بالبيانات
CREATE TABLE rdb
(
    `key` UInt32,
    `value` Array(UInt32),
    `value2` String
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key
INSERT INTO rdb
    SELECT
        toUInt32(sipHash64(number) % 10) AS key,
        [key, key+1] AS value,
        ('val2' || toString(key)) AS value2
    FROM numbers_mt(10);
أنشئ جدولًا واملأه بالبيانات للربط مع الجدول rdb
CREATE TABLE t2
(
    `k` UInt16
)
ENGINE = TinyLog
INSERT INTO t2 SELECT number AS k
FROM numbers_mt(10)
عيّن خوارزمية الربط إلى direct
SET join_algorithm = 'direct'
INNER JOIN
SELECT *
FROM
(
    SELECT k AS key
    FROM t2
) AS t2
INNER JOIN rdb ON rdb.key = t2.key
ORDER BY key ASC
┌─key─┬─rdb.key─┬─value──┬─value2─┐
│   0 │       0 │ [0,1]  │ val20  │
│   2 │       2 │ [2,3]  │ val22  │
│   3 │       3 │ [3,4]  │ val23  │
│   6 │       6 │ [6,7]  │ val26  │
│   7 │       7 │ [7,8]  │ val27  │
│   8 │       8 │ [8,9]  │ val28  │
│   9 │       9 │ [9,10] │ val29  │
└─────┴─────────┴────────┴────────┘

مزيد من المعلومات حول عمليات JOIN

آخر تعديل في ٢٩ يونيو ٢٠٢٦