mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 08:32:02 +00:00
Merge pull request #27057 from olgarev/revolg-DOCSUP-10286_Alter_delete_in_join_table_engine
This commit is contained in:
commit
908505c12e
@ -30,65 +30,27 @@ See the detailed description of the [CREATE TABLE](../../../sql-reference/statem
|
|||||||
|
|
||||||
Enter `join_strictness` and `join_type` parameters without quotes, for example, `Join(ANY, LEFT, col1)`. They must match the `JOIN` operation that the table will be used for. If the parameters do not match, ClickHouse does not throw an exception and may return incorrect data.
|
Enter `join_strictness` and `join_type` parameters without quotes, for example, `Join(ANY, LEFT, col1)`. They must match the `JOIN` operation that the table will be used for. If the parameters do not match, ClickHouse does not throw an exception and may return incorrect data.
|
||||||
|
|
||||||
## Table Usage {#table-usage}
|
## Specifics and Recommendations {#specifics-and-recommendations}
|
||||||
|
|
||||||
### Example {#example}
|
### Data Storage {#data-storage}
|
||||||
|
|
||||||
Creating the left-side table:
|
`Join` table data is always located in the RAM. When inserting rows into a table, ClickHouse writes data blocks to the directory on the disk so that they can be restored when the server restarts.
|
||||||
|
|
||||||
``` sql
|
If the server restarts incorrectly, the data block on the disk might get lost or damaged. In this case, you may need to manually delete the file with damaged data.
|
||||||
CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog
|
|
||||||
```
|
|
||||||
|
|
||||||
``` sql
|
|
||||||
INSERT INTO id_val VALUES (1,11)(2,12)(3,13)
|
|
||||||
```
|
|
||||||
|
|
||||||
Creating the right-side `Join` table:
|
|
||||||
|
|
||||||
``` sql
|
|
||||||
CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id)
|
|
||||||
```
|
|
||||||
|
|
||||||
``` sql
|
|
||||||
INSERT INTO id_val_join VALUES (1,21)(1,22)(3,23)
|
|
||||||
```
|
|
||||||
|
|
||||||
Joining the tables:
|
|
||||||
|
|
||||||
``` sql
|
|
||||||
SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id) SETTINGS join_use_nulls = 1
|
|
||||||
```
|
|
||||||
|
|
||||||
``` text
|
|
||||||
┌─id─┬─val─┬─id_val_join.val─┐
|
|
||||||
│ 1 │ 11 │ 21 │
|
|
||||||
│ 2 │ 12 │ ᴺᵁᴸᴸ │
|
|
||||||
│ 3 │ 13 │ 23 │
|
|
||||||
└────┴─────┴─────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
As an alternative, you can retrieve data from the `Join` table, specifying the join key value:
|
|
||||||
|
|
||||||
``` sql
|
|
||||||
SELECT joinGet('id_val_join', 'val', toUInt32(1))
|
|
||||||
```
|
|
||||||
|
|
||||||
``` text
|
|
||||||
┌─joinGet('id_val_join', 'val', toUInt32(1))─┐
|
|
||||||
│ 21 │
|
|
||||||
└────────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
### Selecting and Inserting Data {#selecting-and-inserting-data}
|
### Selecting and Inserting Data {#selecting-and-inserting-data}
|
||||||
|
|
||||||
You can use `INSERT` queries to add data to the `Join`-engine tables. If the table was created with the `ANY` strictness, data for duplicate keys are ignored. With the `ALL` strictness, all rows are added.
|
You can use `INSERT` queries to add data to the `Join`-engine tables. If the table was created with the `ANY` strictness, data for duplicate keys are ignored. With the `ALL` strictness, all rows are added.
|
||||||
|
|
||||||
You cannot perform a `SELECT` query directly from the table. Instead, use one of the following methods:
|
Main use-cases for `Join`-engine tables are following:
|
||||||
|
|
||||||
- Place the table to the right side in a `JOIN` clause.
|
- Place the table to the right side in a `JOIN` clause.
|
||||||
- Call the [joinGet](../../../sql-reference/functions/other-functions.md#joinget) function, which lets you extract data from the table the same way as from a dictionary.
|
- Call the [joinGet](../../../sql-reference/functions/other-functions.md#joinget) function, which lets you extract data from the table the same way as from a dictionary.
|
||||||
|
|
||||||
|
### Deleting Data {#deleting-data}
|
||||||
|
|
||||||
|
`ALTER DELETE` queries for `Join`-engine tables are implemented as [mutations](../../../sql-reference/statements/alter/index.md#mutations). `DELETE` mutation reads filtered data and overwrites data of memory and disk.
|
||||||
|
|
||||||
### Limitations and Settings {#join-limitations-and-settings}
|
### Limitations and Settings {#join-limitations-and-settings}
|
||||||
|
|
||||||
When creating a table, the following settings are applied:
|
When creating a table, the following settings are applied:
|
||||||
@ -102,12 +64,64 @@ When creating a table, the following settings are applied:
|
|||||||
|
|
||||||
The `Join`-engine tables can’t be used in `GLOBAL JOIN` operations.
|
The `Join`-engine tables can’t be used in `GLOBAL JOIN` operations.
|
||||||
|
|
||||||
The `Join`-engine allows use [join_use_nulls](../../../operations/settings/settings.md#join_use_nulls) setting in the `CREATE TABLE` statement. And [SELECT](../../../sql-reference/statements/select/index.md) query allows use `join_use_nulls` too. If you have different `join_use_nulls` settings, you can get an error joining table. It depends on kind of JOIN. When you use [joinGet](../../../sql-reference/functions/other-functions.md#joinget) function, you have to use the same `join_use_nulls` setting in `CRATE TABLE` and `SELECT` statements.
|
The `Join`-engine allows to specify [join_use_nulls](../../../operations/settings/settings.md#join_use_nulls) setting in the `CREATE TABLE` statement. [SELECT](../../../sql-reference/statements/select/index.md) query should have the same `join_use_nulls` value.
|
||||||
|
|
||||||
## Data Storage {#data-storage}
|
## Usage Examples {#example}
|
||||||
|
|
||||||
`Join` table data is always located in the RAM. When inserting rows into a table, ClickHouse writes data blocks to the directory on the disk so that they can be restored when the server restarts.
|
Creating the left-side table:
|
||||||
|
|
||||||
If the server restarts incorrectly, the data block on the disk might get lost or damaged. In this case, you may need to manually delete the file with damaged data.
|
``` sql
|
||||||
|
CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog;
|
||||||
|
```
|
||||||
|
|
||||||
[Original article](https://clickhouse.tech/docs/en/operations/table_engines/join/) <!--hide-->
|
``` sql
|
||||||
|
INSERT INTO id_val VALUES (1,11)(2,12)(3,13);
|
||||||
|
```
|
||||||
|
|
||||||
|
Creating the right-side `Join` table:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id);
|
||||||
|
```
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
INSERT INTO id_val_join VALUES (1,21)(1,22)(3,23);
|
||||||
|
```
|
||||||
|
|
||||||
|
Joining the tables:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id);
|
||||||
|
```
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌─id─┬─val─┬─id_val_join.val─┐
|
||||||
|
│ 1 │ 11 │ 21 │
|
||||||
|
│ 2 │ 12 │ 0 │
|
||||||
|
│ 3 │ 13 │ 23 │
|
||||||
|
└────┴─────┴─────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
As an alternative, you can retrieve data from the `Join` table, specifying the join key value:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT joinGet('id_val_join', 'val', toUInt32(1));
|
||||||
|
```
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌─joinGet('id_val_join', 'val', toUInt32(1))─┐
|
||||||
|
│ 21 │
|
||||||
|
└────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
Deleting a row from the `Join` table:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
ALTER TABLE id_val_join DELETE WHERE id = 3;
|
||||||
|
```
|
||||||
|
|
||||||
|
```text
|
||||||
|
┌─id─┬─val─┐
|
||||||
|
│ 1 │ 21 │
|
||||||
|
└────┴─────┘
|
||||||
|
```
|
||||||
|
@ -27,68 +27,30 @@ CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
|
|||||||
|
|
||||||
Вводите параметры `join_strictness` и `join_type` без кавычек, например, `Join(ANY, LEFT, col1)`. Они должны быть такими же как и в той операции `JOIN`, в которой таблица будет использоваться. Если параметры не совпадают, ClickHouse не генерирует исключение и может возвращать неверные данные.
|
Вводите параметры `join_strictness` и `join_type` без кавычек, например, `Join(ANY, LEFT, col1)`. Они должны быть такими же как и в той операции `JOIN`, в которой таблица будет использоваться. Если параметры не совпадают, ClickHouse не генерирует исключение и может возвращать неверные данные.
|
||||||
|
|
||||||
## Использование таблицы {#ispolzovanie-tablitsy}
|
## Особенности и рекомендации {#specifics-and-recommendations}
|
||||||
|
|
||||||
### Пример {#primer}
|
### Хранение данных {#data-storage}
|
||||||
|
|
||||||
Создание левой таблицы:
|
Данные таблиц `Join` всегда находятся в оперативной памяти. При вставке строк в таблицу ClickHouse записывает блоки данных в каталог на диске, чтобы их можно было восстановить при перезапуске сервера.
|
||||||
|
|
||||||
``` sql
|
При аварийном перезапуске сервера блок данных на диске может быть потерян или повреждён. В последнем случае может потребоваться вручную удалить файл с повреждёнными данными.
|
||||||
CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog
|
|
||||||
```
|
|
||||||
|
|
||||||
``` sql
|
### Выборка и добавление данных {#selecting-and-inserting-data}
|
||||||
INSERT INTO id_val VALUES (1,11)(2,12)(3,13)
|
|
||||||
```
|
|
||||||
|
|
||||||
Создание правой таблицы с движком `Join`:
|
|
||||||
|
|
||||||
``` sql
|
|
||||||
CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id)
|
|
||||||
```
|
|
||||||
|
|
||||||
``` sql
|
|
||||||
INSERT INTO id_val_join VALUES (1,21)(1,22)(3,23)
|
|
||||||
```
|
|
||||||
|
|
||||||
Объединение таблиц:
|
|
||||||
|
|
||||||
``` sql
|
|
||||||
SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id) SETTINGS join_use_nulls = 1
|
|
||||||
```
|
|
||||||
|
|
||||||
``` text
|
|
||||||
┌─id─┬─val─┬─id_val_join.val─┐
|
|
||||||
│ 1 │ 11 │ 21 │
|
|
||||||
│ 2 │ 12 │ ᴺᵁᴸᴸ │
|
|
||||||
│ 3 │ 13 │ 23 │
|
|
||||||
└────┴─────┴─────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
В качестве альтернативы, можно извлечь данные из таблицы `Join`, указав значение ключа объединения:
|
|
||||||
|
|
||||||
``` sql
|
|
||||||
SELECT joinGet('id_val_join', 'val', toUInt32(1))
|
|
||||||
```
|
|
||||||
|
|
||||||
``` text
|
|
||||||
┌─joinGet('id_val_join', 'val', toUInt32(1))─┐
|
|
||||||
│ 21 │
|
|
||||||
└────────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
### Выборка и вставка данных {#vyborka-i-vstavka-dannykh}
|
|
||||||
|
|
||||||
Для добавления данных в таблицы с движком `Join` используйте запрос `INSERT`. Если таблица создавалась со строгостью `ANY`, то данные с повторяющимися ключами игнорируются. Если задавалась строгость `ALL`, то добавляются все строки.
|
Для добавления данных в таблицы с движком `Join` используйте запрос `INSERT`. Если таблица создавалась со строгостью `ANY`, то данные с повторяющимися ключами игнорируются. Если задавалась строгость `ALL`, то добавляются все строки.
|
||||||
|
|
||||||
Из таблиц нельзя выбрать данные с помощью запроса `SELECT`. Вместо этого, используйте один из следующих методов:
|
Основные применения `Join` таблиц:
|
||||||
|
|
||||||
- Используйте таблицу как правую в секции `JOIN`.
|
- Использование в правой части секции `JOIN`.
|
||||||
- Используйте функцию [joinGet](../../../engines/table-engines/special/join.md#joinget), которая позволяет извлекать данные из таблицы таким же образом как из словаря.
|
- Извлечение данных из таблицы таким же образом как из словаря с помощью функции [joinGet](../../../engines/table-engines/special/join.md#joinget).
|
||||||
|
|
||||||
|
### Удаление данных {#deleting-data}
|
||||||
|
|
||||||
|
Запросы `ALTER DELETE` для таблиц с движком `Join` выполняются как [мутации](../../../sql-reference/statements/alter/index.md#mutations). При выполнении мутации `DELETE` считываются отфильтрованные данные и перезаписываются в оперативную память и на диск.
|
||||||
|
|
||||||
### Ограничения и настройки {#join-limitations-and-settings}
|
### Ограничения и настройки {#join-limitations-and-settings}
|
||||||
|
|
||||||
При создании таблицы, применяются следующие параметры :
|
При создании таблицы применяются следующие настройки:
|
||||||
|
|
||||||
- [join_use_nulls](../../../operations/settings/settings.md#join_use_nulls)
|
- [join_use_nulls](../../../operations/settings/settings.md#join_use_nulls)
|
||||||
- [max_rows_in_join](../../../operations/settings/query-complexity.md#settings-max_rows_in_join)
|
- [max_rows_in_join](../../../operations/settings/query-complexity.md#settings-max_rows_in_join)
|
||||||
@ -99,11 +61,64 @@ SELECT joinGet('id_val_join', 'val', toUInt32(1))
|
|||||||
|
|
||||||
Таблицы с движком `Join` нельзя использовать в операциях `GLOBAL JOIN`.
|
Таблицы с движком `Join` нельзя использовать в операциях `GLOBAL JOIN`.
|
||||||
|
|
||||||
Движок `Join` позволяет использовать параметр [join_use_nulls](../../../operations/settings/settings.md#join_use_nulls) в запросе `CREATE TABLE`, который также можно использовать в запросе [SELECT](../../../engines/table-engines/special/join.md). Если у вас разные настройки `join_use_nulls`, вы можете получить сообщение об ошибке при объединении таблиц. Это зависит от типа соединения. Когда вы используете функцию [joinGet](../../../engines/table-engines/special/join.md#joinget), вам необходимо использовать один и тот же параметр `join_use_nulls` в запросах `CRATE TABLE` и `SELECT`.
|
Движок `Join` позволяет использовать настройку [join_use_nulls](../../../operations/settings/settings.md#join_use_nulls) в запросе `CREATE TABLE`. Необходимо использовать одно и то же значение параметра `join_use_nulls` в запросах `CRATE TABLE` и `SELECT`.
|
||||||
|
|
||||||
## Хранение данных {#khranenie-dannykh}
|
## Примеры использования {#example}
|
||||||
|
|
||||||
Данные таблиц `Join` всегда находятся в RAM. При вставке строк в таблицу ClickHouse записывает блоки данных в каталог на диске, чтобы их можно было восстановить при перезапуске сервера.
|
Создание левой таблицы:
|
||||||
|
|
||||||
При аварийном перезапуске сервера блок данных на диске может быть потерян или повреждён. В последнем случае, может потребоваться вручную удалить файл с повреждёнными данными.
|
``` sql
|
||||||
|
CREATE TABLE id_val(`id` UInt32, `val` UInt32) ENGINE = TinyLog;
|
||||||
|
```
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
INSERT INTO id_val VALUES (1,11)(2,12)(3,13);
|
||||||
|
```
|
||||||
|
|
||||||
|
Создание правой таблицы с движком `Join`:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
CREATE TABLE id_val_join(`id` UInt32, `val` UInt8) ENGINE = Join(ANY, LEFT, id);
|
||||||
|
```
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
INSERT INTO id_val_join VALUES (1,21)(1,22)(3,23);
|
||||||
|
```
|
||||||
|
|
||||||
|
Объединение таблиц:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT * FROM id_val ANY LEFT JOIN id_val_join USING (id);
|
||||||
|
```
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌─id─┬─val─┬─id_val_join.val─┐
|
||||||
|
│ 1 │ 11 │ 21 │
|
||||||
|
│ 2 │ 12 │ 0 │
|
||||||
|
│ 3 │ 13 │ 23 │
|
||||||
|
└────┴─────┴─────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
В качестве альтернативы, можно извлечь данные из таблицы `Join`, указав значение ключа объединения:
|
||||||
|
|
||||||
|
``` sql
|
||||||
|
SELECT joinGet('id_val_join', 'val', toUInt32(1));
|
||||||
|
```
|
||||||
|
|
||||||
|
``` text
|
||||||
|
┌─joinGet('id_val_join', 'val', toUInt32(1))─┐
|
||||||
|
│ 21 │
|
||||||
|
└────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
Удаление данных из таблицы `Join`:
|
||||||
|
|
||||||
|
```sql
|
||||||
|
ALTER TABLE id_val_join DELETE WHERE id = 3;
|
||||||
|
```
|
||||||
|
|
||||||
|
```text
|
||||||
|
┌─id─┬─val─┐
|
||||||
|
│ 1 │ 21 │
|
||||||
|
└────┴─────┘
|
||||||
|
```
|
||||||
|
Loading…
Reference in New Issue
Block a user