Индексируй базу данных с осторожностью.
Каждый новый индекс приводит к:
(a) увеличению затрат на хранение (и, как следствие, дублированию данных)
(b) увеличению накладных расходов на
Общий принцип такой: индексы ускоряют чтение, но замедляют запись.
Важно найти баланс между достаточной индексацией, чтобы база быстро обслуживала запросы, и избытком индексов, который будет тормозить операции записи.
Хороший обзор этой темы есть у Маркуса в «Use the Index, Luke.»
👉 @SQLPortal
Каждый новый индекс приводит к:
(a) увеличению затрат на хранение (и, как следствие, дублированию данных)
(b) увеличению накладных расходов на
INSERT
Общий принцип такой: индексы ускоряют чтение, но замедляют запись.
Важно найти баланс между достаточной индексацией, чтобы база быстро обслуживала запросы, и избытком индексов, который будет тормозить операции записи.
Хороший обзор этой темы есть у Маркуса в «Use the Index, Luke.»
Please open Telegram to view this post
VIEW IN TELEGRAM
Use-The-Index-Luke
More indexes, slower INSERT
The more indexes you add, the slower INSERT becomes. Add as many as required but as few as possible.
❤8👍1🔥1
Для проверки видимости строк Postgres собирает все активные транзакции в массив, а строки сверяет с этим списком. Это становится частью снимка состояния транзакции.
Если строку создала одна из этих транзакций, она не видна.
Такая проверка может быть дорогой, когда активных транзакций много. То же касается большого числа подтранзакций.
Postgres сортирует этот массив и делает по нему бинарный поиск. Есть патчи, которые при необходимости переносят этот список в хеш-таблицу
👉 @SQLPortal
Если строку создала одна из этих транзакций, она не видна.
Такая проверка может быть дорогой, когда активных транзакций много. То же касается большого числа подтранзакций.
Postgres сортирует этот массив и делает по нему бинарный поиск. Есть патчи, которые при необходимости переносят этот список в хеш-таблицу
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3
Postgres 18 читает в 2–3 раза быстрее ⚡️
В Postgres 18 появляется крупное изменение в производительности чтения — новая фича async I/O (асинхронный ввод-вывод).
Что такое async I/O?
Когда Postgres читает данные с диска (не из shared buffer), нужен I/O для получения данных.
Синхронный I/O значит, что каждый запрос к диску ждёт завершения, прежде чем делать что-то ещё. Для нагруженных баз, особенно в облаке, это узкое место.
Асинхронный I/O позволяет воркерам использовать простои с пользой.
Запись в Postgres останется синхронной.
Аналогия с async I/O
Представьте заказ в ресторане. В синхронной модели вы делаете заказ и стоите у стойки, пока еду не подадут.
В асинхронной модели вы делаете заказ, получаете пейджер и спокойно идёте за стол, пока он не завибрирует, сигнализируя, что заказ готов.
Где async I/O применяется
- последовательные сканы
- bitmap heap scan (после bitmap index scan)
- часть обслуживания, например vacuum
Как включить?
Есть два варианта:
🔸
Shared worker-процессы синхронно загружают данные в shared buffers. Можно задать количество воркеров на инстанс. Поддерживается на всех платформах, где работает Postgres.
🔸
Для Postgres на Linux 5.1+ можно использовать системные вызовы io_uring. Тогда обращения выполняются самим backend-процессом, а не отдельными воркерами.
Также появится
👉 @SQLPortal
В Postgres 18 появляется крупное изменение в производительности чтения — новая фича async I/O (асинхронный ввод-вывод).
Что такое async I/O?
Когда Postgres читает данные с диска (не из shared buffer), нужен I/O для получения данных.
Синхронный I/O значит, что каждый запрос к диску ждёт завершения, прежде чем делать что-то ещё. Для нагруженных баз, особенно в облаке, это узкое место.
Асинхронный I/O позволяет воркерам использовать простои с пользой.
Запись в Postgres останется синхронной.
Аналогия с async I/O
Представьте заказ в ресторане. В синхронной модели вы делаете заказ и стоите у стойки, пока еду не подадут.
В асинхронной модели вы делаете заказ, получаете пейджер и спокойно идёте за стол, пока он не завибрирует, сигнализируя, что заказ готов.
Где async I/O применяется
- последовательные сканы
- bitmap heap scan (после bitmap index scan)
- часть обслуживания, например vacuum
Как включить?
Есть два варианта:
io_method = worker
Shared worker-процессы синхронно загружают данные в shared buffers. Можно задать количество воркеров на инстанс. Поддерживается на всех платформах, где работает Postgres.
io_method = io_uring
Для Postgres на Linux 5.1+ можно использовать системные вызовы io_uring. Тогда обращения выполняются самим backend-процессом, а не отдельными воркерами.
Также появится
pg_aios
— новый системный view для анализа данных async I/O.Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
This media is not supported in your browser
VIEW IN TELEGRAM
Это один из лучших AI-инструментов для разработчиков 🔥
Он позволяет визуально генерировать полностью структурированные базы данных с помощью обычных текстовых запросов. Просто опиши, что тебе нужно, и он соберёт всё мгновенно.
Таблицы, поля и связи создаются автоматически, экономя часы на ручной настройке.
Отлично подходит для прототипов и MVP.
Линк: database.build
👉 @SQLPortal
Он позволяет визуально генерировать полностью структурированные базы данных с помощью обычных текстовых запросов. Просто опиши, что тебе нужно, и он соберёт всё мгновенно.
Таблицы, поля и связи создаются автоматически, экономя часы на ручной настройке.
Отлично подходит для прототипов и MVP.
Линк: database.build
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤4🤔2
PostGIS 3.6 скоро выйдет, и в нём появилась новая функция:
Приходилось работать с полигонами, которые почти идеально укладываются в мозаику, но остаются мелкие зазоры или пересечения? Это и есть проблема очистки покрытия.
В реальных данных покрытия встречаются повсюду: штаты, округа, земельные участки… Каждый полигон должен стыковаться с соседними без наложений и дыр. Чистые покрытия открывают новые возможности: быстрое объединение через
Теперь, с поддержкой очистки покрытий в GEOS, PostGIS может автоматически исправлять такие несовершенные данные с помощью
👉 @SQLPortal
ST_CoverageClean
Приходилось работать с полигонами, которые почти идеально укладываются в мозаику, но остаются мелкие зазоры или пересечения? Это и есть проблема очистки покрытия.
В реальных данных покрытия встречаются повсюду: штаты, округа, земельные участки… Каждый полигон должен стыковаться с соседними без наложений и дыр. Чистые покрытия открывают новые возможности: быстрое объединение через
ST_CoverageUnion
, упрощение границ с помощью ST_CoverageSimplify
и другие операции.Теперь, с поддержкой очистки покрытий в GEOS, PostGIS может автоматически исправлять такие несовершенные данные с помощью
ST_CoverageClean
CREATE TABLE polygons_clean AS (
SELECT
id,
ST_CoverageClean(geom, gapMaximumWidth => 10000) OVER () AS geom
FROM polygons
);
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6
Нравится контраст между буферизацией страниц данных в MySQL и Postgres. Подходы кардинально разные.
InnoDB в MySQL делает ставку на больший контроль. С
Пул делится на несколько подэкземпляров. Каждый держит двухчастный список страниц LRU: young и old. Новые страницы попадают в old и должны «прожить» без вытеснения заданное время (
Postgres выбирает более простой внутренний кэш и полагается на кэш страниц ОС для загрузки/выгрузки. Размер задаёт
Для вытеснения Postgres использует clock-sweep. У каждой страницы в
Отличный README из репозитория Postgres: ссылка
👉 @SQLPortal
InnoDB в MySQL делает ставку на больший контроль. С
innodb_flush_method='O_DIRECT'
движок обходит большую часть накладных расходов на кэш страниц ОС и управляет всем сам. Объём кэша задаёт innodb_buffer_pool_size
. На выделенных БД-серверах это часто 70%+ всей RAM.Пул делится на несколько подэкземпляров. Каждый держит двухчастный список страниц LRU: young и old. Новые страницы попадают в old и должны «прожить» без вытеснения заданное время (
innodb_old_blocks_time
), прежде чем их пустят в young. Это защищает от thrashing при массовых операциях вроде table scan.Postgres выбирает более простой внутренний кэш и полагается на кэш страниц ОС для загрузки/выгрузки. Размер задаёт
shared_buffers
. Часто ставят около 30% доступной RAM, оставляя место под кэш ОС.Для вытеснения Postgres использует clock-sweep. У каждой страницы в
shared_buffers
есть счётчик: он увеличивается при обращениях (до лимита) и уменьшается при проходе «часов». Когда счётчик падает до 0, страницу можно заменить другой.Отличный README из репозитория Postgres: ссылка
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Совет по SQL
Использование
Когда вы пишете
Основная сортировка по sales (по убыванию) дала ничью между Mira и Bob. Тогда в ход идёт вторая колонка. Сортировка по age (по возрастанию) ставит Mira (30 лет) перед Bob. Такой принцип применяется ко всем значениям, которые совпали на первом шаге.
Если и вторая сортировка тоже даёт одинаковые значения, некоторые СУБД сохраняют порядок вставки строк как дополнительный критерий. Но на больших и сложных наборах данных порядок чаще всего будет случайным.
👉 @SQLPortal
Использование
ORDER BY
с несколькими столбцамиКогда вы пишете
ORDER BY
с несколькими колонками, база данных сначала сортирует все строки по первой колонке (в примере это sales). Это образует группы строк с одинаковым значением. Например, Mira и Bob попали в одну группу, так как у обоих значение продаж равно 12 000.Основная сортировка по sales (по убыванию) дала ничью между Mira и Bob. Тогда в ход идёт вторая колонка. Сортировка по age (по возрастанию) ставит Mira (30 лет) перед Bob. Такой принцип применяется ко всем значениям, которые совпали на первом шаге.
Если и вторая сортировка тоже даёт одинаковые значения, некоторые СУБД сохраняют порядок вставки строк как дополнительный критерий. Но на больших и сложных наборах данных порядок чаще всего будет случайным.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7
This media is not supported in your browser
VIEW IN TELEGRAM
ByteByteGo выпустили наглядный разбор основных типов блокировок, которые используются в СУБД для управления конкурентным доступом к данным.
В списке:
👉 @SQLPortal
В списке:
• Shared Lock (S) — позволяет читать, но не менять данные
• Exclusive Lock (X) — блокировка для чтения и изменения
• Update Lock (U) — предотвращает взаимные блокировки при обновлениях
• Schema Lock — защита структуры базы
• Bulk Update Lock (BU) — оптимизация при массовых вставках
• Key Range Lock — предотвращает фантомные записи в индексах
• Row-Level Lock — блокировка на уровне строки
• Page-Level Lock — блокировка страницы данных
• Table-Level Lock — блокировка всей таблицы
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤4
Oracle уже давно запустила бесплатные викторины для практики SQL на Dev Gym. Там можно тренироваться в разных форматах: SQuizL с подсказками, Speed SQL на время и Weekly DB с еженедельным вопросом. Удобный способ освежить знания прямо в браузере.
https://devgym.oracle.com/pls/apex/f?p=10001:1204
👉 @SQLPortal
https://devgym.oracle.com/pls/apex/f?p=10001:1204
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤3
Совет по Postgres: не всегда нужно гонять SELECT COUNT(*)
Можно посмотреть внутреннюю статистику таблиц:
Запрос обращается к системным данным, а не к самой таблице. В результате вернется приблизительное количество строк, но без тяжёлого прохода по всей таблице. Отличный способ быстро прикинуть размер, если точность не критична.
👉 @SQLPortal
Можно посмотреть внутреннюю статистику таблиц:
SELECT reltuples::numeric as count
FROM pg_class
WHERE relname = 'table_name';
Запрос обращается к системным данным, а не к самой таблице. В результате вернется приблизительное количество строк, но без тяжёлого прохода по всей таблице. Отличный способ быстро прикинуть размер, если точность не критична.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍7
В Postgres 18 подъезжает приятное обновление: теперь при использовании pg_dump или pg_upgrade можно сохранять статистику таблиц 🎉
Это значит, что больше не нужно гонять долгий ANALYZE после апгрейда или дампа с восстановлением. Для тестов и разработки можно будет сразу брать статистику из продакшена. В pg_dump добавили опции
Небольшое, но реально полезное улучшение, которое упростит жизнь многим разработчикам
👉 @SQLPortal
Это значит, что больше не нужно гонять долгий ANALYZE после апгрейда или дампа с восстановлением. Для тестов и разработки можно будет сразу брать статистику из продакшена. В pg_dump добавили опции
-statistics-only
и -no-statistics
, так что можно самому решать, включать ли статистику.Небольшое, но реально полезное улучшение, которое упростит жизнь многим разработчикам
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11❤4👍1
Работаешь с моделированием данных, где куча тегов? В Postgres стоит попробовать массивы. Они могут работать быстрее при запросах, занимать меньше места и давать более простой синтаксис для выборок.
Подробнее об этом подходе тут
👉 @SQLPortal
Подробнее об этом подходе тут
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6🔥2
Функции нумерации строк в SQL:
👉 @SQLPortal
ROW_NUMBER
— последовательные целые числа, начиная с единицы.RANK
— строки с одинаковым значением сортировки получают один и тот же номер; следующая строка после «ничьей» получает значение так, как если бы использовался ROW_NUMBER
DENSE_RANK
— работает как RANK
, но нумерация идёт подряд без пропусков после «ничьих».Please open Telegram to view this post
VIEW IN TELEGRAM
❤4🔥2
Google представил новый язык программирования — Mangle, предназначенный для работы с базами данных. 😐
Он распространяется с открытым исходным кодом и сочетает в себе подход логического программирования с поддержкой рекурсивных правил. В языке есть агрегации, вызовы функций и опциональная типизация.
Репозиторий проекта доступен здесь: github.com/google/mangle
👉 @SQLPortal
Он распространяется с открытым исходным кодом и сочетает в себе подход логического программирования с поддержкой рекурсивных правил. В языке есть агрегации, вызовы функций и опциональная типизация.
Репозиторий проекта доступен здесь: github.com/google/mangle
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👀6
Проверь соответствие безопасности своей Oracle Database с помощью Database Security Assessment Tool (DBSAT) v4.0.
Инструмент включает в себя проверку соответствия стандартам STIG, анализ пользователей и их прав, а также выявление уязвимостей по непропатченным CVE.
Об этом рассказывает Pedro Lopes.
https://blogs.oracle.com/database/post/dbsat40
👉 @SQLPortal
Инструмент включает в себя проверку соответствия стандартам STIG, анализ пользователей и их прав, а также выявление уязвимостей по непропатченным CVE.
Об этом рассказывает Pedro Lopes.
https://blogs.oracle.com/database/post/dbsat40
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍3
JOIN против UNION в Postgres:
JOIN нужен для объединения столбцов➡️
UNION нужен для объединения строк⬇️
✤ JOIN объединяет столбцы из двух и более таблиц по связанному полю. Это как добавлять данные по горизонтали. Используй JOIN, когда нужно посмотреть данные из разных таблиц рядом. Пример:
✤ UNION складывает результаты двух и более SELECT в один набор строк. Это про объединение данных по вертикали. Таблицы должны иметь одинаковое количество столбцов и совместимые типы данных. Пример:
👉 @SQLPortal
JOIN нужен для объединения столбцов
UNION нужен для объединения строк
✤ JOIN объединяет столбцы из двух и более таблиц по связанному полю. Это как добавлять данные по горизонтали. Используй JOIN, когда нужно посмотреть данные из разных таблиц рядом. Пример:
SELECT employees.name, departments.location
FROM employees
JOIN departments
ON employees.dept_id = departments.id;
✤ UNION складывает результаты двух и более SELECT в один набор строк. Это про объединение данных по вертикали. Таблицы должны иметь одинаковое количество столбцов и совместимые типы данных. Пример:
SELECT city
FROM customers
UNION
SELECT city;
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍8
Хранение по строкам и хранение по колонкам это два разных способа организации данных, которые дают разный результат в работе.
В строковом варианте, как в Postgres или MySQL, все значения одной строки лежат рядом на диске.
Такой подход хорошо работает для транзакционных систем, где запросы чаще всего достают одну или несколько строк целиком, например
В колонковом варианте, как в BigQuery или ClickHouse, все значения одной колонки собраны вместе и хранятся в длинных последовательностях. Это упрощает сжатие данных и позволяет быстрее работать с аналитическими запросами.
Если нужно обработать миллионы строк, но использовать только одно поле, например в запросе
Когда объём данных небольшой, компания может использовать одну строковую базу и для транзакций, и для простых аналитических задач, часто вынося аналитику на реплику.
Но по мере роста нагрузки обычно выбирают разные решения: Postgres или MySQL для OLTP и отдельные колонночные хранилища для аналитики и бизнес-отчётов. В итоге выбор всегда зависит от задачи, и лучший вариант — подбирать инструмент под конкретный сценарий.
👉 @SQLPortal
В строковом варианте, как в Postgres или MySQL, все значения одной строки лежат рядом на диске.
Такой подход хорошо работает для транзакционных систем, где запросы чаще всего достают одну или несколько строк целиком, например
SELECT * FROM camera WHERE model = 'A7R'
. Здесь выгодно то, что обычно обрабатывается не так много строк, но при этом почти всегда требуется сразу много полей.В колонковом варианте, как в BigQuery или ClickHouse, все значения одной колонки собраны вместе и хранятся в длинных последовательностях. Это упрощает сжатие данных и позволяет быстрее работать с аналитическими запросами.
Если нужно обработать миллионы строк, но использовать только одно поле, например в запросе
SELECT avg(price) FROM camera
, то колонковая база читает только нужный столбец, а строковой пришлось бы загружать каждую строку целиком.Когда объём данных небольшой, компания может использовать одну строковую базу и для транзакций, и для простых аналитических задач, часто вынося аналитику на реплику.
Но по мере роста нагрузки обычно выбирают разные решения: Postgres или MySQL для OLTP и отдельные колонночные хранилища для аналитики и бизнес-отчётов. В итоге выбор всегда зависит от задачи, и лучший вариант — подбирать инструмент под конкретный сценарий.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2
Знал ли ты, что можно пользоваться psql — консольным клиентом Postgres без установки всего PostgreSQL?
Да-да, это реально. Благодаря libpq можно подключаться к Postgres без того, чтобы тащить весь пакет целиком.
Для macOS это делается так:
(на Linux — что-то вроде
После установки появится сообщение вроде такого, и нужно будет добавить ещё один шаг, чтобы правильно прописать путь:
После этого можно подключаться к удалённому хосту через стандартную строку подключения:
👉 @SQLPortal
Да-да, это реально. Благодаря libpq можно подключаться к Postgres без того, чтобы тащить весь пакет целиком.
Для macOS это делается так:
brew install libpq
(на Linux — что-то вроде
apt-get install postgresql-client
).После установки появится сообщение вроде такого, и нужно будет добавить ещё один шаг, чтобы правильно прописать путь:
==> libpq
libpq is keg-only, which means it was not symlinked into /opt/homebrew,
because it conflicts with PostgreSQL.
If you need to have libpq first in your PATH, run:
echo 'export PATH="/opt/homebrew/opt/libpq/bin:$PATH"' >> /Users/.bash_profile
После этого можно подключаться к удалённому хосту через стандартную строку подключения:
psql postgres://{username}:{password}@{hostname}:{port}/{database-name}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7