Skip to content

Instantly share code, notes, and snippets.

@alexey-milovidov
Last active September 30, 2021 01:21
Show Gist options
  • Select an option

  • Save alexey-milovidov/6ab4df223d4c9a8a2e78b34486864eaa to your computer and use it in GitHub Desktop.

Select an option

Save alexey-milovidov/6ab4df223d4c9a8a2e78b34486864eaa to your computer and use it in GitHub Desktop.
+ - сделано хотя бы в master
* - в процессе
Доработки форматов.
+ Protobuf
+ Parquet
+ Avro
+ Настраиваемое поведение CSV: separator.
+ Настраиваемое поведение CSV: empty_as_null, null_literal_as_null.
+ Template формат.
+ Regexp/TrashSQL формат.
+ Поддержка вычислимых default выражений.
+ Ускорение slow-path формата VALUES с помощью автоматического создания шаблонов.
+ Парсинг DateTime в виде unix timestamp без кавычек, без переключения на slow path.
+ Парсинг и форматирование (под опцией) DateTime в полном ISO-8601 с указанием UTC/Z/+-NNNN.
Возможность указания custom формата для парсинга DateTime и Date.
* Возможность вывода типов по блоку данных - для более простого использования clickhouse-local.
+ Возможность параллельного парсинга форматов.
Запретить чтение значений типа AggregateFunction по-умолчанию и добавить настройку.
+ Возможность вставки значений типа AggregateFunction в виде кортежа значений аргументов, а не бинарного дампа состояния, под настройкой.
+ Cache словари на SSD с созданием key -> offset индекса.
* Возможность ввода/вывода Nested структур данных с сохранением вложенности в JSON, XML, Protobuf.
Доработки словарей.
+ Перевести тесты словарей на интеграционные тесты.
+ Частичная перезагрузка словарей при их обновлении.
+ Создание словарей DDL запросом.
+ Поддержка массивов в словарях.
+ Поддержка чтения NULL в словарях.
+ Возможность (под опцией) строить обратное отображение в памяти и реализовать функции dictGetChildren, dictGetChild для injective случая.
+ Возможность зарегистрировать некоторые функции под пользовательскими именами.
* Подключение Redis, Couchbase, Cassandra.
Доработки внешних баз данных.
+ Интеграционные тесты.
+ Поддержать передачу условий, содержащих constant expressions, а не только констант.
+ Поддержать передачу условий с IN, LIKE.
Движок таблиц MongoDB.
- Табличная функция yt.
+ Табличная функция url (пример - чтение из S3).
* Refreshable materialized views из внешних баз данных.
+ Подписка на репликацию MySQL с помощью libslave.
Доработки интерфейсов.
+ Возможность интерактивного ввода пароля для clickhouse-client.
+ Возможность отправить запрос POST-ом при наличии внешних данных по HTTP.
+ Возможность преобразовывать данные во время INSERT (INSERT SELECT FROM input(...))
Возможность использовать ALIAS столбцы при INSERT.
+ Подсказки на основе edit distance.
+ Autocomplete в clickhouse-client.
+ Подключение LDAP для справочника пользователей.
Асинхронный протокол работы сервера.
+ Поддержка MySQL wire protocol.
Хранение данных.
+ O_DIRECT для мержей.
+ Оптимизация алгоритма выбора кусков для мержа.
+ Встраивание буферизации непосредственно в MergeTree.
+ Custom и stackable форматы сжатия для каждого стобца.
+ Хранение старых кусков на другом разделе.
+ Хранение данных на нескольких разделах (нарезка больших кусков по разделам).
+ Пережатие старых данных более сильным алгоритмом в фоне.
+ Адаптивный index_granularity (по байтам, а не только по числу строк).
+ Индексные структуры данных для пропуска данных.
+ Кодирование строк с помощью словаря и частичная обработка запроса без подстановки значений словаря. Скорее всего part-local словари.
+ Добавление понятия мутаций в ReplicatedMergeTree: ALTER UPDATE/DELETE.
+ ALTER RENAME.
+ Возможность изменения первичного ключа если оно не меняет порядок сортировки.
* Версионность состояний агрегатных функций для обратной совместимости.
Идентификация состояний агрегатных функций отдельно от самих агрегатных функций, чтобы понимать, что некоторые агрегатные функции могут использовать состояние друг друга: например, в функцию sumMerge можно передать состояние функции sumIf, а не только sum.
Полноценная поддержка DELETE с помощью записи и репликации дельт в виде rownumber удалённых строк внутри part и множества удалённых первичных ключей.
+ DROP PARTITION не должен ходить на реплику под пользователем default.
+ Хранение таблицы в нескольких физических представлениях.
+ Возможность включить fsync для больших кусков или при удалении составляющих кусков.
+ CREATE TABLE ... OR REPLACE;
+ TRUNCATE TABLE.
+ Атомарный перенос или копирование партиции из другой таблицы с такой же структурой.
+ ATTACH PARTITION должен уметь прикреплять на всех репликах, где идентичные данные есть локально.
+ TTL для данных, в том числе по отдельным столбцам.
Типы данных.
+ Доделать мелочи с UUID.
+ Добавить Decimal (Decimal64, Decimal128).
+ DateTimeWithMilli(?)seconds, сохраняющий значение в два файла.
Репликация и шардирование.
Включить синхронную вставку в Distributed таблицах по-умолчанию.
Переделать ReplicatedMergeTree.
+ Переписать библиотеку libzookeeper.
+ Исправить дребезг в сообщениях There are 10000 active watches.
+ Возможность указания имени кластера в функции, аналогичной remote: SELECT ... FROM cluster(name, database, table).
Облачные таблицы.
+ Возможность включить использование ключа шардирования для исключения шардов при распределённых SELECT-ах.
+ Возможность использовать кворумную запись без линеаризуемости.
+ Возможность вручную записать один и тот же блок на несколько реплик (не выбрасывать блок, если на реплике его ещё не было).
+ Исправить разрастание очереди при длительной недоступности реплики; режим восстановления реплики, если не хватает лога.
+ Атомарное удаление таблиц типа ReplicatedMergeTree.
Режим восстановления сервера путём клонирования всех БД и таблиц с другого сервера.
- Правильная утилита копирования данных между разными кластерами ZK или директориями.
Конвейер выполнения и анализ запроса.
+ Использование индекса для (tuple) IN ...
+ Использование индекса для ... IN (subquery)
+ Пробрасывание WHERE во внутрь подзапросов и VIEW.
+ Возможность использования подзапросов в VIEW.
+ Использование первичного ключа при ORDER BY monotonic(PK)
Использование первичного ключа при GROUP BY injective(subset(PK)).
+ WITH ROLLUP, WITH CUBE.
+ Возможность использования нескольких потоков для INSERT при INSERT SELECT.
- Триггеры ON INSERT как более очевидная альтернатива MATERIALIZED VIEW.
+ Переделать UNION ALL.
+ Приведение типов для UNION ALL.
+ Приведение типов для промежуточных результатов Distributed запросов.
+ Добавить getHeader в каждый stream.
+ Агрегация по пустоте должна отдавать одну строчку с результатом.
+ Поддержка constexpr в LIMIT, LIMIT BY.
+ Модификатор WITH TIES для LIMIT с ORDER BY.
+ Модификатор FILL для ORDER BY - заполнить промежуточные значения.
+ Синтаксис TOP N как альтернатива LIMIT. Синтаксис LIMIT OFFSET.
Запрос EXPLAIN.
+ Перейти с pull/push схемы работы конвейера на управляемую снаружи схему.
+ Избавиться от prerequisites для функций; переработка реализации лямбда функций.
* Декларативные сигнатуры функций.
p2p передача данных для GLOBAL подзапросов.
+ Кодогенерация для простых выражений с помощью LLVM.
+ Merge join.
shuffle данных для выполнения сложных JOIN вместо broadcast.
Кэширование промежуточных данных выполнения запроса.
- Взаимная интеграция аллокатора памяти и кэша.
* Переделать ExpressionAnalyzer.
+ Short-curcuit выполнение некоторых функций.
* Разделение блока на несколько в случае больших ARRAY JOIN и ALL JOIN.
+ Ускорить FINAL путём распараллеливания.
Многоступенчатый PREWHERE.
Пробрасывание утверждений о данных в блоки данных. Для примера, в блоке данных может быть написано, что данные в таком-то диапазоне - чтобы избежать лишних вычислений при фильтрации.
* Возможность полноценной работы с Nested структурами данных: SELECT nested, nested.*, arrayMap(..., nested)...
Избавиться от проверки типов, когда конвейер запроса уже построен (функции должны предоставлять готовый std::function, внутри которого все типы известны).
Избавиться от поиска имён, когда конвейер запроса уже построен.
+ Window функции.
Сборка и инфраструктура.
- Swappable бинарники.
+ По-нормальному протестировать jemalloc vs. tcmalloc.
+ Попробовать lfalloc из Аркадии с модификациями.
+ Использовать libmariadb.
+ Использовать libressl.
+ Работа над ODBC драйвером.
+ Публикация артефактов сборки и логов сборки в S3.
+ Контролируемая нами инфраструктура CI.
+ Добавить файлы для Uncrustify.
Интроспекция, мониторинг и ограничение ресурсов.
+ Отслеживание user/system времени CPU в каждом потоке.
+ Отслеживание IO и IOPS в каждом потоке.
+ Отслеживание network bytes в каждом потоке.
+ ProfileEvents в каждом потоке.
+ Писать общий лог в системную таблицу.
+ Писать идентификатор запроса в каждой строке лога, которая относится к запросу.
+ Возможность отправлять лог выполнения запроса на клиент.
+ Добавить query_thread_log в дополнение к query_log.
+ Писать системные метрики в системную таблицу.
* Иерархические пулы ресурсов.
+ Таблицы system.users, system.quotas.
Метрики типа квантилей времени в дополнение к ProfileEvents и CurrentMetrics.
Отслеживание времени выполнения функций и запись в системную таблицу.
Трейспоинты.
Документация.
+ Генератор тестовых данных.
Whitepaper по ClickHouse для того, чтобы другие могли ссылаться.
* Обновить бенчмарки MonetDB и MemSQL.
* Добавить бенчмарки Baidu Palo.
Перенос документации внутрь кода и реализация генератора .md файлов на её основе.
FAQ по ClickHouse.
Функции.
+ Агрегатная функция для гистограмм.
+ Упрощенный и более эффективный вариант функции sequenceMatch, sequenceCount.
+ Функции преобразования base64.
+ Функция округления до явно заданного списка границ.
+ Функции создания и обновления состояния агрегатной функции по одному кортежу аргументов.
Поддержка NULL в функции transform.
Поддержка массивов в функции transform.
+ Функция extract для компонентов Date, DateTime.
Функции makeDate, makeDateTime.
Функции changeYear, changeMonth, ...
+ Функция format для вставки значений в строку-шаблон.
+ Функция форматирования Date, DateTime с пользовательским форматом.
+ Функция парсинга Date, DateTime в неизвестном формате.
* Комбинатор агрегатных функций Distinct.
Прочие оптимизации.
+ Per-column radix sort для сортировки.
+ Ускорить LZ4_decompress_fast.
Использование статических huge pages.
+ Встраивание коротких строк во внутрь хэш-таблиц по их size-class-ам при агрегации.
Попробовать разделить key и mapped в хэш-таблицах на небольшие группы.
- Эксперименты с prefetch при GROUP BY.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment