Обновить
256K+

Базы данных *

Все об администрировании БД

173,26
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

GIN‑индексы для JSONB в PostgreSQL: jsonb_ops vs jsonb_path_ops

Уровень сложностиСредний
Время на прочтение7 мин
Охват и читатели6.5K

С JSONB в PostgreSQL есть одна довольно коварная ловушка: GIN‑индекс вроде бы поставили, запросы вроде бы работают, EXPLAIN не пугает — и на этом многие успокаиваются. Но как только данных становится действительно много, выясняется, что выбор между jsonb_ops и jsonb_path_ops — это не нюанс из документации, а вполне ощутимая разница в размере индекса, количестве лишних проверок и времени выполнения запросов. В этой статье разберём, как устроены оба оператор‑класса, почему один считается универсальным, а второй часто оказывается выгоднее на практике, и в каких случаях дефолтный выбор в PostgreSQL оказывается далеко не лучшим.

Читать далее

DuckDB как микро-хранилище: заменяем «ETL + Postgres» одним файлом, одним движком

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели5.6K

Частая история: данные приложения попадают куда-то, джоб их чистит, Postgres хранит их «для аналитики» и вдруг вы обслуживаете ETL-пайплайн и базу данных, которая никогда не была рада OLAP-нагрузке. По моему мнению, для большинства команд это лишние сложности.

Главная сила DuckDB не в том, что он быстрый (хотя это правда). Она в том, что он может работать как микро-хранилище: один .duckdb-файл, который ведёт себя как аккуратный аналитический движок, находится рядом с данными и обеспечивает дашборды, аудиты и еженедельные отчёты без платформенного оверхеда.

Читать далее

Big Data больше не для гигантов: связка Airflow + ClickHouse вытеснила Airflow + PostgreSQL

Время на прочтение3 мин
Охват и читатели7.9K

Открываю ноутбук. Захожу в метрики своего интернет-магазина. 500 тысяч посетителей в день. Каждый клик — событие. Каждый просмотр товара — строка в логах. Каждое добавление в корзину — ещё одна строка.

За месяц — 15 миллионов событий. За год — почти 200 миллионов. Это не Google. Не Amazon. Это обычный средний магазин на ~100 человек.

А теперь умножьте это на количество таблиц: пользователи, заказы, платежи, доставки, отзывы, просмотры, лайки, рефералы, купоны, возвраты...

Поздравляю. Вы уже работаете с Big Data. В 2026 году это уже не привилегия корпораций, а стандарт ведения цифрового бизнеса. И как следствие этой "гонки вооружений" произошла тектоническая смена ориентиров. Классическая связка Airflow + PostgreSQL, которая ещё вчера считалась золотым стандартом, сегодня стремительно сдает позиции. Её место уверенно занимает дуэт Airflow + ClickHouse — технологический фундамент современной инженерии данных.

Читать далее

Как мы строим OLTP-ядро: от API-контрактов до eBPF-проб

Уровень сложностиСложный
Время на прочтение17 мин
Охват и читатели9.2K

В статье показываем контракты будущей OLTP-СУБД: как разделены слои ядра, зачем нужен per-tablespace page size, почему конфигурация уходит в adaptive tuning и как мы встраиваем USDT/eBPF-наблюдаемость прямо в бинарник.

Читать далее

Room или SQLite? Как не писать SQL запросы вручную на Android

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели4.6K

Каждое Android-приложение, которое хранит данные на устройстве, рано или поздно сталкивается с базой данных. Встроенная SQLite — надёжное решение, но работа с ней через SQLiteOpenHelper требует написания SQL-запросов вручную, преобразования курсоров в объекты и постоянного контроля за закрытием соединений. Это отнимает время и довольно часто вызывает ошибки.

Google предложил библиотеку Room, которая является оберткой над SQLite и реализует паттерн ORM (Object-Relational Mapping). В этой статье мы на конкретном примере сравним, как выглядят операции добавления и чтения данных на чистом SQLite и на Room. Вы увидите, почему Room избавляет от «шаблонного кода» и делает работу с БД простой и безопасной.

Читать далее

JSON_TABLE в PostgreSQL: превращаем JSON в реляционные данные одним запросом

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели7.9K

