> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-mintlify-fbfa8bee.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> يتيح هذا المحرك دمج ClickHouse مع RocksDB

# محرك الجدول EmbeddedRocksDB

export const CloudNotSupportedBadge = () => {
  return <div className="cloudNotSupportedBadge">
            <div className="cloudNotSupportedIcon">
            <svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
                <path strokeWidth="1.5" d="M6.33366 12.6666L12.3739 12.6667C13.6593 12.6667 14.7073 11.6187 14.7073 10.3334C14.7073 9.04804 13.6593 8.00003 12.3739 8.00003C12.3739 8.00003 12.3337 7.66659 12.0003 7.33325M10.667 5.33322C8.00033 2.33325 4.45395 4.78537 4.14195 6.68203C2.55728 6.7627 1.29395 8.06203 1.29395 9.6667C1.29395 11.3234 2.66699 12.6666 4.00033 12.6666" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
                <path strokeWidth="1.5" d="M2.66699 14L12.0003 4.66663" stroke="currentColor" strokeLinecap="round" strokeLinejoin="round" />
            </svg>

        </div>
            غير مدعوم في ClickHouse Cloud
        </div>;
};

يتيح هذا المحرّك تكامل ClickHouse مع [RocksDB](http://rocksdb.org/).

<div id="creating-a-table">
  ## إنشاء جدول
</div>

```sql theme={null}
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`.

مثال:

```sql theme={null}
CREATE TABLE test
(
    `key` String,
    `v1` UInt32,
    `v2` String,
    `v3` Float32
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key
```

<div id="metrics">
  ## المقاييس
</div>

يوجد أيضًا جدول `system.rocksdb`، ويعرض إحصاءات rocksdb:

```sql theme={null}
SELECT
    name,
    value
FROM system.rocksdb

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

<div id="configuration">
  ## التهيئة
</div>

يمكنك أيضًا تغيير أي من [خيارات RocksDB](https://github.com/facebook/rocksdb/wiki/Option-String-and-Option-Map) باستخدام `config`:

```xml theme={null}
<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`.

<div id="supported-operations">
  ## العمليات المدعومة
</div>

<div id="inserts">
  ### عمليات الإدراج
</div>

عند إدراج صفوف جديدة في `EmbeddedRocksDB`، إذا كان المفتاح موجودًا مسبقًا، فستُحدَّث القيمة، وإلا فسيُنشأ مفتاح جديد.

مثال:

```sql theme={null}
INSERT INTO test VALUES ('some key', 1, 'value', 3.2);
```

<div id="deletes">
  ### الحذف
</div>

يمكن حذف الصفوف باستخدام استعلام `DELETE` أو الأمر `TRUNCATE`.

```sql theme={null}
DELETE FROM test WHERE key LIKE 'some%' AND v1 > 1;
```

```sql theme={null}
ALTER TABLE test DELETE WHERE key LIKE 'some%' AND v1 > 1;
```

```sql theme={null}
TRUNCATE TABLE test;
```

<div id="updates">
  ### التحديثات
</div>

يمكن تعديل القيم باستخدام الاستعلام `ALTER TABLE`. ولا يمكن تعديل المفتاح الأساسي.

```sql theme={null}
ALTER TABLE test UPDATE v1 = v1 * 10 + 2 WHERE key LIKE 'some%' AND v3 > 3.1;
```

<div id="joins">
  ### عمليات ربط
</div>

يُدعَم ربط خاص من نوع `direct` مع جداول EmbeddedRocksDB.
يتجنب هذا الـ ربط المباشر إنشاء hash table في الذاكرة، ويصل
إلى البيانات مباشرةً من EmbeddedRocksDB.

مع عمليات ربط الكبيرة، قد تلاحظ انخفاضًا ملحوظًا في memory usage عند استخدام direct joins
لأنه لا يتم إنشاء hash table.

لتمكين direct joins:

```sql theme={null}
SET join_algorithm = 'direct, hash'
```

<Tip>
  عند ضبط `join_algorithm` على `direct, hash`، ستُستخدم عمليات الربط المباشر
  كلما أمكن، وإلا فستُستخدم `hash`.
</Tip>

<div id="example">
  #### مثال
</div>

<div id="create-and-populate-an-embeddedrocksdb-table">
  ##### إنشاء جدول EmbeddedRocksDB وملؤه بالبيانات
</div>

```sql theme={null}
CREATE TABLE rdb
(
    `key` UInt32,
    `value` Array(UInt32),
    `value2` String
)
ENGINE = EmbeddedRocksDB
PRIMARY KEY key
```

```sql theme={null}
INSERT INTO rdb
    SELECT
        toUInt32(sipHash64(number) % 10) AS key,
        [key, key+1] AS value,
        ('val2' || toString(key)) AS value2
    FROM numbers_mt(10);
```

<div id="create-and-populate-a-table-to-join-with-table-rdb">
  ##### أنشئ جدولًا واملأه بالبيانات للربط مع الجدول `rdb`
</div>

```sql theme={null}
CREATE TABLE t2
(
    `k` UInt16
)
ENGINE = TinyLog
```

```sql theme={null}
INSERT INTO t2 SELECT number AS k
FROM numbers_mt(10)
```

<div id="set-the-join-algorithm-to-direct">
  ##### عيّن خوارزمية الربط إلى `direct`
</div>

```sql theme={null}
SET join_algorithm = 'direct'
```

<div id="an-inner-join">
  ##### INNER JOIN
</div>

```sql theme={null}
SELECT *
FROM
(
    SELECT k AS key
    FROM t2
) AS t2
INNER JOIN rdb ON rdb.key = t2.key
ORDER BY key ASC
```

```response theme={null}
┌─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  │
└─────┴─────────┴────────┴────────┘
```

<div id="more-information-on-joins">
  ### مزيد من المعلومات حول عمليات JOIN
</div>

* [إعداد `join_algorithm`](/ar/reference/settings/session-settings#join_algorithm)
* [بند JOIN](/ar/reference/statements/select/join)
