У SQLite один writer. И иногда это не ограничение, а очень удобная архитектура.
Работал с SQLite и увидел необычную схему: база работала сразу на нескольких машинах, но запись всё равно шла только через одну.
За это отвечал LiteFS.
Он не пытается превратить SQLite в полноценную distributed database. Вместо этого одна машина выбирается primary через distributed lease и получает право писать. Остальные работают как реплики.
Если primary пропадает, lease истекает и другой узел может занять его место.
В итоге сложная на первый взгляд задача сводится к довольно простой идее:
А на скрине как раз часть Go-кода LiteFS, которая продлевает этот lease и следит, чтобы узел не продолжал считать себя primary после истечения TTL.
Работал с SQLite и увидел необычную схему: база работала сразу на нескольких машинах, но запись всё равно шла только через одну.
За это отвечал LiteFS.
Он не пытается превратить SQLite в полноценную distributed database. Вместо этого одна машина выбирается primary через distributed lease и получает право писать. Остальные работают как реплики.
Если primary пропадает, lease истекает и другой узел может занять его место.
В итоге сложная на первый взгляд задача сводится к довольно простой идее:
«Просто гарантируй, что в каждый момент времени пишет только одна машина».
А на скрине как раз часть Go-кода LiteFS, которая продлевает этот lease и следит, чтобы узел не продолжал считать себя primary после истечения TTL.
❤6👍4🔥3
🔥 Хочешь быстрее расти в IT? Хватит учиться в одиночку
Окружение решает больше, чем кажется.
Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
DevOps: t.me/DevOPSitsec
Docker: https://xn--r1a.website/+90Z5TAyfuNU5YmRi
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_1001_notes
Java: t.me/javatg
JavaScript: t.me/javascriptv
React: t.me/react_tg
Frontend: t.me/front
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Data Science: t.me/data_analysis_ml
Big Data: t.me/bigdatai
Математика: t.me/data_math
Физика: t.me/fizmat
Kubernetes: t.me/kubernetc
GameDev: https://xn--r1a.website/gamedev
Haskell: t.me/haskell_tg
Собеседования и карьера:
DS собеседования: t.me/machinelearning_interview
Python собеседования: t.me/python_job_interview
Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://xn--r1a.website/addlist/2Ls-snqEeytkMDgy
Папка Frontend: https://xn--r1a.website/addlist/mzMMG3RPZhY2M2Iy
Полезное сверху:
ИТ-мемы: t.me/memes_prog
Английский для программистов: t.me/english_forprogrammers
ИИ и технологии: t.me/vistehno
954 ГБ open-source курсов: https://xn--r1a.website/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: https://xn--r1a.website/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
Окружение решает больше, чем кажется.
Собрал папки и каналы, где можно быстрее влиться в нужное направление, следить за трендами и не вариться в своём пузыре.
AI: t.me/ai_machinelearning_big_data
Python: t.me/pythonl
Linux: t.me/linuxacademiya
Хакинг: t.me/linuxkalii
DevOps: t.me/DevOPSitsec
Docker: https://xn--r1a.website/+90Z5TAyfuNU5YmRi
Golang: t.me/Golang_google
Rust: t.me/rust_code
C++: t.me/cpluspluc
C#: t.me/csharp_1001_notes
Java: t.me/javatg
JavaScript: t.me/javascriptv
React: t.me/react_tg
Frontend: t.me/front
PHP: t.me/phpshka
Android: t.me/android_its
Мобильная разработка: t.me/mobdevelop
Базы данных: t.me/sqlhub
Data Science: t.me/data_analysis_ml
Big Data: t.me/bigdatai
Математика: t.me/data_math
Физика: t.me/fizmat
Kubernetes: t.me/kubernetc
GameDev: https://xn--r1a.website/gamedev
Haskell: t.me/haskell_tg
Собеседования и карьера:
DS собеседования: t.me/machinelearning_interview
Python собеседования: t.me/python_job_interview
Папка с вакансиями: t.me/addlist/_zyy_jQ_QUsyM2Vi
Папка Go разработчика: t.me/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: t.me/addlist/eEPya-HF6mkxMGIy
Папка ML: https://xn--r1a.website/addlist/2Ls-snqEeytkMDgy
Папка Frontend: https://xn--r1a.website/addlist/mzMMG3RPZhY2M2Iy
Полезное сверху:
ИТ-мемы: t.me/memes_prog
Английский для программистов: t.me/english_forprogrammers
ИИ и технологии: t.me/vistehno
954 ГБ open-source курсов: https://xn--r1a.website/+rKBQEMccAA01MTcy
ИТ-книги бесплатно: https://xn--r1a.website/addlist/BkskQciUW_FhNjEy
Max Ai: https://max.ru/ai_machinelearning_big_data
Max python: https://max.ru/pythonl
ТЕХНО: https://max.ru/vistehno
Max Go: https://max.ru/Golang_google
Max Linux: https://max.ru/linuxkalii
Devops: https://max.ru/DevOPSitsec
C#: https://max.ru/csharp_ci
C++: https://max.ru/cpluspluc
SQL: https://max.ru/sqlhub
Java: https://max.ru/javatg
Подписывайся на нужные направления и собирай себе ленту, которая реально двигает вперёд.
❤3👍2🔥2👎1
🔥 SQL-запрос внезапно стал медленным? Проверь не только индексы, но и статистику
Оптимизатор выбирает план запроса на основе статистики по данным. Если она устарела, база может решить, что строк мало, выбрать
В PostgreSQL быстро обновить статистику можно так:
А проверить, насколько оценки оптимизатора отличаются от реальности:
Смотри на разницу между rows= и actual rows=.
Если PostgreSQL ожидал 100 строк, а реально получил 500 000, проблема может быть не в индексе, а в плохой статистике.
Особенно часто это всплывает после массовых INSERT, UPDATE, импорта данных или резкого изменения распределения значений.
Оптимизатор выбирает план запроса на основе статистики по данным. Если она устарела, база может решить, что строк мало, выбрать
Nested Loop и в итоге прогнать миллионы сравнений.В PostgreSQL быстро обновить статистику можно так:
ANALYZE users;
А проверить, насколько оценки оптимизатора отличаются от реальности:
EXPLAIN (ANALYZE, BUFFERS)
SELECT *
FROM users
WHERE status = 'active';
Смотри на разницу между rows= и actual rows=.
Если PostgreSQL ожидал 100 строк, а реально получил 500 000, проблема может быть не в индексе, а в плохой статистике.
Особенно часто это всплывает после массовых INSERT, UPDATE, импорта данных или резкого изменения распределения значений.
👍8❤3👏1
🔥 SQL-совет: `COUNT(*)` иногда можно вообще не считать
Если в PostgreSQL тебе нужно не точное число строк, а быстрая оценка размера огромной таблицы, не запускай:
На большой таблице это может читать миллионы строк.
Для быстрой оценки можно взять статистику PostgreSQL:
reltuples хранит примерную оценку количества строк, которую PostgreSQL обновляет после ANALYZE и VACUUM.
Это полезно для админок, мониторинга, дашбордов и проверок вида «в таблице примерно 10 млн или 100 млн строк?», где абсолютная точность не нужна.
А если нужна актуальная оценка:
После этого reltuples станет ближе к реальному количеству строк.
На таблицах в сотни миллионов строк разница между мгновенной оценкой и настоящим COUNT(*) может быть огромной.
Если в PostgreSQL тебе нужно не точное число строк, а быстрая оценка размера огромной таблицы, не запускай:
SELECT COUNT(*) FROM events;
На большой таблице это может читать миллионы строк.
Для быстрой оценки можно взять статистику PostgreSQL:
SELECT reltuples::bigint
FROM pg_class
WHERE relname = 'events';
reltuples хранит примерную оценку количества строк, которую PostgreSQL обновляет после ANALYZE и VACUUM.
Это полезно для админок, мониторинга, дашбордов и проверок вида «в таблице примерно 10 млн или 100 млн строк?», где абсолютная точность не нужна.
А если нужна актуальная оценка:
ANALYZE events;
После этого reltuples станет ближе к реальному количеству строк.
На таблицах в сотни миллионов строк разница между мгновенной оценкой и настоящим COUNT(*) может быть огромной.
👍7❤6
Как называется механизм PostgreSQL, позволяющий ограничить видимость строк в таблице для пользователя на основе определенных правил (политик)?
Anonymous Quiz
8%
Column-Level Security
17%
Table Access Control
10%
View-Only Access
66%
Row-Level Security (RLS)
🎉3
Forwarded from Machinelearning
Библиотека написана на Rust, есть привязки для Python, а в основе - TurboQuant, алгоритм сжатия векторов, который Google описали в статье, принятой на ICLR 2026.
Сама библиотека к Google отношения не имеет, это независимая реализация чужого алгоритма.
Коллекция из 10 миллионов документов, занимающая в исходном виде 31 гигабайт, умещается в 4. Поиск при этом, как утверждает автор, идёт быстрее, чем в FAISS - одного из самых распространённых инструментов в этой области.
По замерам turbovec обгоняет FAISS в среднем в 3,4-3,5 раза при 4-битном сжатии и на 20-26% при 2-битном, в зависимости от железа.
Индекс не нужно предварительно обучать - векторы просто добавляются по мере поступления.
Сохранение инкрементальное, на диск уходит только то, что изменилось с прошлого раза, поэтому даже на большом индексе это занимает миллисекунды.
Поиску можно передать список разрешённых документов - скажем, чтобы пользователь видел только свои файлы.
Удаление работает по постоянным идентификаторам, ссылки на записи не плывут.
Тем, кто уже сидит на LangChain, LlamaIndex, Haystack или Agno, автор предлагает готовые адаптеры - меняется одна строка импорта, остальной код остаётся как был.
@ai_machinelearning_big_data
#AI #ML #VectorSearch #TurboQuant #Rust
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1🔥1
В Steam выходит Ghost in the SQL - детективная игра, где главный инструмент расследования не лупа и не допросы, а SQL-запросы.
Чтобы найти подозреваемого, восстановить события или докопаться до нужной улики, придётся работать с базами данных, фильтровать информацию, связывать таблицы и писать запросы.
Каждое дело постепенно знакомит с SQL через практику - от простых выборок до более сложного анализа данных.
Обещают разные расследования - поджоги, убийства и другие преступления.
Редкий случай, когда
SELECT, JOIN и WHERE действительно помогают найти преступника.https://store.steampowered.com/app/5072430/Ghost_in_the_SQL_Data/
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤6🔥6👎1
🔥 Python + AI без игрушечных демок. Курс для тех, кто хочет собирать рабочие системы.
Stepik: «Python современный AI для разработчика и автоматизации задач»
63 урока, 382 шага, практика с кодом и автопроверкой.
Внутри: RAG, tool calling, агенты, evals, MCP, Ollama, vLLM, pgvector + HNSW, безопасный text-to-SQL, prompt injection, кэш, очереди и sandbox для агентного кода.
Плюс реальные автоматизации: почта, отчёты, боты, вебхуки и браузерные сценарии.
Для тех, кто уже знает Python и хочет перейти к production AI.
⏳ 72 часа скидка 55%
https://stepik.org/a/295921
Stepik: «Python современный AI для разработчика и автоматизации задач»
63 урока, 382 шага, практика с кодом и автопроверкой.
Внутри: RAG, tool calling, агенты, evals, MCP, Ollama, vLLM, pgvector + HNSW, безопасный text-to-SQL, prompt injection, кэш, очереди и sandbox для агентного кода.
Плюс реальные автоматизации: почта, отчёты, боты, вебхуки и браузерные сценарии.
Для тех, кто уже знает Python и хочет перейти к production AI.
⏳ 72 часа скидка 55%
https://stepik.org/a/295921
❤2👍2🔥2👎1
Forwarded from Machinelearning
Руководитель Codex Тибо Соттьё подвёл итог изменениям последних недель, которые снижают риск деструктивных действий Codex.
Месяц назад в сети появились жалобы на то, что GPT-5.6 в Codex делает с файлами то, о чем его не просили.
Самый серьезный кейс - команда, которая должна была почистить за собой временные файлы, вместо этого удаляла файлы пользователя.
В ходе разбора выяснили, что Codex создает временные папки и потом чистит их, и в редких случаях чистил неправильно - он переиспользовал под временную работу системную переменную окружения, а некорректная команда очистки затем указывала на настоящий домашний каталог вместо временной папки.
Второй случай проще - модель удаляла или перезаписывала временный путь, не посмотрев, что там уже лежит.
По итогам расследования добавили дополнительную защиту на нескольких уровнях:
Codex теперь обязан проверять, что именно он собирается удалить, заводить временные каталоги заново, не переиспользовать системные переменные окружения, выбирать обратимые действия и останавливаться, когда масштаб операции неясен.
Механизм, который выявляет рискованные команды удаления и отправляет их на ревью, усилили. Если команду отклонили, модель направляют к более безопасному способу.
Включить полный доступ случайно стало труднее, предупреждения переписали понятнее, а самые рискованные сочетания разрешений дополнительно ограничили.
Он стал лучше распознавать деструктивные действия.
OpenAI собрала условия и данные, воспроизводящие найденные сбои. Сейчас добавляются RL-задачи и грейдеры под эти риски, а деструктивные действия вычищаются из обучающих данных.
Обновлять Codex и работать в одном из режимов песочницы -
Ask for approval или Approve for me.Full access включать только там, где среде можно доверять и откуда легко восстановиться.
@ai_machinelearning_big_data
#news #ai #ml
Please open Telegram to view this post
VIEW IN TELEGRAM
❤3👍3👎2🔥1
🔥 LatticeDB - локальная база для Graph RAG и памяти AI-агентов
Проект объединяет в одном embedded-движке сразу три способа работы с данными:
* граф связей
* векторный поиск через HNSW
* полнотекстовый поиск BM25
Вся база хранится в одном файле - без отдельного сервера и сложной конфигурации. Есть bindings для Python, TypeScript/Node.js и Go.
Подходит для Graph RAG, agent memory и локальных knowledge-систем.
https://readhacker.news/s/73wnt
Проект объединяет в одном embedded-движке сразу три способа работы с данными:
* граф связей
* векторный поиск через HNSW
* полнотекстовый поиск BM25
Вся база хранится в одном файле - без отдельного сервера и сложной конфигурации. Есть bindings для Python, TypeScript/Node.js и Go.
Подходит для Graph RAG, agent memory и локальных knowledge-систем.
https://readhacker.news/s/73wnt
❤7👍4🔥4
Antares SQL Client
Современный, быстрый и ориентированный на продуктивность SQL-клиент с акцентом на пользовательский опыт (UX).
Текущие ключевые функции:
- Подключение к нескольким базам данных одновременно.
- Управление базами данных (добавление/редактирование/удаление).
- Полное управление таблицами, включая индексы и внешние ключи.
- Управление представлениями, триггерами, хранимыми процедурами, функциями и планировщиками (добавление/редактирование/удаление).
- Современная и удобная система вкладок; держите открытыми все необходимые вкладки в вашем рабочем пространстве.
- Заполнение тестовых данных в таблицах для генерации большого объема данных.
- Подсказки и автозаполнение запросов.
- История запросов: поиск по последним 1000 запросам.
- Сохранение запросов, заметок или задач.
- Поддержка SSH-туннелей.
- Режим ручного выполнения транзакций.
- Импорт и экспорт дампов баз данных.
- Настраиваемые горячие клавиши.
- Темная и светлая тема.
- Темы редактора.
https://github.com/antares-sql/antares
Современный, быстрый и ориентированный на продуктивность SQL-клиент с акцентом на пользовательский опыт (UX).
Текущие ключевые функции:
- Подключение к нескольким базам данных одновременно.
- Управление базами данных (добавление/редактирование/удаление).
- Полное управление таблицами, включая индексы и внешние ключи.
- Управление представлениями, триггерами, хранимыми процедурами, функциями и планировщиками (добавление/редактирование/удаление).
- Современная и удобная система вкладок; держите открытыми все необходимые вкладки в вашем рабочем пространстве.
- Заполнение тестовых данных в таблицах для генерации большого объема данных.
- Подсказки и автозаполнение запросов.
- История запросов: поиск по последним 1000 запросам.
- Сохранение запросов, заметок или задач.
- Поддержка SSH-туннелей.
- Режим ручного выполнения транзакций.
- Импорт и экспорт дампов баз данных.
- Настраиваемые горячие клавиши.
- Темная и светлая тема.
- Темы редактора.
https://github.com/antares-sql/antares
❤5👍4🔥2
🔥 Tabularis - единое open-source приложение для работы с SQL
Если приходится постоянно переключаться между разными клиентами для PostgreSQL, MySQL и SQLite, Tabularis собирает всё в одном desktop-приложении.
Что умеет:
- PostgreSQL, MySQL/MariaDB и SQLite из коробки
- SQL notebooks с Markdown, результатами и графиками
- визуальный конструктор запросов
- Visual EXPLAIN с интерактивным разбором query plan
- переменные между ячейками
- MCP-сервер для AI-агентов
- расширение поддержки других БД через плагины
Подходит как единое рабочее место для аналитики, разработки и отладки SQL.
Apache 2.0.
https://github.com/TabularisDB/tabularis
Если приходится постоянно переключаться между разными клиентами для PostgreSQL, MySQL и SQLite, Tabularis собирает всё в одном desktop-приложении.
Что умеет:
- PostgreSQL, MySQL/MariaDB и SQLite из коробки
- SQL notebooks с Markdown, результатами и графиками
- визуальный конструктор запросов
- Visual EXPLAIN с интерактивным разбором query plan
- переменные между ячейками
- MCP-сервер для AI-агентов
- расширение поддержки других БД через плагины
Подходит как единое рабочее место для аналитики, разработки и отладки SQL.
Apache 2.0.
https://github.com/TabularisDB/tabularis
❤5👍5🔥5
⚡️ MongrelDB-V - клиент для MongrelDB на языке V.
Сам MongrelDB - open-source колоночная база на Rust с довольно необычным набором возможностей:
- SQL через DataFusion
- vector search и ANN
- full-text search
- MVCC
- WAL
- replication и CDC
- шифрование AES-256-GCM
- bitmap, MinHash, learned-range и другие индексы
- встроенный и серверный режимы
MongrelDB-V позволяет работать с этой базой из V через HTTP-клиент. Устанавливается обычной командой
Интересный проект для тех, кто хочет попробовать V не только для небольших CLI-утилит, но и для работы с SQL, поиском и AI-native retrieval.
https://github.com/visorcraft/MongrelDB-V
Сам MongrelDB - open-source колоночная база на Rust с довольно необычным набором возможностей:
- SQL через DataFusion
- vector search и ANN
- full-text search
- MVCC
- WAL
- replication и CDC
- шифрование AES-256-GCM
- bitmap, MinHash, learned-range и другие индексы
- встроенный и серверный режимы
MongrelDB-V позволяет работать с этой базой из V через HTTP-клиент. Устанавливается обычной командой
v install. Интересный проект для тех, кто хочет попробовать V не только для небольших CLI-утилит, но и для работы с SQL, поиском и AI-native retrieval.
https://github.com/visorcraft/MongrelDB-V
❤3👍3🔥2
💡 SQL-задача: почему запрос возвращает НЕПРАВИЛЬНЫЙ результат?
Есть таблица платежей:
Нужно найти последний платёж каждого пользователя.
Разработчик пишет:
В некоторых СУБД запрос вообще не выполнится.
А в тех, где выполнится, amount может оказаться вообще НЕ от последнего платежа.
Почему?
Потому что MAX(paid_at) вычисляется отдельно, а amount не обязан принадлежать той же строке.
Например:
user_id | paid_at | amount
--------+--------------------+-------
1 | 2026-01-01 10:00 | 100
1 | 2026-02-01 10:00 | 900
Можно получить:
1 | 2026-02-01 10:00 | 100
Дата последняя, а сумма - от другой строки.
Правильный вариант в PostgreSQL:
Или универсально через оконную функцию:
Но тут есть ещё одна ловушка.
Что будет, если у пользователя два платежа с одинаковым paid_at?
Тогда результат становится недетерминированным.
• Нужно добавить tie-breaker:
Вот уже хороший вопрос для собеседования:
Как получить последнюю строку из группы так, чтобы результат был детерминированным даже при одинаковых timestamp?
Есть таблица платежей:
CREATE TABLE payments (
user_id BIGINT,
paid_at TIMESTAMP,
amount NUMERIC
);
Нужно найти последний платёж каждого пользователя.
Разработчик пишет:
SELECT
user_id,
MAX(paid_at) AS paid_at,
amount
FROM payments
GROUP BY user_id;
В некоторых СУБД запрос вообще не выполнится.
А в тех, где выполнится, amount может оказаться вообще НЕ от последнего платежа.
Почему?
Потому что MAX(paid_at) вычисляется отдельно, а amount не обязан принадлежать той же строке.
Например:
user_id | paid_at | amount
--------+--------------------+-------
1 | 2026-01-01 10:00 | 100
1 | 2026-02-01 10:00 | 900
Можно получить:
1 | 2026-02-01 10:00 | 100
Дата последняя, а сумма - от другой строки.
Правильный вариант в PostgreSQL:
SELECT DISTINCT ON (user_id)
user_id,
paid_at,
amount
FROM payments
ORDER BY user_id, paid_at DESC;
Или универсально через оконную функцию:
SELECT user_id, paid_at, amount
FROM (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY user_id
ORDER BY paid_at DESC
) AS rn
FROM payments
) t
WHERE rn = 1;
Но тут есть ещё одна ловушка.
Что будет, если у пользователя два платежа с одинаковым paid_at?
Тогда результат становится недетерминированным.
• Нужно добавить tie-breaker:
ORDER BY paid_at DESC, id DESC
Вот уже хороший вопрос для собеседования:
Как получить последнюю строку из группы так, чтобы результат был детерминированным даже при одинаковых timestamp?
🔥10❤5👍4🥰1😁1