А кроме уменьшения объема какие есть еще преимущества столбчатого хранения?
Сильно быстрее запросы, т.к. читать нужно меньше с диска: (1) данные по колонкам хранятся, то есть чтобы SUM(amount*price) сделать, БД отдельно читает 2 колонки, а не все строчки в случае построчного хранения (2) колонки сжаты по умолчанию LZ4/ZSDT кодеком, что тоже уменьшает объем считываемых данных.
И что вообще за команда- вы есть в публичном поле?
Да, работаю в одной из tier-1 команд в блокчейн данных и индексинге – если перейти в профиле в ТГ/Твиттер, можно инфу найти, тут не буду рекламировать )
Дополню, возможно, это не совсем понятно из текста. Мы не используем КХ для всего, только для вышеперечисленных задач аналитики и агрегации. Постгрес у нас тоже есть, но для транзакционных данных – юзеры, тарифные планы, статусы воркеров / задач и т.п.
Вопрос хороший, спасибо. По поводу, как КХ появился у нас – так исторически сложилось. То есть пример "было так, не устраивало вот это - перешли на КХ" – привести не смогу.
У нас не только хранение котировок, а всевозможные агрегаты по этим данным (свечи разных интервалов, объемы торгов в разных разрезах, исторические параметры в разных разрезах и всякие такие штуки). Наверное, можно сделать это разными способами на разных БД, но в долгосрок OLAP БД тут выиграет.
Приведу один пример – объем хранилища (и зависящая от этого скорость выполнения запросов). В КХ данные хранятся по столбцам, в Postgres – по строкам. Если данные хранятся по столбцам, то КХ их эффективно сжимает – разница может в несколько раз быть, тк. LZ4/ZSTD хорошо работает на повторяющихся данных. Вот тут подробнее можно почитать https://clickhouse.com/docs/data-compression/compression-in-clickhouse У вас как данные хранятся, по столбцам или по колонкам?
Хороший вопрос. В данном случае это был бекенд, который формирует CSV файл. Была задача выгрузить статистику по кошелькам пользователей из системы.
По поводу TheGraph – интересная штука, думаю на нем в один запрос можно было бы сделать. Но стараюсь не использовать проприетарные нестандартные API, все же веб3, децентрализация.
«Свобода слова определяется обществом и не должна быть ограничена, важно искать истину через разнообразие мнений», — подытожил Дуров.
У меня есть американский номер телефона, и на нем аккаунт Телеграмм. В этом аккаунте не открываются некоторые каналы, например, Russia Today. С сообщением "This channel can't be displayed because it violated local laws". С РФ аккаунта с таким не сталкивался никогда. Это свобода слова или еще нет?
Вы имеете в виду вызов new ethers.Contract(...) ? Это конструктор, который инициализирует объект контракта, создает его свойства, но не обращается к RPC, поэтому картина не поменяется.
В целом согласен, но, например, для Полигона (остальные смотреть лень) из топ-10 в таблице только 4 не upgradeable (WETH, AVAX, MATIC, LINK). А поддерживает ERC2612, по факту, один USDC )
Чтобы не роутить трафик всего компа через VPN, я настроил Copilot работать через прокси. Вот пример для VSCode (думаю, в каждой IDE есть подобные).
Меню "Code - Settings – Settings", прокси указывается как http://user:password@host:port.
Важно: пришлось настроить собственную прокси через DumbProxy, купленная публичная выдавала ошибку 403 при активации расширения – у меня подозрение, что из-за того, что она находилась в каком-то стоп-листе.
Да, так работает бинпоиск. Search возвращает индекс первого элемента, для которого переданная функция равно true, а это возможно только при условии >= 5.
То есть для сортированного списка 1, 3, 5, 7, 9 переданная функция будет true для всех элементов, начиная с третьего до последнего (из документации sort.Search: "Search uses binary search to find and return the smallest index i in [0, n) at which f(i) is true, assuming that on the range [0, n), f(i) == true implies f(i+1) == true.")
Я в статье упоминал, бот перепутал функции Index и Search, в описании говорится про Index, а реально используется Search, которая никогда не возвращает -1, а возвращает n, если поиск неуспешен (из документации sort.Search: "If there is no such index, Search returns n. (Note that the "not found" return value is not -1 as in, for instance, strings.Index"), поэтому runtime error не случится.
Добавил в статью пример 5 для простого прототипирования работы с Postgres. Результат приятно порадовал. Для прототипирования/небольших тестов вполне годно.
У кого-то получается?
Пробовал несколько месяцев назад и сейчас, ничего не помогает.
Сильно быстрее запросы, т.к. читать нужно меньше с диска: (1) данные по колонкам хранятся, то есть чтобы SUM(amount*price) сделать, БД отдельно читает 2 колонки, а не все строчки в случае построчного хранения (2) колонки сжаты по умолчанию LZ4/ZSDT кодеком, что тоже уменьшает объем считываемых данных.
По скорости тут кто-то бенчмарки проводил https://www.fiveonefour.com/blog/PostgreSQL-vs-ClickHouse
Да, работаю в одной из tier-1 команд в блокчейн данных и индексинге – если перейти в профиле в ТГ/Твиттер, можно инфу найти, тут не буду рекламировать )
Вам тоже огромных успехов!
Добавил в начало статьи немного конкретики про сжатие.
Дополню, возможно, это не совсем понятно из текста. Мы не используем КХ для всего, только для вышеперечисленных задач аналитики и агрегации. Постгрес у нас тоже есть, но для транзакционных данных – юзеры, тарифные планы, статусы воркеров / задач и т.п.
Вопрос хороший, спасибо. По поводу, как КХ появился у нас – так исторически сложилось. То есть пример "было так, не устраивало вот это - перешли на КХ" – привести не смогу.
У нас не только хранение котировок, а всевозможные агрегаты по этим данным (свечи разных интервалов, объемы торгов в разных разрезах, исторические параметры в разных разрезах и всякие такие штуки). Наверное, можно сделать это разными способами на разных БД, но в долгосрок OLAP БД тут выиграет.
Приведу один пример – объем хранилища (и зависящая от этого скорость выполнения запросов). В КХ данные хранятся по столбцам, в Postgres – по строкам. Если данные хранятся по столбцам, то КХ их эффективно сжимает – разница может в несколько раз быть, тк. LZ4/ZSTD хорошо работает на повторяющихся данных. Вот тут подробнее можно почитать https://clickhouse.com/docs/data-compression/compression-in-clickhouse У вас как данные хранятся, по столбцам или по колонкам?
Пушка, спасибо за идею!
Спасибо за уточнение!
Да, CH — это про аналитику. Ну мы его так используем. Там есть еще Log engine как раз для логов , но я его не использовал.
Я извиняюсь , а вы статью читали? )
Postgres — OLTP база, Clickhouse — OLAP. Это разные БД для разных задач.
Спасибо, выглядит интересно в таком случае
Хороший вопрос. В данном случае это был бекенд, который формирует CSV файл. Была задача выгрузить статистику по кошелькам пользователей из системы.
По поводу TheGraph – интересная штука, думаю на нем в один запрос можно было бы сделать. Но стараюсь не использовать проприетарные нестандартные API, все же веб3, децентрализация.
Да, throttling тоже есть. Количество HTTP запросов в секунду не тестил, писал про ограничение в 10 JSON-RPC запросов в одном HTTP запросе (батче).
«Свобода слова определяется обществом и не должна быть ограничена, важно искать истину через разнообразие мнений», — подытожил Дуров.
У меня есть американский номер телефона, и на нем аккаунт Телеграмм. В этом аккаунте не открываются некоторые каналы, например, Russia Today. С сообщением "This channel can't be displayed because it violated local laws". С РФ аккаунта с таким не сталкивался никогда. Это свобода слова или еще нет?
Вы имеете в виду вызов new ethers.Contract(...) ? Это конструктор, который инициализирует объект контракта, создает его свойства, но не обращается к RPC, поэтому картина не поменяется.
Спасибо за содержательные комментарии! :)
В целом согласен, но, например, для Полигона (остальные смотреть лень) из топ-10 в таблице только 4 не upgradeable (WETH, AVAX, MATIC, LINK). А поддерживает ERC2612, по факту, один USDC )
За Phalcon спасибо, посмотрю.
Чтобы не роутить трафик всего компа через VPN, я настроил Copilot работать через прокси. Вот пример для VSCode (думаю, в каждой IDE есть подобные).
Меню "Code - Settings – Settings", прокси указывается как http://user:password@host:port.
Важно: пришлось настроить собственную прокси через DumbProxy, купленная публичная выдавала ошибку 403 при активации расширения – у меня подозрение, что из-за того, что она находилась в каком-то стоп-листе.
Новый криптопродукт, т.к. в этом году планирую запустить что-то свое. Пока прорабатываю несколько идей сам и с друзьями.
Да, так работает бинпоиск. Search возвращает индекс первого элемента, для которого переданная функция равно true, а это возможно только при условии >= 5.
То есть для сортированного списка 1, 3, 5, 7, 9 переданная функция будет true для всех элементов, начиная с третьего до последнего (из документации sort.Search: "Search uses binary search to find and return the smallest index i in [0, n) at which f(i) is true, assuming that on the range [0, n), f(i) == true implies f(i+1) == true.")
Я в статье упоминал, бот перепутал функции Index и Search, в описании говорится про Index, а реально используется Search, которая никогда не возвращает -1, а возвращает n, если поиск неуспешен (из документации sort.Search: "If there is no such index, Search returns n. (Note that the "not found" return value is not -1 as in, for instance, strings.Index"), поэтому runtime error не случится.
Добавил в статью пример 5 для простого прототипирования работы с Postgres. Результат приятно порадовал. Для прототипирования/небольших тестов вполне годно.