This media is not supported in your browser
VIEW IN TELEGRAM
PlanetScale показали pg_strict для Postgres.
Идея простая: это расширение, которое добавляет в Postgres “страховочную сетку” и ловит опасные запросы до того, как они реально выполнятся.
У всех бывало: хотел поправить одну строку, а всё уехало в UPDATE без WHERE. Или случайный DELETE, или “быстренько проверю миграцию” на не той базе. В итоге урон не от бага в коде, а от одной команды в psql.
Что обещает pg_strict:
- проверять запросы заранее
- блочить потенциально опасные операции
- спасать прямо на уровне базы, а не уже после инцидента
👉 @SQLPortal
Идея простая: это расширение, которое добавляет в Postgres “страховочную сетку” и ловит опасные запросы до того, как они реально выполнятся.
У всех бывало: хотел поправить одну строку, а всё уехало в UPDATE без WHERE. Или случайный DELETE, или “быстренько проверю миграцию” на не той базе. В итоге урон не от бага в коде, а от одной команды в psql.
Что обещает pg_strict:
- проверять запросы заранее
- блочить потенциально опасные операции
- спасать прямо на уровне базы, а не уже после инцидента
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥2🤔1
У ClickHouse появился managed-сервис Postgres.
Теперь прям очевидно, почему ClickHouse так упарывались в расширение pg_clickhouse.
Конкуренция станет еще жарче: Snowflake + Crunchy, Databricks + Neon и TigerData.
Lakehouse-платформам нужны транзакционные данные, и Postgres уже должен быть провайдером номер один.
Рад видеть, как тема Postgres для аналитики получает больше внимания и инвестиций. Для Postgres это плюс.
Ссылка: https://clickhouse.com/cloud/postgres
👉 @SQLPortal
Теперь прям очевидно, почему ClickHouse так упарывались в расширение pg_clickhouse.
Конкуренция станет еще жарче: Snowflake + Crunchy, Databricks + Neon и TigerData.
Lakehouse-платформам нужны транзакционные данные, и Postgres уже должен быть провайдером номер один.
Рад видеть, как тема Postgres для аналитики получает больше внимания и инвестиций. Для Postgres это плюс.
Ссылка: https://clickhouse.com/cloud/postgres
Please open Telegram to view this post
VIEW IN TELEGRAM
❤9🔥2👍1
Мифическая база данных MySQL постепенно затухает...😭
Уже больше 4 месяцев в её публичном репозитории на GitHub не было ни единого коммита. Плохой сигнал.
Пауза совпала с сентябрьскими сокращениями в Oracle в команде, которая этим занимается.
Это не значит, что MySQL исчезнет. Она стоит на миллионах серверов и будет работать ещё годами.
Но это вполне ясный маркер чего-то более глубокого:
MySQL больше не конкурирует как open-source сообщество, а живёт как чисто коммерческий продукт.
Меньше прозрачности, другие приоритеты.
Обгон со стороны PostgreSQL уже неизбежен.
👉 @SQLPortal
Уже больше 4 месяцев в её публичном репозитории на GitHub не было ни единого коммита. Плохой сигнал.
Пауза совпала с сентябрьскими сокращениями в Oracle в команде, которая этим занимается.
Это не значит, что MySQL исчезнет. Она стоит на миллионах серверов и будет работать ещё годами.
Но это вполне ясный маркер чего-то более глубокого:
MySQL больше не конкурирует как open-source сообщество, а живёт как чисто коммерческий продукт.
Меньше прозрачности, другие приоритеты.
Обгон со стороны PostgreSQL уже неизбежен.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13
PL/pgSQL делает PostgreSQL чем-то большим, чем просто средством для запросов
пример функции, которая принимает массив структур с данными и внутри Postgres делает цикл и инсертит каждую запись — без участия приложения.
Типичное приложение без этого делало бы так:
на клиенте есть массив
клиент бежит по массиву
отправляет INSERT-ы в базу
ждёт round-trip для каждого запроса
С PL/pgSQL можно перенести всю операцию внутрь базы:
— передаёшь массив один раз
— Postgres сам крутит цикл
— пишет данные
— нет лишних round-trip’ов
— меньше сетевой задержки
— транзакция проще
— логика ближе к данным
👉 @SQLPortal
пример функции, которая принимает массив структур с данными и внутри Postgres делает цикл и инсертит каждую запись — без участия приложения.
CREATE OR REPLACE FUNCTION public.insert_user_activities (
param_udt_storefrontactivities udt_storefront_activities[]
) RETURNS void LANGUAGE plpgsql AS $function$
DECLARE
var_activity udt_storefront_activities;
BEGIN
-- Insert user activities from the provided array
IF param_udt_storefrontactivities IS NOT NULL THEN
FOREACH var_activity IN ARRAY param_udt_storefrontactivities
LOOP
INSERT INTO tbl_storefront_activities (
providerid,
activitycode,
userid,
orderid,
notes,
createddate
)
VALUES (
var_activity.providerid,
var_activity.activitycode,
var_activity.userid,
var_activity.orderid,
var_activity.notes,
CURRENT_TIMESTAMP
);
END LOOP;
END IF;
END;
$function$
Типичное приложение без этого делало бы так:
на клиенте есть массив
клиент бежит по массиву
отправляет INSERT-ы в базу
ждёт round-trip для каждого запроса
С PL/pgSQL можно перенести всю операцию внутрь базы:
— передаёшь массив один раз
— Postgres сам крутит цикл
— пишет данные
— нет лишних round-trip’ов
— меньше сетевой задержки
— транзакция проще
— логика ближе к данным
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8👍5
OUTER JOIN или внешнее соединение позволяет возвратить все строки одной или двух таблиц, которые участвуют в соединении.
Outer Join имеет следующий формальный синтаксис:
Перед оператором JOIN указывается одно из ключевых слов LEFT, RIGHT или FULL, которые определяют тип соединения:
LEFT: выборка будет содержать все строки из первой или левой таблицы
RIGHT: выборка будет содержать все строки из второй или правой таблицы
FULL: выборка будет содержать все строки из обеих таблиц
Перед оператором JOIN может указываться ключевое слово OUTER, но его применение необязательно. После JOIN указывается присоединяемая таблица, а затем идет условие соединения после оператора ON.
К примеру, возьмем следующие таблицы:
И соединим таблицы Orders и Customers:
Таблица Orders является первой или левой таблицей, а таблица Customers - правой таблицей. Поэтому, так как здесь используется выборка по левой таблице, то вначале будут выбираться все строки из Orders, а затем к ним по условию Orders.CustomerId = Customers.Id будут добавляться связанные строки из Customers.
👉 @SQLPortal
Outer Join имеет следующий формальный синтаксис:
SELECT столбцы
FROM таблица1
{LEFT|RIGHT|FULL} [OUTER] JOIN таблица2 ON условие1
[{LEFT|RIGHT|FULL} [OUTER] JOIN таблица3 ON условие2]...
Перед оператором JOIN указывается одно из ключевых слов LEFT, RIGHT или FULL, которые определяют тип соединения:
LEFT: выборка будет содержать все строки из первой или левой таблицы
RIGHT: выборка будет содержать все строки из второй или правой таблицы
FULL: выборка будет содержать все строки из обеих таблиц
Перед оператором JOIN может указываться ключевое слово OUTER, но его применение необязательно. После JOIN указывается присоединяемая таблица, а затем идет условие соединения после оператора ON.
К примеру, возьмем следующие таблицы:
CREATE TABLE Products
(
Id SERIAL PRIMARY KEY,
ProductName VARCHAR(30) NOT NULL,
Company VARCHAR(20) NOT NULL,
ProductCount INTEGER DEFAULT 0,
Price NUMERIC NOT NULL
);
CREATE TABLE Customers
(
Id SERIAL PRIMARY KEY,
FirstName VARCHAR(30) NOT NULL
);
CREATE TABLE Orders
(
Id SERIAL PRIMARY KEY,
ProductId INTEGER NOT NULL REFERENCES Products(Id) ON DELETE CASCADE,
CustomerId INTEGER NOT NULL REFERENCES Customers(Id) ON DELETE CASCADE,
CreatedAt DATE NOT NULL,
ProductCount INTEGER DEFAULT 1,
Price NUMERIC NOT NULL
);
И соединим таблицы Orders и Customers:
SELECT FirstName, CreatedAt, ProductCount, Price, ProductId
FROM Orders LEFT JOIN Customers
ON Orders.CustomerId = Customers.Id;
Таблица Orders является первой или левой таблицей, а таблица Customers - правой таблицей. Поэтому, так как здесь используется выборка по левой таблице, то вначале будут выбираться все строки из Orders, а затем к ним по условию Orders.CustomerId = Customers.Id будут добавляться связанные строки из Customers.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6
JSON types in Postgres
* текст
* без дубликатов ключей
* не индексируется
* парсится во время выполнения, поэтому медленнее
* бинарный формат, заранее распарсен
* без дубликатов ключей
* индексируется
* лучше по производительности запросов
👉 @SQLPortal
json* текст
* без дубликатов ключей
* не индексируется
* парсится во время выполнения, поэтому медленнее
jsonb* бинарный формат, заранее распарсен
* без дубликатов ключей
* индексируется
* лучше по производительности запросов
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤4
psql-лайфхак:
\e откроет твой дефолтный текстовый редактор, чтобы написать SQL или команды. Сохраняешь файл, закрываешь, и psql автоматически выполнит то, что ты написал.
🛌 🛌 🛌
👉 @SQLPortal
\e откроет твой дефолтный текстовый редактор, чтобы написать SQL или команды. Сохраняешь файл, закрываешь, и psql автоматически выполнит то, что ты написал.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2🤯2
MySQL 8.4.8 теперь доступен!
MySQL 8.4.8 (версия Long-Term Support, LTS) приносит несколько улучшений:
✅ Улучшения InnoDB Redo Logging: сообщения об ошибках теперь включают текущий Log Sequence Number (LSN) и детали про емкость redo log, что дает более глубокое понимание работы redo log.
✅ Встроенная библиотека OpenSSL обновлена до версии 3.0.18.
✅ Как обычно, релиз закрывает разные баги, включая race conditions в InnoDB и проблемы с очисткой binary log (purging), чтобы улучшить общую стабильность и производительность.
Подробнее см. Release Notes
👉 @SQLPortal
MySQL 8.4.8 (версия Long-Term Support, LTS) приносит несколько улучшений:
Подробнее см. Release Notes
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2
В Postgres есть специальные операторы, которые делают запросы к JSON-данным простыми и быстрыми.
Базовые операторы:
-> извлечь как json
--> извлечь как текст
0, 1, 2 ... извлечь по смещению (offset)
@> левый операнд содержит правый
<@ правый операнд содержит левый
? ключ верхнего уровня
👉 @SQLPortal
Базовые операторы:
-> извлечь как json
--> извлечь как текст
0, 1, 2 ... извлечь по смещению (offset)
@> левый операнд содержит правый
<@ правый операнд содержит левый
? ключ верхнего уровня
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5
Indexing
Postgres реально хорош в индексации JSON: для этого обычно используют GIN, чтобы индексировать поле целиком.
У некоторых есть небольшой перфоманс-трик: добавить GIN-индекс с jsonb_path_ops. Это вариант для схем JSON, которые не меняются, и работает он только с @> (contains). Зато может быть быстрее и занимать меньше места, чем обычный GIN-индекс.
👉 @SQLPortal
Postgres реально хорош в индексации JSON: для этого обычно используют GIN, чтобы индексировать поле целиком.
У некоторых есть небольшой перфоманс-трик: добавить GIN-индекс с jsonb_path_ops. Это вариант для схем JSON, которые не меняются, и работает он только с @> (contains). Зато может быть быстрее и занимать меньше места, чем обычный GIN-индекс.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Yandex B2B Tech запустили Managed Sharded PostgreSQL (SPQR) – сервис для горизонтального масштабирования самой популярной опенсорс БД в мире. Теперь банкам и ритейлу станет проще обрабатывать миллионы транзакций в реальном времени и без боли масштабировать свои системы по мере роста нагрузок.
В стандартном PostgreSQL горизонтального масштабирования нет, а при больших объёмах данных без него уже никуда. Шардированный PostgreSQL позволяет ускорять запуск новых продуктов в 3–4 раза, упрощает сопровождение и снижает операционные риски – инженерам не нужно вручную собирать и поддерживать сложную инфраструктуру.
Технология уже обкатана в проде – её используют Яндекс ID, Яндекс Пэй и Едадил, стабильность подтверждена и внешними компаниями. PostgreSQL сегодня выбирают 55,6% профессиональных разработчиков, а Managed Service for PostgreSQL в Yandex Cloud обслуживает уже больше 5 тысяч клиентов.
В итоге: быстрее time-to-market, меньше затрат на разработку при запуске высоконагруженных продуктов
👉 @SQLPortal
В стандартном PostgreSQL горизонтального масштабирования нет, а при больших объёмах данных без него уже никуда. Шардированный PostgreSQL позволяет ускорять запуск новых продуктов в 3–4 раза, упрощает сопровождение и снижает операционные риски – инженерам не нужно вручную собирать и поддерживать сложную инфраструктуру.
Технология уже обкатана в проде – её используют Яндекс ID, Яндекс Пэй и Едадил, стабильность подтверждена и внешними компаниями. PostgreSQL сегодня выбирают 55,6% профессиональных разработчиков, а Managed Service for PostgreSQL в Yandex Cloud обслуживает уже больше 5 тысяч клиентов.
В итоге: быстрее time-to-market, меньше затрат на разработку при запуске высоконагруженных продуктов
Please open Telegram to view this post
VIEW IN TELEGRAM
CNews.ru
Yandex B2B Tech поможет банкам и ритейлерам обрабатывать миллионы транзакций быстрее и надежнее - CNews
Yandex B2B Tech запустила сервис для быстрого горизонтального масштабирования самой популярной опенсорсной базы данных...
❤6🤔3👍2
Alibaba выложили в опенсорс AliSQL (на базе MySQL 8.0.44) с встроенным движком DuckDB. Теперь аналитические нагрузки можно гонять прямо в MySQL — достаточно переключить storage engine на DuckDB.
👉 @SQLPortal
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - alibaba/AliSQL: AliSQL is a MySQL branch originated from Alibaba Group. Fetch document from Release Notes at bottom.
AliSQL is a MySQL branch originated from Alibaba Group. Fetch document from Release Notes at bottom. - alibaba/AliSQL
Вчера мы говорили про GIN-индексы, но они не поддерживают ORDER BY. В некоторых ограниченных случаях можно использовать выраженные индексы на JSON-выборках, которые просто фиксируют текстовое значение по заданному keypath (пути к ключу).
➡️ Не для общего случая, а под конкретные кейсы
➡️ Ускоряют lookups по одиночным ключам в JSON
➡️ B-tree индекс, поддерживает ORDER BY
➡️ Убирает оверхед GIN или необходимость парсить JSON во время выполнения запроса
👉 @SQLPortal
CREATE INDEX idx_state
ON users ((details->'location'->>'state'));
{ "name": "David", "location": { "city": "Lawrence", "state": "KS" } }
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
SELECT * FROM users LIMIT 100
SQL: "Не говори больше ничего, вот вся продакшен-база данных"
👉 @SQLPortal
SQL: "Не говори больше ничего, вот вся продакшен-база данных"
Please open Telegram to view this post
VIEW IN TELEGRAM
😁12🤔1
JSON, вставка данных.
Ты можешь изменять существующие JSONB-объекты с помощью функции jsonb_set(). Она возвращает новый JSONB-объект, где значение установлено по указанному пути ключей (keypath). Если по этому пути не хватает промежуточных объектов, она их создаст.
👉 @SQLPortal
Ты можешь изменять существующие JSONB-объекты с помощью функции jsonb_set(). Она возвращает новый JSONB-объект, где значение установлено по указанному пути ключей (keypath). Если по этому пути не хватает промежуточных объектов, она их создаст.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
This media is not supported in your browser
VIEW IN TELEGRAM
Колонарное хранилище vs построчное (row store) наглядно
Берем простую агрегацию и сравниваем, как она выполняется в row store и columnar store.
В row store данные лежат строками, поэтому движку приходится читать каждую строку целиком, чтобы из нее вытащить значение колонки age.
В columnar store данные лежат по колонкам, поэтому он читает сразу только значения колонки age, без трогания остальных полей и без лишнего I/O.
👉 @SQLPortal
Берем простую агрегацию и сравниваем, как она выполняется в row store и columnar store.
В row store данные лежат строками, поэтому движку приходится читать каждую строку целиком, чтобы из нее вытащить значение колонки age.
В columnar store данные лежат по колонкам, поэтому он читает сразу только значения колонки age, без трогания остальных полей и без лишнего I/O.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤13👍3
Радим Марек: Введение в буферы в PostgreSQL
Про то, как PostgreSQL держит данные в памяти и почему от этого сильно зависит производительность
👉 @SQLPortal
Про то, как PostgreSQL держит данные в памяти и почему от этого сильно зависит производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
boringSQL | Supercharge your SQL & PostgreSQL powers
Introduction to Buffers in PostgreSQL
How PostgreSQL actually manages memory, from shared_buffers and dirty pages to the OS page cache sitting underneath it all.
❤2
SQL тренажеры для практики
- sql-academy.org
- sql-ex.ru
- schoolsw3.com
- SQL Fiddle
- sqltest.online
- Oracle LiveSQL
- stratascratch.com
- stepik.org (Интерактивный тренажер SQL)
- sql-practice.com
- pgexercises.com
- HackerRank
- sqlzoo.net
👉 @SQLPortal
- sql-academy.org
- sql-ex.ru
- schoolsw3.com
- SQL Fiddle
- sqltest.online
- Oracle LiveSQL
- stratascratch.com
- stepik.org (Интерактивный тренажер SQL)
- sql-practice.com
- pgexercises.com
- HackerRank
- sqlzoo.net
Please open Telegram to view this post
VIEW IN TELEGRAM
❤10🔥2