Карен Джекс поделилась свежим материалом о партиционировании в Postgres.
Ранее она выступила с этим докладом на Euroko, а теперь опубликовала подробный блог с разбором примера и практическими рекомендациями по эффективному использованию партиционирования.
https://karenjex.blogspot.com/2025/09/postgres-partitioning-best-practices.html
👉 @SQLPortal
Ранее она выступила с этим докладом на Euroko, а теперь опубликовала подробный блог с разбором примера и практическими рекомендациями по эффективному использованию партиционирования.
https://karenjex.blogspot.com/2025/09/postgres-partitioning-best-practices.html
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Pro-tip по дизайну БД: Soft Deletes
Soft delete — вместо того чтобы физически удалять строку, мы помечаем её как удалённую (например,
Плюсы:
- удобно для undo (отката);
- хранение истории ;
- не ломаются внешние ключи.
Но!🚬
Если напрямую писать запросы к таблице, половина кода будет забывать исключать «удалённые» строки. В итоге поведение приложения становится непредсказуемым и разъезжается в разных местах.
Решение
Всегда создавай view, которое сразу фильтрует «живые» строки.
Разработчики по умолчанию работают именно с view, а к базовой таблице обращаются только когда реально нужны «удалённые» данные.
Делай «безопасный путь» простым и привычным.
👉 @SQLPortal
Soft delete — вместо того чтобы физически удалять строку, мы помечаем её как удалённую (например,
deleted_at TIMESTAMP). Плюсы:
- удобно для undo (отката);
- хранение истории ;
- не ломаются внешние ключи.
Но!
Если напрямую писать запросы к таблице, половина кода будет забывать исключать «удалённые» строки. В итоге поведение приложения становится непредсказуемым и разъезжается в разных местах.
Решение
Всегда создавай view, которое сразу фильтрует «живые» строки.
CREATE VIEW users_active AS
SELECT * FROM users WHERE deleted_at IS NULL;
Разработчики по умолчанию работают именно с view, а к базовой таблице обращаются только когда реально нужны «удалённые» данные.
Делай «безопасный путь» простым и привычным.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥5❤2
Автоматизируйте задачи в Postgres с помощью pg_cron. Этот инструмент позволяет по расписанию запускать простые задачи, например VACUUM или пересборку материализованных представлений.
👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9👍4🔥3
Чтобы кешировать результаты вызовов функций в PL/SQL, объявляйте их с модификаторами:
DETERMINISTIC ⇒ кеширование в пределах одного SQL-выражения
RESULT_CACHE ⇒ кеширование между сессиями
Перед использованием убедитесь, что функции имеют ограниченное количество уникальных входных данных и действительно являются детерминированными.
https://mikesmithers.wordpress.com/2022/10/16/deterministic-and-result_cache-pl-sql-functions/
👉 @SQLPortal
DETERMINISTIC ⇒ кеширование в пределах одного SQL-выражения
RESULT_CACHE ⇒ кеширование между сессиями
Перед использованием убедитесь, что функции имеют ограниченное количество уникальных входных данных и действительно являются детерминированными.
https://mikesmithers.wordpress.com/2022/10/16/deterministic-and-result_cache-pl-sql-functions/
Please open Telegram to view this post
VIEW IN TELEGRAM
The Anti-Kyte
DETERMINISTIC and RESULT_CACHE PL/SQL functions
Recent events here in the UK have once again emphasised the value of being careful with your “cache”. To this end, I’m going to take a look at how PL/SQL functions defined using t…
👍4❤2
Совет по Postgres для тестирования расширений:
Можно использовать команду LOAD, чтобы подгрузить общие библиотеки только в рамках текущей сессии, вместо изменения shared_preload_libraries и перезапуска Postgres.
👉 @SQLPortal
Можно использовать команду LOAD, чтобы подгрузить общие библиотеки только в рамках текущей сессии, вместо изменения shared_preload_libraries и перезапуска Postgres.
LOAD 'auto_explain';
LOAD 'pg_stat_statements';
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3
Индексируйте скалярные значения в массивах JSON, хранящихся в Oracle Database, с помощью
Оптимизатор может использовать такие индексы при поиске по массиву с помощью
👉 @SQLPortal
CREATE MULTIVALUE INDEX ... ON t ( t.json_data.array.<type> )
Оптимизатор может использовать такие индексы при поиске по массиву с помощью
JSON_EXISTS ( t.json_data, '$.array?(@.<type> == ... )' )
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3
Где разместить базу данных бесплатно
Актуальные бесплатные платформы на сегодня ↓
🟢 MongoDB Atlas
MongoDB — 512 МБ, автоматические бэкапы
→ mongodb.com
🟢 Neon Tech
PostgreSQL — 500 МБ, 190 часов вычислений
→ neon.tech
🟢 FreeDB Tech
MySQL — 25 МБ, максимум 200 подключений
→ freedb.tech
🟢 Turso
SQLite — 5 ГБ, до 500 миллионов чтений
→ turso.tech
🟢 Upstash
Redis — 256 МБ, 500 000 команд
→ upstash.com
🟢 Xata
PostgreSQL — 15 ГБ, безлимитный трафик
→ lite.xata.io
🟢 Supabase
PostgreSQL — 500 МБ, 5 ГБ трафика
→ supabase.com
🟢 CockroachDB
10 ГБ хранилища, 50 млн запросов
→ cockroachlabs.com
🟢 Koyeb
PostgreSQL — 1 ГБ, 5 часов выполнения
→ koyeb.com
👉 @SQLPortal
Актуальные бесплатные платформы на сегодня ↓
MongoDB — 512 МБ, автоматические бэкапы
→ mongodb.com
PostgreSQL — 500 МБ, 190 часов вычислений
→ neon.tech
MySQL — 25 МБ, максимум 200 подключений
→ freedb.tech
SQLite — 5 ГБ, до 500 миллионов чтений
→ turso.tech
Redis — 256 МБ, 500 000 команд
→ upstash.com
PostgreSQL — 15 ГБ, безлимитный трафик
→ lite.xata.io
PostgreSQL — 500 МБ, 5 ГБ трафика
→ supabase.com
10 ГБ хранилища, 50 млн запросов
→ cockroachlabs.com
PostgreSQL — 1 ГБ, 5 часов выполнения
→ koyeb.com
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Как добиться index-only scan в Postgres?
Используйте covering indexes (покрывающие индексы).
Этот запрос можно полностью покрыть индексом:
Так Postgres сможет получить все нужные данные прямо из индекса, не обращаясь к таблице.
Хотите логировать действительно долгие запросы?
Можно настроить auto_explain так, чтобы он логировал только запросы, превышающие заданное время выполнения:
Это позволит автоматически сохранять планы выполнения только для запросов, которые работают дольше 1 секунды.
👉 @SQLPortal
Используйте covering indexes (покрывающие индексы).
SELECT name, email FROM web_users WHERE id = 123;
Этот запрос можно полностью покрыть индексом:
CREATE INDEX idx_users_includes
ON web_users (id)
INCLUDE (name, email);
Так Postgres сможет получить все нужные данные прямо из индекса, не обращаясь к таблице.
Хотите логировать действительно долгие запросы?
Можно настроить auto_explain так, чтобы он логировал только запросы, превышающие заданное время выполнения:
auto_explain.log_min_duration = '1000ms';
Это позволит автоматически сохранять планы выполнения только для запросов, которые работают дольше 1 секунды.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10👍7
Скрытые возможности PostgreSQL
В материале автор делится пятью возможностями, о которых редко говорят в сообществе PostgreSQL. Среди них — GRANT SELECT, DISTINCT ON, ограничения EXCLUDE и другие интересные приемы.
Читать статью: тык
👉 @SQLPortal
В материале автор делится пятью возможностями, о которых редко говорят в сообществе PostgreSQL. Среди них — GRANT SELECT, DISTINCT ON, ограничения EXCLUDE и другие интересные приемы.
Читать статью: тык
Please open Telegram to view this post
VIEW IN TELEGRAM
Хабр
Пять возможностей PostgreSQL, о которых редко вспоминают
Привет, Хабр! Постгрес – не просто реляционная БД, а настоящий кладезь фич, о которых начинающий разработчик может и не догадываться. Всё началось с того, что PostgreSQL изначально писался на С/C++ и...
👍5
На GitHub опубликован бесплатный «6-недельный дорожный план по SQL для Data Science / аналитики»
Проект предлагает по неделе на ключевые темы: основы SQL и SELECT, агрегаты и GROUP BY, JOIN-ы, оконные функции, CTE и подзапросы, а затем — самостоятельные проекты для закрепления навыков😎
👉 @SQLPortal
Проект предлагает по неделе на ключевые темы: основы SQL и SELECT, агрегаты и GROUP BY, JOIN-ы, оконные функции, CTE и подзапросы, а затем — самостоятельные проекты для закрепления навыков
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - andresvourakis/free-6-week-sql-roadmap-data-science: A roadmap to guide you through mastering SQL for Data Science in…
A roadmap to guide you through mastering SQL for Data Science in just 6 weeks for free - andresvourakis/free-6-week-sql-roadmap-data-science
❤7
На официальной вики PostgreSQL опубликована статья “Don’t Do This”, где собраны типичные ошибки при работе с базой данных и объясняется, почему их стоит избегать
👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
Инструмент командной строки для мониторинга активности сервера PostgreSQL
https://github.com/dalibo/pg_activity
👉 @SQLPortal
https://github.com/dalibo/pg_activity
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
This media is not supported in your browser
VIEW IN TELEGRAM
Использую Beekeeper Studio больше полугода и это самый удобный и красивый бесплатный менеджер баз данных, с которым мне доводилось работать. Приятен интерфейс, удобные горячие клавиши, интуитивная навигация, а подсветка и подтверждение перед удалением файлов делают работу безопасной.
Бесплатная версия покрывает большинство нужных функций, подписка не нужна. Рекомендую всем попробовать.😎
GitHub: beekeeper-studio
👉 @SQLPortal
Бесплатная версия покрывает большинство нужных функций, подписка не нужна. Рекомендую всем попробовать.
GitHub: beekeeper-studio
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6💊3
This media is not supported in your browser
VIEW IN TELEGRAM
В Oracle SQL вы можете вычесть один год из даты с помощью одного из вариантов:
Но будьте внимательны — они по-разному обрабатывают 29 февраля:
👉 @SQLPortal
ADD_MONTHS(dt, -12)
- INTERVAL '1' YEAR
Но будьте внимательны — они по-разному обрабатывают 29 февраля:
ADD_MONTHS → 29 февраля преобразуется в 28 февраля предыдущего годаINTERVAL → 29 февраля преобразуется в 29 февраля предыдущего года → ошибка!Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤5
Интересный факт про vector search: проверка меньшего объёма данных делает поиск быстрее и точнее.
Алгоритм HNSW это основа одних из самых быстрых векторных поисков. Если вы использовали Weaviate или другие векторные базы, вы уже сталкивались с HNSW, это стандартный тип индекса, и не случайно.
HNSW можно представить как многоуровневую транспортную систему для векторов: сверху —> редкие длинные связи для глобальной навигации, средний уровень —> средние связи для регионального поиска, низкий уровень —> плотные связи для всех векторов для точного результата. Поиск начинается сверху, постепенно уточняется на каждом слое и в конце достигает максимальной точности на нижнем уровне. Алгоритм «перепрыгивает» через множество неактуальных данных вместо проверки каждого вектора, что делает его быстрее brute-force методов.
Основные параметры, которые можно настраивать:
• maxConnections —> плотность графа; большее значение повышает точность, но замедляет поиск и требует больше памяти
• ef, efConstruction —> динамический размер списков для поиска и построения графа, влияющий на баланс между скоростью и точностью
HNSW это баланс между скоростью, точностью и расходом памяти; улучшение одного всегда требует компромисса с другими.
Подробнее о настройке HNSW и оптимизации: Weaviate docs
👉 @SQLPortal
Алгоритм HNSW это основа одних из самых быстрых векторных поисков. Если вы использовали Weaviate или другие векторные базы, вы уже сталкивались с HNSW, это стандартный тип индекса, и не случайно.
HNSW можно представить как многоуровневую транспортную систему для векторов: сверху —> редкие длинные связи для глобальной навигации, средний уровень —> средние связи для регионального поиска, низкий уровень —> плотные связи для всех векторов для точного результата. Поиск начинается сверху, постепенно уточняется на каждом слое и в конце достигает максимальной точности на нижнем уровне. Алгоритм «перепрыгивает» через множество неактуальных данных вместо проверки каждого вектора, что делает его быстрее brute-force методов.
Основные параметры, которые можно настраивать:
• maxConnections —> плотность графа; большее значение повышает точность, но замедляет поиск и требует больше памяти
• ef, efConstruction —> динамический размер списков для поиска и построения графа, влияющий на баланс между скоростью и точностью
HNSW это баланс между скоростью, точностью и расходом памяти; улучшение одного всегда требует компромисса с другими.
Подробнее о настройке HNSW и оптимизации: Weaviate docs
Please open Telegram to view this post
VIEW IN TELEGRAM
🌭4🤔1
Совет для PostgreSQL: используйте NULLS LAST или NULLS FIRST в ORDER BY, чтобы управлять расположением NULL‑значений в результатах запроса.
Пример:
В этом случае строки с NULL в order_date окажутся в начале результата.
👉 @SQLPortal
Пример:
SELECT order_id, product_name
FROM orders
ORDER BY order_date DESC NULLS FIRST;
В этом случае строки с NULL в order_date окажутся в начале результата.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥5
Делаешь ли ты эти типичные ошибки в SQL?
Забываешь про NULL
Обрабатываешь данные в памяти Java
Используешь JDBC-пагинацию для больших выборок
Применяешь агрегатные функции вместо оконных
Лукас Эдер объясняет, как делать правильно — и приводит ещё 7 распространённых ошибок.
👉 @SQLPortal
Забываешь про NULL
Обрабатываешь данные в памяти Java
Используешь JDBC-пагинацию для больших выборок
Применяешь агрегатные функции вместо оконных
Лукас Эдер объясняет, как делать правильно — и приводит ещё 7 распространённых ошибок.
Please open Telegram to view this post
VIEW IN TELEGRAM
Java, SQL and jOOQ.
10 Common Mistakes Java Developers Make when Writing SQL
This article is part of a series. You might also like: 10 More Common Mistakes Java Developers Make when Writing SQLYet Another 10 Common Mistakes Java Developers Make When Writing SQL Java develop…
🔥8
onedump позволяет создавать резервные копии и восстанавливать базы данных MySQL и PostgreSQL на локальном компьютере, S3, Google Drive, Dropbox или SFTP с помощью одного инструмента.
https://github.com/liweiyi88/onedump
👉 @SQLPortal
https://github.com/liweiyi88/onedump
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥5
Media is too big
VIEW IN TELEGRAM
SQL встречается с семантическим поиском 🔥
Обычные базы данных не понимают естественный язык. Векторные базы не умеют точно фильтровать.
Knowledge Base Algebra от MindsDB решает эту проблему. И всё это полностью open-source.
Можно подключить больше 200 источников данных — как структурированных, так и неструктурированных и собрать единую базу знаний, которая объединяет семантический поиск, фильтрацию по метаданным и сложную булеву логику (SQL) в одной системе.
Пользователи просто пишут запросы обычным языком. Всё.
Для примера взяли рекомендательную систему фильмов с базой на 300k+ тайтлов. У части данных чёткие поля (жанр, рейтинг, год), а у большинства сплошной бардак (сюжеты, отзывы, куски текста).
С привычными инструментами вариантов немного:
Писать жёсткие SQL-фильтры и терять смысл
Использовать LLM, которая просто угадывает
С MindsDB можно задавать вопрос на естественном языке. Система сама определяет, где нужен семантический поиск, где фильтры, где логика, и возвращает точный результат.
И главное всё это можно запускать локально, прямо на своей машине.
👉 @SQLPortal
Обычные базы данных не понимают естественный язык. Векторные базы не умеют точно фильтровать.
Knowledge Base Algebra от MindsDB решает эту проблему. И всё это полностью open-source.
Можно подключить больше 200 источников данных — как структурированных, так и неструктурированных и собрать единую базу знаний, которая объединяет семантический поиск, фильтрацию по метаданным и сложную булеву логику (SQL) в одной системе.
Пользователи просто пишут запросы обычным языком. Всё.
Для примера взяли рекомендательную систему фильмов с базой на 300k+ тайтлов. У части данных чёткие поля (жанр, рейтинг, год), а у большинства сплошной бардак (сюжеты, отзывы, куски текста).
С привычными инструментами вариантов немного:
Писать жёсткие SQL-фильтры и терять смысл
Использовать LLM, которая просто угадывает
С MindsDB можно задавать вопрос на естественном языке. Система сама определяет, где нужен семантический поиск, где фильтры, где логика, и возвращает точный результат.
И главное всё это можно запускать локально, прямо на своей машине.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
В Oracle Database 21c улучшили цикл FOR в PL/SQL — теперь он стал куда гибче.
Добавили несколько новых возможностей:
BY — можно задать свой шаг итерации (кастомный инкремент)
IN — поддерживаются списки значений для прохода по ним
WHEN — можно задать условие, при котором тело цикла пропускается
REPEAT WHILE — выражение, определяющее следующее значение
MUTABLE — позволяет изменять значение счётчика прямо внутри цикла
Короче, теперь FOR в PL/SQL стал почти как нормальный итератор из современных языков.
👉 @SQLPortal
Добавили несколько новых возможностей:
BY — можно задать свой шаг итерации (кастомный инкремент)
IN — поддерживаются списки значений для прохода по ним
WHEN — можно задать условие, при котором тело цикла пропускается
REPEAT WHILE — выражение, определяющее следующее значение
MUTABLE — позволяет изменять значение счётчика прямо внутри цикла
Короче, теперь FOR в PL/SQL стал почти как нормальный итератор из современных языков.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
При работе с большими JSON-документами в Oracle 23ai можно нарваться на то, что длинные поля (больше 4000 байт) при выборке через JSON_TABLE возвращаются NULL. Это не баг, а поведение по умолчанию.
VARCHAR2 по умолчанию ограничен 4000 байт. Если значение длиннее, Oracle просто подставляет NULL.
Что делать:
Можно заставить выбрасывать ошибку, а не молча возвращать NULL:
Или явно указать, что поле должно возвращаться как CLOB:
в секции columns у JSON_TABLE.
Следи за длиной полей в JSON, особенно если работаешь с большими документами. И не забывай про CLOB, если значения потенциально огромные.
Подробнее: тык
@SQLPortal
VARCHAR2 по умолчанию ограничен 4000 байт. Если значение длиннее, Oracle просто подставляет NULL.
Что делать:
Можно заставить выбрасывать ошибку, а не молча возвращать NULL:
ALTER SESSION SET JSON_BEHAVIOR="ON_ERROR:ERROR";
Или явно указать, что поле должно возвращаться как CLOB:
c CLOB
в секции columns у JSON_TABLE.
Следи за длиной полей в JSON, особенно если работаешь с большими документами. И не забывай про CLOB, если значения потенциально огромные.
Подробнее: тык
@SQLPortal
👍4