Драйвер ClickHouse и другие БД из .NET (Firebird, MS SQL)

↑ 4.1 ADO.NET, Npgsql и Dapper · ← Предыдущая

Обязательно~3 мин чтенияУровень: middle

Зачем это на собесе

Показывает широту: в реальных проектах часто несколько СУБД. Ждут понимания, чем аналитические БД отличаются от OLTP.

Объяснение

СУБДПакетЗамечание
PostgreSQLNpgsql (+ Npgsql.EntityFrameworkCore.PostgreSQL)основной выбор
MS SQL ServerMicrosoft.Data.SqlClientMARS, TransactionScope
ClickHouseClickHouse.Clientколоночная аналитическая БД, HTTP-интерфейс
FirebirdFirebirdSql.Data.FirebirdClientвстречается в legacy
MongoDBMongoDB.Driverдокументная
RedisStackExchange.Redisкэш, очереди

ClickHouse

Предназначен для аналитики (OLAP): огромные объёмы, агрегаты, вставка батчами, а не построчно; нет полноценных транзакций и эффективных UPDATE.

using var conn = new ClickHouseConnection("Host=ch;Database=analytics");
await conn.OpenAsync(ct);
 
using var bulk = new ClickHouseBulkCopy(conn) { DestinationTableName = "events", BatchSize = 100_000 };
await bulk.InitAsync();
await bulk.WriteToServerAsync(rows, ct);
 
var cmd = conn.CreateCommand();
cmd.CommandText = "select toStartOfHour(ts) h, count() from events where ts > {since:DateTime} group by h";

Абстракция

Общий интерфейс IDbConnection позволяет писать Dapper-запросы к разным БД, но диалекты SQL различаются: изолируйте доступ за репозиториями/read-моделями.

Нюансы и подводные камни

  • ClickHouse: не вставляйте по одной строке; используйте батчи или буферные таблицы/Kafka engine.
  • Разные типы времени и часовые пояса между СУБД.
  • Firebird: длина идентификаторов и диалект SQL; тестируйте на реальном экземпляре.
  • Не тащите OLTP-паттерны (обновления по одной записи) в OLAP-хранилище.

Практика

  1. Запишите 1 млн событий в ClickHouse через BulkCopy и постройте агрегат по часам.
  2. Подключите вторую БД и изолируйте её за интерфейсом.
  3. Сравните скорость агрегата в PostgreSQL и ClickHouse на тех же данных.

Вопросы с ответами

Связанные темы