> ## 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.

> Este motor permite integrar o ClickHouse ao RocksDB

# Motor de tabela 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>
            Sem suporte no ClickHouse Cloud
        </div>;
};

Este motor permite integrar o ClickHouse ao [RocksDB](http://rocksdb.org/).

<div id="creating-a-table">
  ## Criando uma tabela
</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, ... ]
```

Parâmetros do motor:

* `ttl` - tempo de vida dos valores. O TTL é aceito em segundos. Se o TTL for 0, uma instância regular do RocksDB será usada (sem TTL).
* `rocksdb_dir` - caminho para o diretório de um RocksDB existente ou caminho de destino do RocksDB criado. Abre a tabela com o `rocksdb_dir` especificado.
* `read_only` - quando `read_only` é definido como true, o modo somente leitura é usado. Para armazenamento com TTL, a compactação não será acionada (nem manual nem automaticamente), portanto nenhuma entrada expirada será removida.
* `primary_key_name` – qualquer nome de coluna na lista de colunas.
* a `primary key` deve ser especificada; ela oferece suporte a apenas uma coluna na chave primária. A chave primária será serializada em formato binário como uma `rocksdb key`.
* colunas diferentes da chave primária serão serializadas em formato binário como valor `rocksdb`, na ordem correspondente.
* consultas com filtragem por chave `equals` ou `in` serão otimizadas para busca de várias chaves no `rocksdb`.

Configurações do motor:

* `optimize_for_bulk_insert` – A tabela é otimizada para inserções em massa (o pipeline de insert criará arquivos SST e os importará para o banco de dados rocksdb, em vez de gravar em memtables); valor padrão: `1`.
* `bulk_insert_block_size` - Tamanho mínimo dos arquivos SST (em número de linhas) criados por inserção em massa; valor padrão: `1048449`.

Exemplo:

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

<div id="metrics">
  ## Métricas
</div>

Há também a tabela `system.rocksdb`, que expõe estatísticas do RocksDB:

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

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

<div id="configuration">
  ## Configuração
</div>

Você também pode alterar qualquer uma das [opções do RocksDB](https://github.com/facebook/rocksdb/wiki/Option-String-and-Option-Map) usando `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>
```

Por padrão, a otimização trivial de contagem aproximada vem desativada, o que pode afetar o desempenho das consultas `count()`. Para ativar essa
otimização, defina `optimize_trivial_approximate_count_query = 1`. Além disso, essa configuração afeta `system.tables` para o motor EmbeddedRocksDB;
ative essa configuração para ver valores aproximados de `total_rows` e `total_bytes`.

<div id="supported-operations">
  ## Operações suportadas
</div>

<div id="inserts">
  ### Inserções
</div>

Quando novas linhas forem inseridas em `EmbeddedRocksDB`, se a chave já existir, o valor será atualizado; caso contrário, uma nova chave será criada.

Exemplo:

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

<div id="deletes">
  ### Exclusões
</div>

As linhas podem ser excluídas com a consulta `DELETE` ou com `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">
  ### Atualizações
</div>

Os valores podem ser atualizados por meio da consulta `ALTER TABLE`. A chave primária não pode ser atualizada.

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

<div id="joins">
  ### Junções
</div>

Há suporte a uma `direct` join especial com tabelas EmbeddedRocksDB.
Essa junção direta evita a criação de uma tabela hash na memória e acessa
os dados diretamente do EmbeddedRocksDB.

Em junções grandes, você pode observar um uso de memória muito menor com junções diretas,
porque a tabela hash não é criada.

Para habilitar junções diretas:

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

<Tip>
  Quando `join_algorithm` estiver definido como `direct, hash`, as junções diretas serão usadas
  sempre que possível; caso contrário, será usado `hash`.
</Tip>

<div id="example">
  #### Exemplo
</div>

<div id="create-and-populate-an-embeddedrocksdb-table">
  ##### Criar e popular uma tabela 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">
  ##### Crie e popule uma tabela para fazer junção com a tabela `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">
  ##### Defina o algoritmo de junção como `direct`
</div>

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

<div id="an-inner-join">
  ##### Um 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">
  ### Mais informações sobre junções
</div>

* [configuração `join_algorithm`](/pt-BR/reference/settings/session-settings#join_algorithm)
* [cláusula JOIN](/pt-BR/reference/statements/select/join)
