ClickHouse/tests/instructions/easy_tasks_sorted_ru.md

211 lines
12 KiB
Markdown
Raw Normal View History

2019-02-02 00:27:25 +00:00
# Простые задачи
2020-01-14 16:07:11 +00:00
## Недостатки юзабилити, если пользователь не может прочитать конфиг клиента.
2019-02-02 00:27:25 +00:00
`programs/client/Client.cpp`
2019-02-02 00:31:58 +00:00
2020-01-14 16:07:11 +00:00
Делаем `chmod 000 /etc/clickhouse-client/config.xml` и смотрим, что получится.
2019-02-02 00:27:25 +00:00
2020-01-14 18:26:46 +00:00
## Уменьшать max_memory_usage, если на сервере мало оперативки.
2019-02-02 00:27:25 +00:00
Смотрим, сколько на сервере оперативки. Если `max_memory_usage`, `max_memory_usage_for_all_queries` ограничены, но больше 90% (настройка) от имеющейся оперативки, то уменьшать их и выводить предупреждение в лог..
2019-02-02 00:31:58 +00:00
`programs/server/Server.cpp` - инициализация сервера, установка размера кэшей
2019-02-02 00:27:25 +00:00
2019-02-02 00:31:58 +00:00
`getMemoryAmount.h` - информация о доступной оперативке
`context.setSetting` - для выставления `max_memory_usage` и других.
2019-02-02 00:27:25 +00:00
## Битовые операции для FixedString.
bitAnd, bitOr, bitNot, bitXor для значения типа FixedString, интерпретируемого как набор бит.
Сделайте сначала в C++ побитовые функции для работы с куском памяти:
2019-02-02 00:31:58 +00:00
```
2019-02-02 00:27:25 +00:00
void memoryBitAnd(const char * a, const char * b, char * result, size_t size);
2019-02-02 00:31:58 +00:00
```
2019-02-02 00:27:25 +00:00
Потом используйте их в вашей функции.
## Добавить generic вариант функций least, greatest.
`SELECT least(123, 456)` - работает.
2019-02-02 00:31:58 +00:00
2019-02-02 00:27:25 +00:00
`SELECT least('123', '456')` - не работает. Надо сделать.
2019-02-02 00:31:58 +00:00
2019-02-02 00:27:25 +00:00
Делаем с помощью `IColumn::compareAt` для одинаковых типов и с помощью `castColumn`, `getLeastSuperType` для разных.
## При ATTACH кусков, проверять владельца файлов.
Смотрим, что все файлы в прикрепляемых кусках от правильного пользователя.
## COLLATE должно работать для Nullable(String).
В ClickHouse есть возможность указать collation для сортировки строк. Это не работает для `Nullable(String)`.
## Запретить чтение значений типа AggregateFunction по-умолчанию и добавить настройку.
Состояния агрегатных функций могут быть записаны в дамп и считаны из него. Но десериализация состояний агрегатных функций небезопасна. Аккуратно выбранные пользовательские данные могут привести к segfault или порче памяти. Поэтому нужно просто сделать настройку, которая запрещает читать AggregateFunction из пользовательских данных.
## В статистику jemalloc добавить информацию по arenas.
2019-02-02 00:31:58 +00:00
В `system.asynchronous_metrics` - суммарный размер арен.
2019-02-02 00:27:25 +00:00
# Более сложные задачи
## Layout внешних словарей "direct".
Как cache, но без кэша — всегда прямой запрос в источник.
## Функции randomFixedString, randomBinaryString, fuzzBits, fuzzBytes.
2020-01-14 18:26:46 +00:00
## Агрегатные функции для статистических тестов (e.g. тест нормальности распределения) и статистик.
2019-02-02 00:27:25 +00:00
## Функции создания и обновления состояния агрегатной функции по одному кортежу аргументов.
В ClickHouse есть понятие - состояние вычисления агрегатной функции. Состояния агрегатных функций можно записывать в таблицы, складывать, финализировать и т. п. https://clickhouse.yandex/docs/ru/data_types/nested_data_structures/aggregatefunction/
2019-02-02 00:31:58 +00:00
2019-02-02 00:27:25 +00:00
Получить состояние агрегатной функции можно с помощью комбинатора State: https://clickhouse.yandex/docs/ru/query_language/agg_functions/combinators/#-state Но хотелось бы добавить ещё более простой способ получения состояния агрегатной функции.
2019-02-02 00:31:58 +00:00
2019-02-02 00:27:25 +00:00
Например:
2019-02-02 00:31:58 +00:00
2019-02-02 00:27:25 +00:00
`createAggregationState('groupArray')` - создать пустое (начальное) состояние агрегатной функции.
2019-02-02 00:31:58 +00:00
2019-02-02 00:27:25 +00:00
`createAggregationState('groupArray', 1)` - создать состояние агрегатной функции, в котором агрегировано одно значение 1.
2019-02-02 00:31:58 +00:00
2019-02-02 00:27:25 +00:00
`createAggregationState('argMax', ('hello', 123))` - то же самое для агрегатных функций, принимающих несколько аргументов.
## LEFT ONLY JOIN
## Функции makeDate, makeDateTime.
`makeDate(year, month, day)`
`makeDateTime(year, month, day, hour, minute, second, [timezone])`
## Функции changeYear, changeMonth, ...
`changeYear(datetime, 2019)`
## Исправить мерцание прогресс-бара в clickhouse-client.
Это заметно при работе с серверами с большим пингом.
Прогресс бар не должен мерцать.
Наверное, надо просто вместо очистки строки, перемещать курсор в начало, не очищая её.
## Функция rowNumberForKey.
Возвращает инкрементальное число для повторно встречающихся значений key.
## Агрегатная функция groupConcat.
`groupConcat(x, ',')` - собрать из переданных значений x строку, разделённую запятыми.
## Функции DATE_ADD, DATE_SUB как синонимы для совместимости с SQL.
https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-add
## Функции positionReverse, positionUTF8Reverse, positionCaseInsensitiveReverse, positionCaseInsensitiveUTF8Reverse.
position с конца строки.
## Функция indexOf должна поддерживать Enum-ы без cast-а.
`indexOf(arr, 'hello')`, `indexOf(arr, 1)` должны работать, если arr имеет тип `Array(Enum8('hello' = 1, 'world' = 2))`
## Комбинатор агрегатных функций Distinct.
Пример: `avgDistinct(x)` - вычислить среднее по всем различным переданным значениям.
## Метрики количества ошибок.
Добавляем счётчики всех ошибок (ErrorCodes) по аналогии с ProfileEvents. Кроме количества запоминаем также время последней ошибки, стек трейс, сообщение. Добавляем системную таблицу system.errors. Отправка в Graphite.
## Добавить Lizard, LZSSE и density в качестве вариантов алгоритмов сжатия.
Экспериментальные алгоритмы сжатия. Сейчас ClickHouse поддерживает только lz4 и zstd.
2020-01-14 18:26:46 +00:00
## Запрос CREATE OR REPLACE TABLE
2019-02-02 00:27:25 +00:00
Атомарно (под блокировкой) удаляет таблицу перед созданием новой, если такая была.
## Приведение типов для IN (subquery).
`SELECT 1 IN (SELECT -1 UNION ALL SELECT 1)`
2019-02-02 00:31:58 +00:00
2019-02-02 00:27:25 +00:00
- сейчас не работает.
## Возможность вставки значений типа AggregateFunction в виде кортежа значений аргументов, а не бинарного дампа состояния, под настройкой.
Во входных данных в запросе INSERT должна быть возможность передать значение типа AggregateFunction не в виде сериализованного состояния, а в виде аргументов, которые будут агрегированы, для формирования этого состояния.
## Возможность использовать ALIAS столбцы при INSERT.
https://clickhouse.yandex/docs/en/query_language/create/#create-table
2019-02-02 00:31:58 +00:00
2019-02-02 00:27:25 +00:00
`INSERT INTO table (column1, column2, ...)`
2019-02-02 00:31:58 +00:00
2019-02-02 00:27:25 +00:00
- если column - это ALIAS столбец, и если выражение для ALIAS тривиально (просто ссылается на другой столбец), то разрешить использовать его вместо другого столбца в запросе INSERT.
## Запрос ALTER TABLE LOCK/UNLOCK PARTITION.
Запретить модификацию данных в партиции. На партицию ставится флаг, что она заблокирована. В неё нельзя делать INSERT и ALTER. С файлов снимается доступ на запись.
## Настройка join_use_nulls: поддержка для LEFT ARRAY JOIN.
2020-01-14 18:26:46 +00:00
## Внешние словари из Aerospike/Couchbase/Cassandra (на выбор).
2019-02-02 00:27:25 +00:00
Подключить одну из key-value БД как источник.
## Движок таблиц Mongo, табличная функция mongo.
Возможность легко импортировать данные из MongoDB.
## Корректная обработка multiline значений в Pretty форматах.
SELECT 'hello\nworld' AS x, 123 AS y
```
┌─x──────────┬───y─┐
│ hello
world │ 123 │
└────────────┴─────┘
```
А надо так:
```
┌─x─────┬───y─┐
│ hello…│ 123 │
│…world │ │
└───────┴─────┘
```
## Работоспособность внешних данных на время сессии.
https://clickhouse.yandex/docs/en/operations/table_engines/external_data/
2019-02-02 00:31:58 +00:00
2019-02-02 00:27:25 +00:00
Не работает, если открыть clickhouse-client в интерактивном режиме и делать несколько запросов.
## Настройка для возможности получить частичный результат при cancel-е.
Хотим по Ctrl+C получить те данные, которые успели обработаться.
## Раскрытие кортежей в функциях высшего порядка.
## Табличная функция loop.
`SELECT * FROM loop(database, table)`
2019-02-02 00:31:58 +00:00
2019-02-02 00:27:25 +00:00
Читает данные из таблицы в бесконечном цикле.
## Возможность ATTACH партиции с меньшим или большим количеством столбцов.
## Поддержка неконстантного аргумента с тайм-зоной у некоторых функций для работы с датой и временем.
## Возможность задавать параметры соединений для табличных функций, движков таблиц и для реплик из отдельных разделов конфигурации.
## Настройка rollup_use_nulls.
## Настройка cast_keep_nullable.
## Функция bitEquals для сравнения произвольных типов данных побитово.
## Функция serialize для implementation specific non portable non backwards compatible сериализации любого типа данных в набор байт.
## Функция bitEquals и оператор <=>.