> ## Documentation Index
> Fetch the complete documentation index at: https://private-7c7dfe99-home-button.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>
            Not supported in 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` должен быть указан; поддерживается только один столбец в первичном ключе. Первичный ключ будет сериализован в бинарном виде как `rocksdb key`.
* столбцы, кроме первичного ключа, будут сериализованы в бинарном виде как значение `rocksdb` в соответствующем порядке.
* запросы с фильтрацией по ключу через `equals` или `in` будут оптимизированы в поиск по нескольким ключам в `rocksdb`.

Настройки движка:

* `optimize_for_bulk_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">
  ### Операции JOIN
</div>

Поддерживается специальный `direct` JOIN с таблицами EmbeddedRocksDB.
Этот `direct` JOIN позволяет избежать создания хеш-таблицы в памяти и обращаться
к данным напрямую в EmbeddedRocksDB.

При больших JOIN использование памяти при `direct` JOIN может быть значительно ниже,
поскольку хеш-таблица не создаётся.

Чтобы включить `direct` JOIN:

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

<Tip>
  Когда для `join_algorithm` задано значение `direct, hash`, по возможности будет использоваться direct JOIN,
  а в остальных случаях — 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">
  ##### Создайте и заполните таблицу для выполнения JOIN с таблицей `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">
  ##### Установите для алгоритма JOIN значение `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`](/ru/reference/settings/session-settings#join_algorithm)
* [оператор JOIN](/ru/reference/statements/select/join)
