Если вы работаете с JSON в Postgres, вы, вероятно, заметили, что для этого существуют два отдельных типа данных. Так в чём разница между json и jsonb?
> json — лёгкое, необработанное хранение
> jsonb — структурированное, индексируемое и производительное
◘ json сохраняет текст в точности так, как он был введён, без обработки. Это, как правило, более лёгкий и быстрый вариант при записи, поскольку отсутствует дополнительный разбор. Однако операции с ним могут быть медленнее, так как разбор выполняется во время исполнения. Обычный json также не может быть проиндексирован.
◘ jsonb сохраняет данные в бинарном формате, при этом данные разбираются заранее при сохранении. jsonb обладает большей структурой (например, отсутствуют дублирующиеся ключи), может индексироваться и обеспечивает более быструю работу при выполнении запросов. Подавляющее большинство разработчиков, использующих JSON в Postgres, работают именно с jsonb.
👉 @SQLPortal
> json — лёгкое, необработанное хранение
> jsonb — структурированное, индексируемое и производительное
◘ json сохраняет текст в точности так, как он был введён, без обработки. Это, как правило, более лёгкий и быстрый вариант при записи, поскольку отсутствует дополнительный разбор. Однако операции с ним могут быть медленнее, так как разбор выполняется во время исполнения. Обычный json также не может быть проиндексирован.
◘ jsonb сохраняет данные в бинарном формате, при этом данные разбираются заранее при сохранении. jsonb обладает большей структурой (например, отсутствуют дублирующиеся ключи), может индексироваться и обеспечивает более быструю работу при выполнении запросов. Подавляющее большинство разработчиков, использующих JSON в Postgres, работают именно с jsonb.
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Нашёл ресурс для создания SQL-баз данных:
✓ Генерируй таблицы и данные с помощью ИИ
✓ Визуализируй диаграммы и связи
✓ Деплой в Supabase в один клик
И главное — бесплатно → https://database.build/
👉 @SQLPortal
✓ Генерируй таблицы и данные с помощью ИИ
✓ Визуализируй диаграммы и связи
✓ Деплой в Supabase в один клик
И главное — бесплатно → https://database.build/
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое векторная база данных?
От базовых понятий, таких как что такое вектор?, до продвинутых возможностей: настройка payload'ов, гибридный поиск, шардинг, мультитенантность, квантизация, RBAC и многое другое.
Эта статья охватывает всё, что нужно знать о векторных базах данных🌹
👉 @SQLPortal
От базовых понятий, таких как что такое вектор?, до продвинутых возможностей: настройка payload'ов, гибридный поиск, шардинг, мультитенантность, квантизация, RBAC и многое другое.
Эта статья охватывает всё, что нужно знать о векторных базах данных
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
В Postgres есть удобные команды psql, начинающиеся на \d, для получения информации о таблицах. Вот полезные примеры:
Таблицы
Индексы
Представления (views)
Эти команды экономят время при анализе схемы БД прямо из psql.
👉 @SQLPortal
Таблицы
\d
— список всех объектов (таблиц, вьюх, индексов и т.п.)\d <table_name>
— описание конкретной таблицы\dt
— список только таблиц\dti+
— таблицы с информацией о размере и типе\dp
— права доступа к таблицамИндексы
\di
— список всех индексов\di <index_name>
— описание конкретного индексаПредставления (views)
\dv
— список всех вьюх\dv <view_name>
— описание конкретной вьюхиЭти команды экономят время при анализе схемы БД прямо из psql.
Please open Telegram to view this post
VIEW IN TELEGRAM
B-деревья — самая распространённая структура данных для индексов в базах данных.
Но как они работают?
Попробуй этот интерактивный онлайн-инструмент, чтобы увидеть это на практике:
> Дерево остаётся сбалансированным при добавлении новых значений
> Поиск ключей происходит путём обхода дерева
👉 @SQLPortal
Но как они работают?
Попробуй этот интерактивный онлайн-инструмент, чтобы увидеть это на практике:
> Дерево остаётся сбалансированным при добавлении новых значений
> Поиск ключей происходит путём обхода дерева
Please open Telegram to view this post
VIEW IN TELEGRAM
Избегай ошибок при приведении значений к другому типу данных в Oracle SQL с помощью:
Если значение не может быть преобразовано, будет возвращено
Это также работает в функциях, специфичных для типов, например
👉 @SQLPortal
CAST ( ... AS <data type> DEFAULT [ NULL | <val> ] ON CONVERSION ERROR )
Если значение не может быть преобразовано, будет возвращено
[ NULL | <val> ]
вместо ошибки.Это также работает в функциях, специфичных для типов, например
TO_DATE
и других.Please open Telegram to view this post
VIEW IN TELEGRAM
Используя приведённые выше таблицы, напишите запрос для получения списка пациентов, прикреплённых к конкретному врачу, и количества приёмов, запланированных на каждый день недели.
👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Хочешь меееедленный код для базы данных?
Начни с написания цикла, а внутри него помести SQL-операторы, обрабатывающие по одной строке за итерацию:😂
Чтобы сделать быстро — обрабатывай все данные одним SQL-запросом
👉 @SQLPortal
Начни с написания цикла, а внутри него помести SQL-операторы, обрабатывающие по одной строке за итерацию:
FOR i IN 1 .. n LOOP
[SELECT | UPDATE | DELETE] ... WHERE col = i;
END LOOP;
Чтобы сделать быстро — обрабатывай все данные одним SQL-запросом
Please open Telegram to view this post
VIEW IN TELEGRAM
Единственный MCP-сервер, который вам когда-либо понадобится
MindsDB позволяет выполнять запросы к данным из 200+ источников — Slack, Gmail, соцсетей и других — с помощью SQL или естественного языка.
Федеративный движок запросов с встроенным MCP-сервером.
✅ Полностью open-source
⭐️ 31k+ звёзд на GitHub
👉 @SQLPortal
MindsDB позволяет выполнять запросы к данным из 200+ источников — Slack, Gmail, соцсетей и других — с помощью SQL или естественного языка.
Федеративный движок запросов с встроенным MCP-сервером.
Please open Telegram to view this post
VIEW IN TELEGRAM
В PostgreSQL есть специальный параметр для логирования долго выполняющихся запросов —
После установки этого параметра PostgreSQL будет записывать в лог длительность и текст запроса, если он выполняется дольше указанного времени.
Это полезно для того, чтобы:
> определить, какие запросы работают медленно;
> понять, где можно добавить индексы для повышения производительности.
Параметр можно задать и на уровне сессии, если нужно логировать (или, наоборот, исключить из логирования) только конкретные запросы:
👉 @SQLPortal
log_min_duration_statement
.После установки этого параметра PostgreSQL будет записывать в лог длительность и текст запроса, если он выполняется дольше указанного времени.
ALTER DATABASE postgres SET log_min_duration_statement = '500ms';
Это полезно для того, чтобы:
> определить, какие запросы работают медленно;
> понять, где можно добавить индексы для повышения производительности.
Параметр можно задать и на уровне сессии, если нужно логировать (или, наоборот, исключить из логирования) только конкретные запросы:
SET log_min_duration_statement = '20000ms';
log_min_duration_statement
— действительно мощный инструмент, но мы обычно не рекомендуем устанавливать его на очень низкие значения (0, 1 или 5 мс), так как это приведёт к логированию практически всех операций базы данных. Это создаст шум в логах и может занять много места на диске.Please open Telegram to view this post
VIEW IN TELEGRAM
Ищешь бесплатную базу данных MongoDB?
✓ Трафик включён
✓ 512 МБ хранилища
✓ 3000 операций в секунду
Без ограничения по времени использования — идеально для практики
> free-mongo-db
👉 @SQLPortal
✓ Трафик включён
✓ 512 МБ хранилища
✓ 3000 операций в секунду
Без ограничения по времени использования — идеально для практики
> free-mongo-db
Please open Telegram to view this post
VIEW IN TELEGRAM
Для фоновых задач, таких как vacuum и создание индексов, Postgres использует специальное выделение памяти под названием
Если требуется ускорить выполнение задач, таких как:
> выполнение vacuum,
> создание индексов,
> создание индексов для материализованных представлений,
используйте:
Установите значение, которое предоставит вашим операциям больше памяти. По умолчанию используется 64MB. Этот параметр можно задать как глобально на уровне системы, так и локально для одной сессии.
👉 @SQLPortal
maintenance_work_mem
. Обычные запросы используют work_mem
, чтобы определить, сколько памяти может быть выделено на одну операцию или соединение.Если требуется ускорить выполнение задач, таких как:
> выполнение vacuum,
> создание индексов,
> создание индексов для материализованных представлений,
используйте:
SET maintenance_work_mem = '8GB';
Установите значение, которое предоставит вашим операциям больше памяти. По умолчанию используется 64MB. Этот параметр можно задать как глобально на уровне системы, так и локально для одной сессии.
Please open Telegram to view this post
VIEW IN TELEGRAM
Если у вас есть пространственные данные, которые вы хотите визуализировать на карте, этот блог показывает, как подключить QGIS — инструмент с открытым исходным кодом для картографии — к базе данных PostgreSQL/PostGIS
👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
При разработке приложений для бронирования Postgres значительно упрощает задачу предотвращения перекрытия бронирований.
С помощью ограничения
👉 @SQLPortal
С помощью ограничения
EXCLUDE
можно гарантировать, что не будет создано двух бронирований с одинаковым room_id
на пересекающиеся временные интервалы, обеспечивая целостность данных на уровне базы данныхPlease open Telegram to view this post
VIEW IN TELEGRAM
Мониторинг IOPS в Postgres
Для оценки производительности базы данных стоит обращать внимание на iowait как часть метрик CPU.
Iowait — это время, когда процессы ожидают завершения операций ввода-вывода. При этом процессор не загружен, но простаивает, потому что ждет отклика от дисковой подсистемы.
Если это происходит часто — это сигнал, что диск не справляется с нагрузкой, и CPU простаивает, хотя мог бы выполнять задачи.
Iowait можно измерять через большинство инструментов мониторинга CPU, а также прямо в Postgres с помощью расширения
Если вы видите небольшие пики iowait (как на диаграмме), скорее всего, идет бэкап или плановая операция.
Если пики значительные — возможно, база данных недополучает ресурсы, или требуется работа по оптимизации производительности.
👉 @SQLPortal
Для оценки производительности базы данных стоит обращать внимание на iowait как часть метрик CPU.
Iowait — это время, когда процессы ожидают завершения операций ввода-вывода. При этом процессор не загружен, но простаивает, потому что ждет отклика от дисковой подсистемы.
Если это происходит часто — это сигнал, что диск не справляется с нагрузкой, и CPU простаивает, хотя мог бы выполнять задачи.
Iowait можно измерять через большинство инструментов мониторинга CPU, а также прямо в Postgres с помощью расширения
pg_proctab
.Если вы видите небольшие пики iowait (как на диаграмме), скорее всего, идет бэкап или плановая операция.
Если пики значительные — возможно, база данных недополучает ресурсы, или требуется работа по оптимизации производительности.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Базы данных PostgreSQL с высокой нагрузкой на запись могут исчерпать идентификаторы транзакций (transaction IDs). Обычно это становится проблемой при достижении около 2 миллиардов транзакций. В критический момент PostgreSQL завершает работу, чтобы предотвратить повреждение данных.
Для большинства приложений это никогда не вызывает проблем. Но для систем с очень интенсивной записью за этим нужно следить.🤵
Обычно решение заключается в выполнении VACUUM или настройке параметров автovacuum, чтобы строки и транзакции корректно очищались.
Если вы хотите проверить, насколько вы близки к wraparound (переполнению XID), вот запрос для диагностики:
👉 @SQLPortal
Для большинства приложений это никогда не вызывает проблем. Но для систем с очень интенсивной записью за этим нужно следить.
Обычно решение заключается в выполнении VACUUM или настройке параметров автovacuum, чтобы строки и транзакции корректно очищались.
Если вы хотите проверить, насколько вы близки к wraparound (переполнению XID), вот запрос для диагностики:
WITH max_age AS (
SELECT
2000000000 AS max_old_xid,
setting AS autovacuum_freeze_max_age
FROM pg_catalog.pg_settings
WHERE name = 'autovacuum_freeze_max_age'
),
per_database_stats AS (
SELECT
datname,
m.max_old_xid::int,
m.autovacuum_freeze_max_age::int,
age(d.datfrozenxid) AS oldest_current_xid
FROM pg_catalog.pg_database d
JOIN max_age m ON (true)
WHERE d.datallowconn
)
SELECT
MAX(oldest_current_xid) AS oldest_current_xid,
MAX(ROUND(100 * (oldest_current_xid / max_old_xid::float))) AS percent_towards_wraparound,
MAX(ROUND(100 * (oldest_current_xid / autovacuum_freeze_max_age::float))) AS percent_towards_emergency_autovac
FROM per_database_stats;
Please open Telegram to view this post
VIEW IN TELEGRAM
Устали от лагов, сложных панелей и переплат? Переходите на VPS с AMD Ryzen 9 — быстро, просто, без нервов.
— Цена начинается от 2€
— Скорость канала до 10 Гбит/с
— Поддержка 24/7 — отвечаем быстро и без шаблонов
VPN | Расширение для браузера
Please open Telegram to view this post
VIEW IN TELEGRAM
Давайте попрактикуемся в SQL
Из приведённых выше таблиц напишите SQL-запрос, который находит продавцов (salespeople) и клиентов (customers), проживающих в одном городе
👉 @SQLPortal
Из приведённых выше таблиц напишите SQL-запрос, который находит продавцов (salespeople) и клиентов (customers), проживающих в одном городе
Please open Telegram to view this post
VIEW IN TELEGRAM