к использованию?
https://github.com/DarkWanderer/ClickHouse.Client/ нам ок. но вставку делаем через клиент в основном
Там же через HTTP, наверное лучше Native ?
Через бинарный формат, там минимальный оверхед по сравнению с json, хорошая либа. есть ещё порт нативного формата в Clickhouse.Ado, но там есть проблемы с производительностью на винде из-за особенностей работы винды с сетью
У меня может быть и винда и linux . Приложение на .Net Core 3.1
Надо тогда бенчить. У меня на винде дольше сокет открывался с портом нативного протокола, чем весь запрос отрабатывал. А вот через http лучше было. Плюс в том http клиенте можно для простых запросов даппер заюзать
У меня юзекейс грубо такой: программа на .Net Core собирает данные с приборов (по сети Ethernet) каждую 0,5-1 секунду и должна ложить в БД. А клиенты (разные) должны их оттуда забирать как текущие так и архивные данные. Както так.
не должно быть существенной разницы http или tcp (для одного и того же формата типа Native)
Ну как по мне библиотека от DarkWanderer самое оно, там очень удобный инсерт через DataTable
Спасибо. Буду юзать эту либу
аха "лучше, быстрее, выше, сильнее". смотря для чего. я лично не заметил. Олег для нас допилил ещё поддержку сырых форматов. поэтому оно вообще теперь шикарно...
у нас тоже и винда и линукс (на .нет кор).
А можно ли настроить CH так чтобы он последние поступающие N-записей в определенную таблмцу держал в памяти - для более быстрой отдачи данных клиентам ? Что то наподобие Disk + Memory Cache...
как бы нельзя и не нужно. в принципе они и так в кеше линукса лежат чаще всего. есть еще buffer engine -- он хранит в памяти записи которые еще сброшены в таблицу
Buffer Engine уже в самом CH? Его нужно настраивать ?
в самом КХ, в документации читайте, скорее всего вам не поможет, да и вы пытаетесь решать несуществующую проблему
public async Task SaveData<TData>(ClickHouseConnection connection, IEnumerable<TData> data, string tableName, CancellationToken ct = default) { using (var bulkCopy = new ClickHouseBulkCopy(connection)) { bulkCopy.DestinationTableName = tableName; DataTable table = new DataTable(); using (var reader = ObjectReader.Create(data)) { table.Load(reader); } await bulkCopy.WriteToServerAsync(table, ct); } } правда из стороннего еще FastMember заюзан для маппинга. А так - на входе коллекция объектов с такими же полями, как и столбцы таблицы, и вперед
Какой движок для таблиц лучше использовать для сбора сырых данных? В приоритете быстрая вставка, быстрая выборка, и возможно последующие преобразования из мгновенных данных в 3-минутные, 1-часовые, суточные посредством арифметического усреднения.
MergeTree но КХ не любит частых вставок.
классный способ — класть данные в кафку, а оттуда через kafka table engine сохранять в КХ
Есть примеры или юзкейс ?
https://altinity.com/blog/2020/5/21/clickhouse-kafka-engine-tutorial
Насколько частых? Если 500-1000 строк в секунду это плохо ?
Частый это количество вставок на момент времени, а не про объем, 1000 строк в одном запросе в секунду - ок, 1000 строк в 1000 запросах не ок
В целом по гайдам 1 вставка в секунду на таблицу
GraphiteMT умеет то что вы хотите, но он считает среднее от среднего , а не sum/cnt , поэтому для avg у него херня получается, хотя может вы этого и хотите еще можно делать TTL / group by поверх SummingMT
каждый инсерт создает парт (или несколько, если сделать все неправильно), много партов плохо, сколько строк внутри парта, значения не имеет
КХ парты не объединяет ?
объединяет конечно. Проблема в том что мелкие парты объединяются за то же время что и немелкие, потому что много накладных расходов, каждый парт -- это множество файлов, каждый файл надо открыть, сделать seek, а жесткий диск не умеет много seek
MergeTree можете ин мемори куски использовать с последней версии и можно вставлять часто
Это с какой версии КХ? И как это настраивается?
https://youtu.be/1LVJ_WcLgF8?list=PLO3lfQbpDVI-hyw4MyqxEk3rDHw95SzxJ&t=10921
Обсуждают сегодня