JSON в PostgreSQL давно перестал быть экзотикой, но работать с ним по-реляционному до сих пор приходилось не самым изящным способом: jsonb_array_elements, LATERAL, ручные касты, обработка ошибок на честном слове. В PostgreSQL 17 появился JSON_TABLE — стандартный SQL/JSON-механизм, который превращает JSON-документ в табличное представление одним выражением. В статье разберём, как он работает, чем отличается от привычного подхода, где действительно упрощает запросы и какие ограничения по производительности и применению у него остаются.

Читать далее

S3 Streamable Backup: потоковые бэкапы напрямую в облако для Manticore Search

Время на прочтение5 мин
Охват и читатели4.6K

С тех пор как мы представили инструмент резервного копирования в Manticore Search 6, создавать резервные копии данных стало заметно проще. Но мы постоянно слышали один и тот же вопрос: "А как насчёт облачного хранилища?" Сегодня мы рады объявить, что manticore-backup теперь поддерживает S3-совместимое хранилище с потоковой загрузкой — без промежуточных файлов, без проблем с местом на локальном диске, только бэкапы напрямую в облако.

Читать далее

Как мы пересобрали сборку мусора в Vinyl

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели7.3K

В предыдущей статье о Vinyl я рассказывал об архитектуре LSM-движка Tarantool. Восемь лет, прошедшие с момента с написания статьи, показали, что Vinyl сразу получился идеальным и менять его не нужно :). Если серьёзно, сегодня я расскажу о тех изменениях, которые мы внесли в алгоритм в форке Tarantool от Picodata, и неизбежно коснусь более глубокой проблематики работы LSM-деревьев, а конкретнее – работы планировщика слияний (compaction scheduler).

Читать далее

Spark SQL Scripting. Новые возможности для инженеров данных

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели5.3K

До недавнего времени для реализации сложной многошаговой логики в экосистеме Apache Spark разработчикам приходилось выходить за рамки декларативного SQL. Оркестрация последовательных вызовов, вычисление промежуточных переменных и ветвление логики требовали привлечения внешних языков программирования, таких как Python (PySpark) или Scala и дополнительных инструментов.

Spark SQL Scripting, который стал доступен, начиная с 4-й версии, кардинально меняет этот подход, представляя собой процедурное расширение классического Spark SQL. Теперь разработчики могут писать полноценные многошаговые сценарии непосредственно на уровне SQL-артефактов, внедряя в них управляющую логику.

В данной публикации мы, команда вендора Data Sapience, разберем возможности Spark scripting на практике.

Читать далее

RANK() vs DENSE_RANK(): ошибка, которая ломает топ-N в проде

Уровень сложностиСложный
Время на прочтение6 мин
Охват и читатели5.6K

При работе с данными в SQL рано или поздно возникает задача ранжирования: топ-5 продуктов по продажам, рейтинг сотрудников по KPI, распределение клиентов по категориям.

На первый взгляд RANK() и DENSE_RANK() делают почти одно и то же. На тестовых данных разница может быть вообще незаметна. Но в проде именно здесь часто начинаются ошибки: — топ-3 внезапно возвращает 5 строк; — дашборд "врёт"; — backend-логика начинает вести себя не так, как ожидалось; — запрос, который вчера работал быстро, сегодня уходит в disk spill.

Две самые популярные функции для ранжирования — RANK() и DENSE_RANK(). Ниже разберём, чем они отличаются, где именно ошибаются разработчики и аналитики, и что важно понимать: не только что делает оконная функция, но и сколько она стоит на больших объёмах данных.

Читать далее

Prepared statements в Manticore Search

Время на прочтение7 мин
Охват и читатели5.4K

Представьте, что вы создаёте мощное поисковое приложение. Пользователи вводят ключевые слова, а ваш бэкенд должен выполнять запрос к базе данных Manticore Search, чтобы найти подходящие результаты. Распространённый (и соблазнительный!) подход — напрямую вставлять ввод пользователя в SQL‑запросы. Например, вы можете фильтровать по числовому полю, такому как категория или идентификатор записи. Если пользователь передаёт обычное значение, например 5, запрос будет SELECT FROM products WHERE id=5. А что, если он передаст 1 OR 1=1? Запрос станет SELECT FROM products WHERE id=1 OR 1=1 — условие всегда истинно, поэтому запрос вернёт все строки вместо одной. Это SQL‑инъекция.

