mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-17 13:13:36 +00:00
214 lines
13 KiB
Markdown
214 lines
13 KiB
Markdown
|
<a name="queries"></a>
|
|||
|
|
|||
|
<a name="queries-attach"></a>
|
|||
|
|
|||
|
## ATTACH
|
|||
|
Запрос полностью аналогичен запросу `CREATE`, но:
|
|||
|
|
|||
|
- вместо слова `CREATE` используется слово `ATTACH`;
|
|||
|
- запрос не создаёт данные на диске, а предполагает, что данные уже лежат в соответствующих местах, и всего лишь добавляет информацию о таблице в сервер.
|
|||
|
|
|||
|
После выполнения `ATTACH`, сервер будет знать о существовании таблицы.
|
|||
|
|
|||
|
Если таблица перед этим была отсоединена (`DETACH`), т.е. её структура известна, то можно использовать сокращенную форму записи без определения структуры.
|
|||
|
|
|||
|
```sql
|
|||
|
ATTACH TABLE [IF NOT EXISTS] [db.]name
|
|||
|
```
|
|||
|
|
|||
|
Этот запрос используется при старте сервера. Сервер хранит метаданные таблиц в виде файлов с запросами `ATTACH`, которые он просто исполняет при запуске (за исключением системных таблиц, создание которых явно вписано в сервер).
|
|||
|
|
|||
|
## DROP
|
|||
|
Запрос имеет два вида: `DROP DATABASE` и `DROP TABLE`.
|
|||
|
|
|||
|
```sql
|
|||
|
DROP DATABASE [IF EXISTS] db [ON CLUSTER cluster]
|
|||
|
```
|
|||
|
|
|||
|
Удаляет все таблицы внутри базы данных db, а затем саму базу данных db.
|
|||
|
Если указано `IF EXISTS` - не выдавать ошибку, если база данных не существует.
|
|||
|
|
|||
|
```sql
|
|||
|
DROP [TEMPORARY] TABLE [IF EXISTS] [db.]name [ON CLUSTER cluster]
|
|||
|
```
|
|||
|
|
|||
|
Удаляет таблицу.
|
|||
|
Если указано `IF EXISTS` - не выдавать ошибку, если таблица не существует или база данных не существует.
|
|||
|
|
|||
|
## DETACH
|
|||
|
Удаляет из сервера информацию о таблице name. Сервер перестаёт знать о существовании таблицы.
|
|||
|
|
|||
|
```sql
|
|||
|
DETACH TABLE [IF EXISTS] [db.]name
|
|||
|
```
|
|||
|
|
|||
|
Но ни данные, ни метаданные таблицы не удаляются. При следующем запуске сервера, сервер прочитает метаданные и снова узнает о таблице.
|
|||
|
Также, "отцепленную" таблицу можно прицепить заново запросом `ATTACH` (за исключением системных таблиц, для которых метаданные не хранятся).
|
|||
|
|
|||
|
Запроса `DETACH DATABASE` нет.
|
|||
|
|
|||
|
## RENAME
|
|||
|
Переименовывает одну или несколько таблиц.
|
|||
|
|
|||
|
```sql
|
|||
|
RENAME TABLE [db11.]name11 TO [db12.]name12, [db21.]name21 TO [db22.]name22, ... [ON CLUSTER cluster]
|
|||
|
```
|
|||
|
|
|||
|
Все таблицы переименовываются под глобальной блокировкой. Переименовывание таблицы является лёгкой операцией. Если вы указали после TO другую базу данных, то таблица будет перенесена в эту базу данных. При этом, директории с базами данных должны быть расположены в одной файловой системе (иначе возвращается ошибка).
|
|||
|
|
|||
|
## SHOW DATABASES
|
|||
|
|
|||
|
```sql
|
|||
|
SHOW DATABASES [INTO OUTFILE filename] [FORMAT format]
|
|||
|
```
|
|||
|
|
|||
|
Выводит список всех баз данных.
|
|||
|
Запрос полностью аналогичен запросу `SELECT name FROM system.databases [INTO OUTFILE filename] [FORMAT format]`.
|
|||
|
|
|||
|
Смотрите также раздел "Форматы".
|
|||
|
|
|||
|
## SHOW TABLES
|
|||
|
|
|||
|
```sql
|
|||
|
SHOW [TEMPORARY] TABLES [FROM db] [LIKE 'pattern'] [INTO OUTFILE filename] [FORMAT format]
|
|||
|
```
|
|||
|
|
|||
|
Выводит список таблиц
|
|||
|
|
|||
|
- из текущей БД или из БД db, если указано FROM db;
|
|||
|
- всех, или имя которых соответствует шаблону pattern, если указано LIKE 'pattern';
|
|||
|
|
|||
|
Запрос полностью аналогичен запросу: `SELECT name FROM system.tables WHERE database = 'db' [AND name LIKE 'pattern'] [INTO OUTFILE filename] [FORMAT format]`.
|
|||
|
|
|||
|
Смотрите также раздел "Оператор LIKE".
|
|||
|
|
|||
|
## SHOW PROCESSLIST
|
|||
|
|
|||
|
```sql
|
|||
|
SHOW PROCESSLIST [INTO OUTFILE filename] [FORMAT format]
|
|||
|
```
|
|||
|
|
|||
|
Выводит список запросов, выполняющихся в данный момент времени, кроме запросов `SHOW PROCESSLIST`.
|
|||
|
|
|||
|
Выдаёт таблицу, содержащую столбцы:
|
|||
|
|
|||
|
**user** - пользователь, под которым был задан запрос. Следует иметь ввиду, что при распределённой обработке запроса на удалённые серверы запросы отправляются под пользователем default. И SHOW PROCESSLIST показывает имя пользователя для конкретного запроса, а не для запроса, который данный запрос инициировал.
|
|||
|
|
|||
|
**address** - имя хоста, с которого был отправлен запрос. При распределённой обработке запроса на удалённых серверах — это имя хоста-инициатора запроса. Чтобы проследить, откуда был задан распределённый запрос изначально, следует смотреть SHOW PROCESSLIST на сервере-инициаторе запроса.
|
|||
|
|
|||
|
**elapsed** - время выполнения запроса, в секундах. Запросы выводятся упорядоченными по убыванию времени выполнения.
|
|||
|
|
|||
|
**rows_read**, **bytes_read** - сколько было прочитано строк, байт несжатых данных при обработке запроса. При распределённой обработке запроса суммируются данные со всех удалённых серверов. Именно эти данные используются для ограничений и квот.
|
|||
|
|
|||
|
**memory_usage** - текущее потребление оперативки в байтах. Смотрите настройку max_memory_usage.
|
|||
|
|
|||
|
**query** - сам запрос. В запросах INSERT данные для вставки не выводятся.
|
|||
|
|
|||
|
**query_id** - идентификатор запроса. Непустой, только если был явно задан пользователем. При распределённой обработке запроса идентификатор запроса не передаётся на удалённые серверы.
|
|||
|
|
|||
|
Запрос полностью аналогичен запросу: `SELECT * FROM system.processes [INTO OUTFILE filename] [FORMAT format]`.
|
|||
|
|
|||
|
Полезный совет (выполните в консоли):
|
|||
|
|
|||
|
```bash
|
|||
|
watch -n1 "clickhouse-client --query='SHOW PROCESSLIST'"
|
|||
|
```
|
|||
|
|
|||
|
## SHOW CREATE TABLE
|
|||
|
|
|||
|
```sql
|
|||
|
SHOW CREATE [TEMPORARY] TABLE [db.]table [INTO OUTFILE filename] [FORMAT format]
|
|||
|
```
|
|||
|
|
|||
|
Возвращает один столбец statement типа `String`, содержащий одно значение - запрос `CREATE`, с помощью которого создана указанная таблица.
|
|||
|
|
|||
|
## DESCRIBE TABLE
|
|||
|
|
|||
|
```sql
|
|||
|
DESC|DESCRIBE TABLE [db.]table [INTO OUTFILE filename] [FORMAT format]
|
|||
|
```
|
|||
|
|
|||
|
Возвращает два столбца: `name`, `type` типа `String`, в которых описаны имена и типы столбцов указанной таблицы.
|
|||
|
|
|||
|
Вложенные структуры данных выводятся в "развёрнутом" виде. То есть, каждый столбец - по отдельности, с именем через точку.
|
|||
|
|
|||
|
## EXISTS
|
|||
|
|
|||
|
```sql
|
|||
|
EXISTS [TEMPORARY] TABLE [db.]name [INTO OUTFILE filename] [FORMAT format]
|
|||
|
```
|
|||
|
|
|||
|
Возвращает один столбец типа `UInt8`, содержащий одно значение - `0`, если таблицы или БД не существует и `1`, если таблица в указанной БД существует.
|
|||
|
|
|||
|
## USE
|
|||
|
|
|||
|
```sql
|
|||
|
USE db
|
|||
|
```
|
|||
|
|
|||
|
Позволяет установить текущую базу данных для сессии.
|
|||
|
Текущая база данных используется для поиска таблиц, если база данных не указана в запросе явно через точку перед именем таблицы.
|
|||
|
При использовании HTTP протокола, запрос не может быть выполнен, так как понятия сессии не существует.
|
|||
|
|
|||
|
## SET
|
|||
|
|
|||
|
```sql
|
|||
|
SET param = value
|
|||
|
```
|
|||
|
|
|||
|
Позволяет установить настройку `param` в значение `value`. Также можно одним запросом установить все настройки из заданного профиля настроек - для этого, укажите в качестве имени настройки profile. Подробнее смотри раздел "Настройки".
|
|||
|
Настройка устанавливается на сессию, или на сервер (глобально), если указано `GLOBAL`.
|
|||
|
При установке глобальной настройки, настройка на все уже запущенные сессии, включая текущую сессию, не устанавливается, а будет использована только для новых сессий.
|
|||
|
|
|||
|
При перезапуске сервера, теряются настройки, установленные с помощью `SET`.
|
|||
|
Установить настройки, которые переживут перезапуск сервера, можно только с помощью конфигурационного файла сервера.
|
|||
|
|
|||
|
## OPTIMIZE
|
|||
|
|
|||
|
```sql
|
|||
|
OPTIMIZE TABLE [db.]name [PARTITION partition] [FINAL]
|
|||
|
```
|
|||
|
|
|||
|
Просит движок таблицы сделать что-нибудь, что может привести к более оптимальной работе.
|
|||
|
Поддерживается только движками `*MergeTree`, в котором выполнение этого запроса инициирует внеочередное слияние кусков данных.
|
|||
|
Если указан `PARTITION`, то оптимизация будет производиться только для указаной партиции.
|
|||
|
Если указан `FINAL`, то оптимизация будет производиться даже когда все данные уже лежат в одном куске.
|
|||
|
|
|||
|
<div class="admonition warning">
|
|||
|
Запрос OPTIMIZE не может устранить причину появления ошибки "Too many parts".
|
|||
|
</div>
|
|||
|
|
|||
|
## KILL QUERY
|
|||
|
|
|||
|
```sql
|
|||
|
KILL QUERY
|
|||
|
WHERE <where expression to SELECT FROM system.processes query>
|
|||
|
[SYNC|ASYNC|TEST]
|
|||
|
[FORMAT format]
|
|||
|
```
|
|||
|
|
|||
|
Пытается принудительно остановить исполняющиеся в данный момент запросы.
|
|||
|
Запросы для принудительной остановки выбираются из таблицы system.processes с помощью условия, указанного в секции `WHERE` запроса `KILL`.
|
|||
|
|
|||
|
Примеры:
|
|||
|
```sql
|
|||
|
-- Принудительно останавливает все запросы с указанным query_id:
|
|||
|
KILL QUERY WHERE query_id='2-857d-4a57-9ee0-327da5d60a90'
|
|||
|
|
|||
|
-- Синхронно останавливает все запросы пользователя 'username':
|
|||
|
KILL QUERY WHERE user='username' SYNC
|
|||
|
```
|
|||
|
|
|||
|
Readonly-пользователи могут останавливать только свои запросы.
|
|||
|
|
|||
|
По-умолчанию используется асинхронный вариант запроса (`ASYNC`), который не дожидается подтверждения остановки запросов.
|
|||
|
|
|||
|
Синхронный вариант (`SYNC`) ожидает остановки всех запросов и построчно выводит информацию о процессах по ходу их остановки.
|
|||
|
Ответ содержит колонку `kill_status`, которая может принимать следующие значения:
|
|||
|
|
|||
|
1. 'finished' - запрос был успешно остановлен;
|
|||
|
2. 'waiting' - запросу отправлен сигнал завершения, ожидается его остановка;
|
|||
|
3. остальные значения описывают причину невозможности остановки запроса.
|
|||
|
|
|||
|
Тестовый вариант запроса (`TEST`) только проверяет права пользователя и выводит список запросов для остановки.
|