Транзакции в SQLite: просто, но со своими нюансами
SQLite - это встраиваемая база данных, и она немного отличается от привычных серверных СУБД (PostgreSQL, MySQL) в части работы с транзакциями. Но транзакции там есть, и работают по принципу ACID - атомарность, согласованность, изолированность и долговечность.
Разберёмся по полочкам:
🔹 Как начинается и заканчивается транзакция?
Или, в случае ошибки:
Можно использовать синонимы:
-
-
-
Они отличаются уровнем блокировок.
🔹 Типы транзакций
1. DEFERRED (по умолчанию)
🔒 Блокировки ставятся только при первом доступе к таблице (на чтение/запись).
2. IMMEDIATE
🔒 Сразу ставит блокировку на запись (write-lock). Полезно, если точно знаешь, что будешь писать — исключишь гонки.
3. EXCLUSIVE
🔒 Блокирует БД полностью. Даже другие чтения не пройдут.
🔹 Особенности SQLite
- Одна запись за раз: SQLite поддерживает одновременные чтения, но только одну запись одновременно. Остальные получат "database is locked".
- Авто-коммиты: если явно не начать транзакцию - SQLite будет делать коммит после каждого запроса.
- Журналирование: SQLite использует WAL (write-ahead log) или rollback journal - в зависимости от настроек. WAL - более производителен для параллельного чтения.
💡 Советы
- При пакетной вставке всегда оборачивай в транзакцию:
→ Это в разы быстрее, чем отдельные
- Если получаешь ошибку
- Не оставил ли ты открытые транзакции
- Не работают ли несколько процессов с БД одновременно без координации
Сохрани, чтобы не потерять!
📲 Мы в MAX
#db
👉 @database_info
SQLite - это встраиваемая база данных, и она немного отличается от привычных серверных СУБД (PostgreSQL, MySQL) в части работы с транзакциями. Но транзакции там есть, и работают по принципу ACID - атомарность, согласованность, изолированность и долговечность.
Разберёмся по полочкам:
🔹 Как начинается и заканчивается транзакция?
BEGIN TRANSACTION;
-- какие-то запросы
COMMIT;
Или, в случае ошибки:
ROLLBACK;
Можно использовать синонимы:
-
BEGIN = BEGIN DEFERRED-
BEGIN IMMEDIATE-
BEGIN EXCLUSIVEОни отличаются уровнем блокировок.
🔹 Типы транзакций
1. DEFERRED (по умолчанию)
🔒 Блокировки ставятся только при первом доступе к таблице (на чтение/запись).
2. IMMEDIATE
🔒 Сразу ставит блокировку на запись (write-lock). Полезно, если точно знаешь, что будешь писать — исключишь гонки.
3. EXCLUSIVE
🔒 Блокирует БД полностью. Даже другие чтения не пройдут.
🔹 Особенности SQLite
- Одна запись за раз: SQLite поддерживает одновременные чтения, но только одну запись одновременно. Остальные получат "database is locked".
- Авто-коммиты: если явно не начать транзакцию - SQLite будет делать коммит после каждого запроса.
- Журналирование: SQLite использует WAL (write-ahead log) или rollback journal - в зависимости от настроек. WAL - более производителен для параллельного чтения.
💡 Советы
- При пакетной вставке всегда оборачивай в транзакцию:
BEGIN;
INSERT INTO users VALUES (...);
INSERT INTO users VALUES (...);
...
COMMIT;
→ Это в разы быстрее, чем отдельные
INSERT с автокоммитом.- Если получаешь ошибку
database is locked, проверь:- Не оставил ли ты открытые транзакции
- Не работают ли несколько процессов с БД одновременно без координации
Сохрани, чтобы не потерять!
#db
👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Мероприятие: PG BootCamp Russia — официальное российское комьюнити-мероприятие PostgreSQL
Когда: весна 2026 г. (дата уточняется)
Где: г. Москва
Больше о мероприятиях PG BootCamp
В отличие от коммерческих конференций, предметом докладов выступает «ванильная» версия этой СУБД. Темы выступлений, связанные с коммерческими продуктами, не принимаются. Доклады (их обычно до 16 в два трека) делятся по темам разработки и эксплуатации. Формат предполагает камерную атмосферу, максимальную практическую пользу и содержательное профессиональное общение.
Открыт прием заявок на выступления:
🔹Исследование внутренней архитектуры PostgreSQL
🔹 Оптимизация производительности в высоконагруженных системах
🔹Анализ сложных задач и методов их решения
🔹 Инструменты и методологии для DBA
🔹 R&D-исследования, связанные с Postgres
Если у вас есть материалы, которым вы хотите поделиться с сообществом, — пожалуйста, присылайте тезисы. Это возможность не только представить свою работу, но и получить содержательную обратную связь от ведущих специалистов.
🎙Подать заявку на выступление
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🚨 SELECT * - скрытый враг в проде
На dev-сервере всё шустро. В проде — беда: запросы висят, база потеет. И вроде бы всё ок... пока не заглянешь в SQL:
На первый взгляд — удобно. Но:
🔻 Проблемы “SELECT *”:
– Тянет все колонки, даже ненужные. А их может быть 30+.
– Увеличивает нагрузку на сеть и память приложения.
– Ломает кэш — ведь даже малейшие изменения в колонках меняют структуру результата.
– Убивает индекс-only scan: Postgres не может использовать покрывающий индекс, если явно не указаны поля.
✅ Как надо:
🎯 Выбирай только нужные поля:
💡 Хочешь “быстро протестить” в dev-е? Ок. Но не пускай такое в прод. Автоматизируй линтинг SQL, если надо.
Вывод:
Сохрани, чтобы не словить боль в проде.
А у тебя где последний раз встречалось
📲Мы в MAX
#db
👉 @database_info
На dev-сервере всё шустро. В проде — беда: запросы висят, база потеет. И вроде бы всё ок... пока не заглянешь в SQL:
SELECT * FROM users WHERE status = 'active';
На первый взгляд — удобно. Но:
🔻 Проблемы “SELECT *”:
– Тянет все колонки, даже ненужные. А их может быть 30+.
– Увеличивает нагрузку на сеть и память приложения.
– Ломает кэш — ведь даже малейшие изменения в колонках меняют структуру результата.
– Убивает индекс-only scan: Postgres не может использовать покрывающий индекс, если явно не указаны поля.
✅ Как надо:
🎯 Выбирай только нужные поля:
SELECT id, name, email FROM users WHERE status = 'active';
💡 Хочешь “быстро протестить” в dev-е? Ок. Но не пускай такое в прод. Автоматизируй линтинг SQL, если надо.
Вывод:
SELECT * — это не “удобно”, это дорого. И ты за него уже платишь.Сохрани, чтобы не словить боль в проде.
А у тебя где последний раз встречалось
SELECT *?📲Мы в MAX
#db
👉 @database_info
👍8😁1
Антипаттерн: NULL в WHERE — и ты в ловушке
Когда в таблице есть
Ты ожидаешь, что выберутся все, кто не 30.
Но если
Почему? Потому что
А SQL возвращает строки только там, где
Как избежать?
1. Будь явно осторожен с NULL:
2. Логика на уровне схемы:
– Если поле нужно всегда — делай
– Если допускаешь
3. Не верь глазам своим:
Даже
Вывод:
Это "мы не знаем". И SQL ведёт себя с ним очень осторожно.
Сохрани, чтобы не словить грабли.
📲Мы в MAX
#db
👉 @database_info
Когда в таблице есть
NULL, а в WHERE ты пишешь что-то вроде:
SELECT * FROM users WHERE age != 30;
Ты ожидаешь, что выберутся все, кто не 30.
Но если
age IS NULL — такие строки пропадут из выборки!Почему? Потому что
NULL != 30 не TRUE, это UNKNOWN. А SQL возвращает строки только там, где
WHERE → TRUE.Как избежать?
1. Будь явно осторожен с NULL:
SELECT * FROM users
WHERE age != 30 OR age IS NULL;
2. Логика на уровне схемы:
– Если поле нужно всегда — делай
NOT NULL. – Если допускаешь
NULL, продумывай поведение выборок.3. Не верь глазам своим:
Даже
count(*) и count(column) ведут себя по-разному из-за NULL.Вывод:
NULL — это не ноль, не пустая строка и не "ничего". Это "мы не знаем". И SQL ведёт себя с ним очень осторожно.
Сохрани, чтобы не словить грабли.
📲Мы в MAX
#db
👉 @database_info
👍6❤1👎1
🚨 Как понять, почему запрос тормозит?
Сегодня покажу простой, но действенный подход к диагностике медленных SQL-запросов. Когда к тебе приходит прод с жалобой "что-то всё виснет", важно не паниковать, а системно подойти к анализу.
Вот что я делаю первым делом:
1. Включаю
Это ваш лучший друг. Не
2. Смотрю на узлы с наибольшим временем
Часто виновник — Seq Scan по большой таблице или Nested Loop с миллионами итераций.
3. Ищу несработавшие индексы
Был ли
4. Проверяю фильтрацию и сортировку
ORDER BY может убить всё. Особенно если не по индексу.
5. Думаю про статистику
🛠 Если ты часто отлаживаешь SQL — советую поставить pgMustard или использовать EXPLAIN DEPOT. Они визуализируют планы и сразу показывают узкие места.
📲 Мы в MAX
#db
👉 @database_info
Сегодня покажу простой, но действенный подход к диагностике медленных SQL-запросов. Когда к тебе приходит прод с жалобой "что-то всё виснет", важно не паниковать, а системно подойти к анализу.
Вот что я делаю первым делом:
1. Включаю
EXPLAIN (ANALYZE)Это ваш лучший друг. Не
EXPLAIN, а именно ANALYZE, чтобы получить реальные значения времени, а не план на бумаге.2. Смотрю на узлы с наибольшим временем
Часто виновник — Seq Scan по большой таблице или Nested Loop с миллионами итераций.
3. Ищу несработавшие индексы
Был ли
Index Scan или Index Only Scan? Если нет — стоит проверить, почему не сработал индекс. Может, фильтр не селективный?4. Проверяю фильтрацию и сортировку
ORDER BY может убить всё. Особенно если не по индексу.
5. Думаю про статистику
ANALYZE делали недавно? PostgreSQL может строить плохой план, если у него устаревшие данные. 🛠 Если ты часто отлаживаешь SQL — советую поставить pgMustard или использовать EXPLAIN DEPOT. Они визуализируют планы и сразу показывают узкие места.
#db
👉 @database_info
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
📕Базовые принципы шардирования и репликации в ClickHouse
👤Вебинар для: Data-инженеров, архитекторов и аналитиков, администраторам баз данных и DevOps-инженеров, разработчиков высоконагруженных приложений
На открытом уроке 18 декабря в 20:00 мск мы разберемся в двух ключевых механизмоах для работы с большими данными в ClickHouse.
📗 На вебинаре разберем:
1. Что такое шардирование и репликация и зачем они нужны.
2. Как эти механизмы устроены внутри ClickHouse.
📘 В результате на практике изучите основные понятия (шард, реплика, Distributed-таблицы), поймете, как распределяются данные и обеспечивается отказоустойчивость, и узнаете, с чего начать проектирование кластера ClickHouse.
👉 Регистрация на урок и подробности о курсе ClickHouse для инженеров и архитекторов БД: https://vk.cc/cSoBSx
Все участники открытого урока получат скидку на курс "ClickHouse для инженеров и архитекторов БД"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👤Вебинар для: Data-инженеров, архитекторов и аналитиков, администраторам баз данных и DevOps-инженеров, разработчиков высоконагруженных приложений
На открытом уроке 18 декабря в 20:00 мск мы разберемся в двух ключевых механизмоах для работы с большими данными в ClickHouse.
📗 На вебинаре разберем:
1. Что такое шардирование и репликация и зачем они нужны.
2. Как эти механизмы устроены внутри ClickHouse.
📘 В результате на практике изучите основные понятия (шард, реплика, Distributed-таблицы), поймете, как распределяются данные и обеспечивается отказоустойчивость, и узнаете, с чего начать проектирование кластера ClickHouse.
👉 Регистрация на урок и подробности о курсе ClickHouse для инженеров и архитекторов БД: https://vk.cc/cSoBSx
Все участники открытого урока получат скидку на курс "ClickHouse для инженеров и архитекторов БД"
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍1
🚀 Сегодня я покажу вам один из моих любимых хаков для PostgreSQL – генерация серий дат без циклов и хранимок. Это идеальный способ быстро собрать таймлайн для аналитики или отчётов.
Сценарий: вам нужно построить список всех дат за последний месяц — например, чтобы потом сделать LEFT JOIN к таблице с событиями и увидеть, где были пропуски.
Вот как это делается с помощью
💡 Результат — 31 строка с датами от 30 дней назад до сегодняшнего дня.
Теперь добавим, например, LEFT JOIN к таблице
📊 Отлично подходит для дашбордов, когда нужно увидеть, где были дни без событий.
Пользуетесь ли вы
📲 Мы в MAX
#db
👉 @database_info
Сценарий: вам нужно построить список всех дат за последний месяц — например, чтобы потом сделать LEFT JOIN к таблице с событиями и увидеть, где были пропуски.
Вот как это делается с помощью
generate_series:
SELECT generate_series(
date_trunc('day', current_date) - interval '30 days',
date_trunc('day', current_date),
interval '1 day'
) AS day;
💡 Результат — 31 строка с датами от 30 дней назад до сегодняшнего дня.
Теперь добавим, например, LEFT JOIN к таблице
events, чтобы увидеть активность по дням:
SELECT
d.day,
COUNT(e.id) AS events_count
FROM
generate_series(
date_trunc('day', current_date) - interval '30 days',
date_trunc('day', current_date),
interval '1 day'
) AS d(day)
LEFT JOIN events e ON date_trunc('day', e.created_at) = d.day
GROUP BY d.day
ORDER BY d.day;
📊 Отлично подходит для дашбордов, когда нужно увидеть, где были дни без событий.
Пользуетесь ли вы
generate_series? А может быть, используете что-то подобное в других СУБД? Делитесь в комментариях👇📲 Мы в MAX
#db
👉 @database_info
👍8
Сегодня я хочу рассказать вам про одну часто недооцененную фишку в PostgreSQL - partial indexes (частичные индексы).
Обычно мы создаём индексы на всю таблицу, но что если нам нужно ускорить только небольшую часть данных? Например, часто выбираются только активные пользователи (
Что это даёт:
- Индекс меньше по размеру → быстрее поиск и обновление.
- Используется только тогда, когда запрос соответствует условию
- Меньше нагрузка на диск при обновлениях таблицы.
🛠 Где это реально помогает:
- Таблицы с миллионами записей, где активно работают только с частью строк.
- Сценарии "горячих" и "холодных" данных.
Рекомендую попробовать partial indexes там, где обычные индексы слишком тяжелы или тормозят обновления!
📲 Мы в MAX
#db
👉 @database_info
Обычно мы создаём индексы на всю таблицу, но что если нам нужно ускорить только небольшую часть данных? Например, часто выбираются только активные пользователи (
status = 'active'). Вместо полного индекса можно создать индекс только для нужного поднабора данных:
CREATE INDEX idx_active_users
ON users (last_login)
WHERE status = 'active';
Что это даёт:
- Индекс меньше по размеру → быстрее поиск и обновление.
- Используется только тогда, когда запрос соответствует условию
status = 'active'.- Меньше нагрузка на диск при обновлениях таблицы.
🛠 Где это реально помогает:
- Таблицы с миллионами записей, где активно работают только с частью строк.
- Сценарии "горячих" и "холодных" данных.
Рекомендую попробовать partial indexes там, где обычные индексы слишком тяжелы или тормозят обновления!
📲 Мы в MAX
#db
👉 @database_info
👍7❤2
⚡️Платите меньше за хранение логов и бэкапов
В S3 Selectel появился новый класс хранилища — ледяное. Оно оптимизировано под большие объемы редко используемых данных с типом репликации — Erasure Coding.
Теперь можно выбирать хранилище точно под задачу и экономить до 30% на хранении данных:
📊 для востребованных данных — стандартное хранилище,
🗄 для архивов — холодное,
📦 для логов, бэкапов и документов — ледяное, от 0,79 ₽/мес за 1 ГБ данных.
Переносите данные в S3 Selectel по акции «миграционные каникулы»: первый месяц хранение и входящие запросы будут бесплатными.
Создавайте заявку и переносите данные без лишних расходов → https://slc.tl/q66pd
Реклама. АО "Селектел". erid:2W5zFGewzkY
В S3 Selectel появился новый класс хранилища — ледяное. Оно оптимизировано под большие объемы редко используемых данных с типом репликации — Erasure Coding.
Теперь можно выбирать хранилище точно под задачу и экономить до 30% на хранении данных:
📊 для востребованных данных — стандартное хранилище,
🗄 для архивов — холодное,
📦 для логов, бэкапов и документов — ледяное, от 0,79 ₽/мес за 1 ГБ данных.
Переносите данные в S3 Selectel по акции «миграционные каникулы»: первый месяц хранение и входящие запросы будут бесплатными.
Создавайте заявку и переносите данные без лишних расходов → https://slc.tl/q66pd
Реклама. АО "Селектел". erid:2W5zFGewzkY
🔎 Мини-гайд: Индексы в PostgreSQL — быстро и по делу
Индексы — главный инструмент для ускорения запросов. Но неправильное использование может только навредить.
Основные типы индексов в PostgreSQL:
-
-
-
-
-
Практические советы:
- Не злоупотребляй индексами: каждый индекс замедляет
- Следи за актуальностью: периодически проверяй и удаляй неиспользуемые (
- Составные индексы (
- Используй
Типичная ошибка:
Создать индекс на всё подряд без анализа запросов. Итог — тормоза на записи и огромный размер базы.
✅ Индексы — это как специи: мало — пресно, много — несъедобно.
Вывод:
Хотите быструю базу — планируйте индексацию так же внимательно, как сами запросы.
Сохрани, чтобы не забыть!
📲 Мы в MAX
#db
👉 @database_info
Индексы — главный инструмент для ускорения запросов. Но неправильное использование может только навредить.
Основные типы индексов в PostgreSQL:
-
B-tree — по умолчанию. Идеален для поиска по равенству и диапазону (=, <, >, BETWEEN).-
Hash — только для поиска по точному равенству (=). Становится актуальным реже.-
GIN — для массивов, JSONB, полнотекстового поиска.-
GiST — геоданные, поиск по диапазонам, сложные типы.-
BRIN — для очень больших таблиц с упорядоченными данными (например, логи).Практические советы:
- Не злоупотребляй индексами: каждый индекс замедляет
INSERT/UPDATE/DELETE.- Следи за актуальностью: периодически проверяй и удаляй неиспользуемые (
pg_stat_user_indexes поможет).- Составные индексы (
(col1, col2)) эффективны, только если условия WHERE учитывают порядок колонок.- Используй
EXPLAIN ANALYZE, чтобы понять, работает ли индекс в реальности.Типичная ошибка:
Создать индекс на всё подряд без анализа запросов. Итог — тормоза на записи и огромный размер базы.
✅ Индексы — это как специи: мало — пресно, много — несъедобно.
Вывод:
Хотите быструю базу — планируйте индексацию так же внимательно, как сами запросы.
Сохрани, чтобы не забыть!
📲 Мы в MAX
#db
👉 @database_info
👍8
Система управления базами данных (СУБД) Platform V Pangolin DB от СберТеха стала ядром Комплексной информационной системы адвокатуры России (КИС АР), созданной Федеральной палатой адвокатов РФ. СУБД обеспечивает надежную и безопасную работу с данными для более 110 000 пользователей КИС АР.
Федеральная палата адвокатов РФ искала отечественное решение на замену зарубежному, чтобы легко справляться с большими объёмами чувствительных данных. Важным аргументом в пользу Platform V Pangolin DB стало наличие сертификата ФСТЭК.
Миграция на СУБД прошла бесшовно и незаметно для пользователей. КИС АР сохранила полную функциональность как в период самого перехода, так и после него. Процессы выполняются быстро, непрерывно и с сохранением высокого уровня безопасности данных.
Такое импортозамещение одобряем.
Федеральная палата адвокатов РФ искала отечественное решение на замену зарубежному, чтобы легко справляться с большими объёмами чувствительных данных. Важным аргументом в пользу Platform V Pangolin DB стало наличие сертификата ФСТЭК.
Миграция на СУБД прошла бесшовно и незаметно для пользователей. КИС АР сохранила полную функциональность как в период самого перехода, так и после него. Процессы выполняются быстро, непрерывно и с сохранением высокого уровня безопасности данных.
Такое импортозамещение одобряем.