К счастью, существует более безопасный и эффективный способ: prepared statements. По сути, prepared statements отделяют ваш SQL‑код от передаваемых данных. Вместо того чтобы каждый раз собирать всю строку запроса, вы один раз задаёте структуру запроса с маркерами параметров, а затем отдельно передаёте поисковые термины. Подробнее о концепции можно узнать на Wikipedia .

Manticore Search поддерживает prepared statements через стандартный протокол MySQL, предоставляя мощный инструмент для создания безопасных поисковых приложений. Используя prepared statements, вы не только значительно снизите риск SQL‑инъекций, но и улучшите читаемость вашего кода.

prepared statements — это не просто функция; иногда они являются обязательными. Например, библиотека Rust sqlx работает с MySQL-эндпоинтом, используя исключительно prepared statements. Кроме того, некоторые OLE DB‑коннекторы, позволяющие MS SQL работать с сервером MySQL, тоже используют prepared statements внутри.

Читать далее

Парсим MDN и пишем оффлайн RAG-MCP

Уровень сложностиСредний
Время на прочтение19 мин
Охват и читатели7K

Привет.

В этой технической статье мы на практике разберёмся, что такое RAG, распарсим MDN Web Docs, научимся готовить эмбеддинги, заполним ими векторную базу данных и напишем свой MCP сервер с гибридным векторным и полнотекстовым поиском. Зальём всё получившееся добро на HuggingFace, GitHub и NPM, и настроим автоматическое обновление данных.

Внутри будет много пошаговых инструкций и примеров кода на Bun + TypeScript.

Читать далее

EXPLAIN ANALYZE в PostgreSQL: читаем планы выполнения экспертно

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели9.2K

Привет, Хабр!

Запрос работает 30 секунд. Вы смотрите на него, всё вроде ок: JOIN по индексированным полям, WHERE по дате, LIMIT 100. Должен летать, но что-то не летает. Добавляете индекс наугад — не помогает. Переписываете подзапрос в CTE и стало ещё хуже.

Проблема не в запросе, а в в том, что вы не смотрели в план выполнения. EXPLAIN ANALYZE показывает не что вы написали, а что PostgreSQL делает: какие индексы использует (и использует ли вообще), в каком порядке соединяет таблицы, где тратит время, сколько строк ожидал и сколько получил.

Понять PostgreSQL

Ближайшие события

Data as Code на практике: создаем, версионируем и делимся модулями БД с помощью ArchDB

Уровень сложностиСредний
Время на прочтение29 мин
Охват и читатели6.7K

Представьте: вы заходите в репозиторий, открываете папку schemas и через пять минут понимаете, как устроена база во всём проекте, со всеми связями. Никаких устаревших диаграмм в Confluence, никаких гаданий по коду миграций. Схема базы данных становится частью кодовой базы — её можно версионировать, рецензировать и тестировать. Модель в формате ArchDB становится единым источником истины, из которого автоматически генерируются документация, DDL-скрипты и даже ORM-сущности. Звучит как мечта? Для нас с командой это стало реальностью, когда мы перешли на ArchDB.

Читать далее

«Олег, разверни тестовую базу»: как таска на 5 минут сорвала финтех-релиз и поссорила три отдела

Время на прочтение6 мин
Охват и читатели10K

Все началось с обычного тикета в Jira, из тех, которые выглядят безобидно и даже немного скучно. «Нужно протестировать новый личный кабинет. Разверни тестовую базу». Через несколько месяцев этот тикет аукнулся сорванным релизом, сгоревшим маркетинговым бюджетом и отложенным запуском важнейшего сервиса. А Олег, как всегда, остался крайним.

Давайте разберем эту непридуманную историю и выясним, какие ошибки совершили ее герои, как их избежать, если ваши тестовые базы до сих пор готовят скриптами.

Почему на Олега повесили всех собак

SPQR в финтехе: реальная миграция на шардированную PostgreSQL-инсталляцию

Время на прочтение12 мин
Охват и читатели9.8K

На связи Денис Волков из команды платформы данных в Yandex Cloud. В предыдущей статье мы рассказали, как устроен SPQR (Stateless Postgres Query Router): архитектура, компоненты и принципы. Красивая теория. Эта статья — про то, что происходит, когда теорию начинаешь применять к живому продакшену с десятками таблиц, набором микросервисов и новогодней нагрузкой. Про грабли, решения и конечно же проблемы.

Читать далее

MCP-Manticore: Позвольте вашему AI-ассистенту писать запросы к Manticore за вас

Уровень сложностиСредний
Время на прочтение3 мин
Охват и читатели6.2K

Вы слышали, что Manticore Search быстрый. Вы слышали, что он объединяет полнотекстовый, векторный и нечеткий поиск в одном движке. Но когда вы начинаете реально работать с ним, вы сидите перед документацией, угадываете синтаксис SQL и надеетесь, что CREATE TABLE не выдаст непонятную ошибку.

MCP-Manticore меняет правила игры.

Это сервер Model Context Protocol (MCP), который подключает Cursor, Claude Code, Codex CLI или любой другой MCP-совместимый AI-ассистент напрямую к вашему экземпляру Manticore. AI может:

Читать далее

Advisory Locks в PostgreSQL: блокировки уровня приложения, о которых мало кто знает

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели7.1K

Привет, Хабр!

PostgreSQL умеет блокировать строки (SELECT ... FOR UPDATE) и таблицы (LOCK TABLE). Об этом знают все. Но есть третий тип блокировок, который решает задачи, с которыми row-level и table-level locks не справляются: advisory locks. Консультативные блокировки — механизм, где PostgreSQL предоставляет инфраструктуру (атомарные блокировки с очередями ожидания), а семантику определяет приложение.

Это значит: вы берёте блокировку по произвольному числовому ключу, и PostgreSQL гарантирует, что никто другой не возьмёт блокировку с тем же ключом одновременно. Никаких таблиц, строк или ресурсов БД не блокируется — это чисто логическая блокировка, видимая только тем, кто её проверяет.

Звучит как-то абстрактно. Посмотрим на конкретные задачи, где advisory locks незаменимы.

Читать далее

ClickHouse не тормозит, но заставляет глаз дергаться. CTE

Уровень сложностиПростой
Время на прочтение2 мин
Охват и читатели6.1K

Каждый, кто приходит в ClickHouse из мира классических OLTP-баз, несет с собой багаж священных знаний. Один из таких «священных граалей» — Common Table Expressions (CTE).

Казалось бы, что в ClickHouse может пойти не так? Ведь там тоже есть WITH! Любой нормальный человек просто возьмет и начнет использовать, казалось бы, привычный функционал. Но в итоге останется у разбитого корыта.

В этой статье мы разберем главные грабли: почему WITH в ClickHouse — это не оптимизация, а макрос для парсера и выстрел себе в ногу, если этого не знать.

Читать далее

Постмортем без наказаний: культура разбора ошибок, которая реально улучшает качество проектов

Уровень сложностиСредний
Время на прочтение4 мин
Охват и читатели5.2K

В инфраструктурных проектах цена ошибки может измеряться миллионами и репутацией компании. Но практика показывает: поиск виноватых редко помогает избежать повторения проблем, гораздо эффективнее работает культура постмортем-разборов — честный анализ инцидентов без наказаний, который превращает ошибки в системные улучшения.

В инфраструктурных проектах цена ошибки редко бывает символической. Это может быть простой систем, финансовые потери, штрафы, иногда репутационные риски для клиента и подрядчика. В такой среде логично ожидать жесткой культуры поиска виноватых. Но практика показывает обратное: чем сложнее технологическая среда, тем бесполезнее модель «найти виновного и наказать». Она не снижает количество ошибок. Иногда она даже увеличивает их. За годы работы в инфраструктурных проектах я убедился, что единственный способ реально повышать качество, это культура разбора ошибок без наказаний. В инженерной среде это часто называют постмортем.

Почему поиск виноватых не работает

В ИТ есть старая поговорка: «Быстро поднятое не считается упавшим». Почти каждый инженер слышал её ещё в начале карьеры. В этой фразе есть важный инженерный принцип: в момент инцидента главная задача — не выяснять, кто виноват, а максимально быстро восстановить систему.

Когда что-то падает, инфраструктура, сервис или интеграция, время становится главным фактором. Клиенту не важно, кто допустил ошибку, ему важно, чтобы система снова работала. Поэтому в инженерных командах почти инстинктивно действует правило: сначала поднимаем систему, потом разбираемся.

Читать далее