SQL:2023

SQL:2023 is finished: Here is what’s new и

Postgres and SQL:2023: What's Supported?

Эти две статьи Питера Айзентраута (Peter Eisentraut) объединяем в одну. Во второй он только проставляет статусы и версии, в которых появилась поддержка. Статусов 3:

  • давно (ancient) - до версии PostreSQL 10;

  • не планируется - в том смысле, что и не стоит, поезд ушёл (по мнению Питера);

  • в будущем - хорошо бы сделать, но конкретно ничего не делается (по мнению Питера, и, кажется, не всегда он прав).

С момента выхода прошлого стандарта по шкале времени ИТ прошла Вечность: 7 лет с выхода SQL 2016. Дольше ждали только до 1999-го года - вообще-то тоже 7 лет, но Питер пишет, что дольше, он, наверное, влезал в детали. Не важно. Главное - долго, а в бездействии разработчикам ждать не дадут: клиенты просят новых фич, им не до стандартов.

Сейчас текст в Секретариате ISO - теперь только Боги ISO (как пишет Питер) определят дату официальной публикации. Это может занять от нескольких недель до нескольких месяцев.

Питер делит новости на три категории:

  1. Небольшие изменения в существующем SQL.

  2. Новое в JSON.

  3. Новое в запросах к графам (property graph).

На мой взгляд эта тема достаточно важная, чтобы ей посвятить отдельную статью. Важная и для сообщества, и для тех, кто вкладывал немалые усилия в реализацию этих пунктов до выхода стандарта, то есть я прежде всего о многострадальных патчах SQL/JSON, которые обсуждались в том числе в наших выпусках: сначала ликование в Postgresso #3 (40), потом огорчение из-за отката обратно и осторожный оптимизм по поводу будущего в Postgresso 8-9 (45-46), а в Postgresso 10 (47) утешительная новость, что хотя бы в Postgres Pro Standard / Enterprise большая часть патчей приложена.

Не умаляя ценности статьи Питера, попробуем разобраться хотя бы с некоторыми пунктами, касающимися JSON:

JSON data type - эта фича, пишет Питер после ознакомления со стандартом, говорит не только о появлении самого типа, но и включает некоторый синтаксис, например JSON_SERIALIZE, JSON_SCALAR и IS JSON.

По этому поводу он замечает, что этот пункт стандарта вошёл ещё с версий 9.2/9.4. Но тут уместно, кажется, уточнить, что в ваниле действительно с давних пор есть этот тип, но не приведённые им самим выражения. А вот в Postgres Pro Standard/Enterprise 15 - да, они есть.

String-based JSON - пункт о том, как тип хранится, и реализация должна обеспечивать функциональность JSON_OBJECT, JSON_OBJECTAGG, JSON_TABLE и др. для традиционного текстового хранения, или для специфического (native), или для обоих вариантов.

Питер проставляет против этого пункта своё "не планируется", под которым, напоминаем, подразумевает, что и планировать больше не стоит. Это, он подчеркнул, его мнение.

Эта функциональность не попала тогда в PG 15, но обсуждалась она очень активно. И она тоже уже есть в Standard/Enterprise 15.

UPD: Только что пришла информация, что со второй попытки в 16-й версию попали функции-конструкторы (JSON_ARRAY, JSON_ARRAYAGG, JSON_OBJECT, JSON_OBJECTAGG) и предикаты (IS JSON [VALUE], IS JSON ARRAY, IS JSON OBJECT, IS JSON SCALAR) - подробнее в обзоре Павла Лузанова PostgreSQL 16: Часть 5 или Коммитфест 2023-03.

Вот вам и "не планируется".

Упомяну здесь и новую тему, не "близкую к телу":

Property Graph Queries - SQL/PGQ. Новый раздел, запросы как в графовой СУБД. Питер его маркировал как "в будущем", то есть желательный. Он ожидает, что это направление будет развиваться и в будущих выпусках стандарта. Как и JSON. Эти новшества суть движения в сторону NoSQL-функциональности. Но и в традиционном, "корневом" SQL тоже есть новое, но там, по словам Питера, либо уже реализовано, либо будет в PG 16.

Боги ISO обещают, вроде, сократить ожидание следующих стандартов до 3-4 года.

A Postgres JSONB Functions and Operators Cheatsheet

"Жульнический листок" переводится как шпаргалка. Но это не просто шпаргалка, это набор примеров, которые можно скопипастить, распробовав на небольшом демонстрационном наборе данных. Есть в виде PDF. Позаботилась о любителях шпаргалок фирма Aiven.

Блокировки

Если тема интересует всерьёз, то советуем сначала заглянуть в главу III книжки Егора Рогова PostgreSQL 15 изнутри или в его же соответствующую серию статей на хабре - Блокировки в PostgreSQL. А документация Postgres по этой теме лежит здесь.

Row locks in PostgreSQL

Лоренц Альбе (Laurenz Albe, Сybertec) решил разобраться с блокировками на уровне строки. Эта статья для тех, кто любит заглядывать под капот, как говорится.

Лоренц рассказывает об 4 подвидах блокировок и о том, какую когда лучше выбрать; о принципе эскалации блокировок (когда вместо большого количества отдельных строк сразу блокируется страница или таблица); как они хранятся. И в конце: в представление pg_locks блокировки не попадут, если конфликта не произошло, и мы не увидим, кто завладел блокировкой. Поэтому Лоренц предлагает расширение pgrowlocks, авторства Тацуо Ишии (Tatsuo Ishii). Теперь увидим их.

Postgres - Fun with LWLocks

Мишель Пакье (Michel Paquier) живёт в Японии, но сам из Франции, поэтому, хотя имя пишется как Майкл, как-то естественней предположить, что он Мишель (он докладывал на PGConf.Russia 2016, но пообщаться не довелось, поэтому не знаю, как он сам себя зовёт). Работает в AWS. Статьи его интересны и содержательны, не даром он коммитер Postges, и у него 12-е место по числу строк в новом Списке Вкладчиков, а по числу коммитов - так даже 5-е.

И эта статья тоже для заглядывателей под капот. И даже для любителей не заглядывать, а рыться там основательно. В менеджере легковесных блокировок в PostgreSQL есть API, который можно увидеть в src/include/storage/lwlock.h, который нужен для управления доступом к структурам в разделяемой памяти. Мишель рассматривает 3 из них:

  • LWLockUpdateVar()

  • LWLockWaitForVar()

  • LWLockReleaseClearVar()

Мишель не просто рассказывает о легковесных блокировках. Он ещё и сочинил небольшой модуль lwlock_test, который использует эти функции и умеет заставить 2 бэкенда перекидываться в пинг-понг так, что каждый будет ждать от другого, когда тот обновит переменную. Можно скомпилировать модуль с флагом DLWLOCK_TEST_DEBUG. Тогда в логе будут появляться записи каждый раз, когда происходит событие в ожидающем или обновляющем процессах.

Нескромно посоветую интересующимся и вот эту нашу с Александром Коротковым (ныне в Oriole DB) статью Параллелизм в PostgreSQL: не сферический, не конь, не в вакууме. Там тоже under the hood, тоже pg_locks и LWLocks, но ещё и на материалах конкретной случившийся проблемы. Да ещё и с советами по perf и GDB.

А любимый жанр Мишеля Пакье - PostgreSQL * highlights. Здесь дадим набор ссылок на его заметки по

PostgreSQL 16

require_auth for libpq

Control of SCRAM iterations

File inclusions in pg_hba.conf and pg_ident.conf

More patterns for pg_ident.conf

Normalization of utilities in pg_stat_statements

More regexps in pg_hba.conf

Ну и тогда уж, чтобы не обделить Павло Голуба (Pavlo Golub, Cybertec):

LZ4 and ZSTD pg_dump compression

Underscores in numeric constants

Parallel aggregate

New old "debug_parallel_query" setting

Reserve connections

hex, oct, bin integers

pg_dump compression specifications

GRANT VACUUM, ANALYZE

Лоренц Альбе (Laurenz Albe) тоже работает в Cybertec. У него тоже есть статья по PostgreSQL 16:

EXPLAIN (GENERIC_PLAN): New in PostgreSQL 16

Ну а у Депеша Любашевского все ожидания PostgreSQL 16 собраны, как обычно, под одноименной рубрикой.

А теперь главное, может быть, в этом разделе обзора: только что опубликована 5-я часть коммитфестовских обзоров Павла Лузанова. Вот все 5:

  • PostgreSQL 16: Часть 5 или CommitFest 2023-01 (ru), (en ещё не готов);

  • Ч. 4, 2023-01 (ru), (en);

  • Ч. 3, 2022-11 (ru), (en);

  • Ч. 2, 2022-09 (ru), (en);

  • Ч. 1, 2022-07 (ru), (en).

Five Interesting Patches From January’s Commitfest

Крис Трейверс (Chris Travers), тот самый иностранец, лично приехавший на недавний PGConf.Russia 2023, продолжает свою прошлогоднюю затею: обозревает коммитфесты и, отдадим должное, вовсе не повторяет Павла Лузанова. Во-первых, он по-прежнему обозревает не только принятые патчи (в данном случае их 3), но и отложенные (1) и даже отвергнутые (1). Он ещё и следует придуманной им форме: в сообщении о каждом патче кроме описания есть раздельчик Почему это важно.

По поводу небольшого патча он рассказывает любопытную историю о том, как в Postgres появлялись -infinity и +infinity, почему просто infinity не всегда хватает. Патч приняли. А вот этот набор патчей самоустранился из-за возникших проблем, но это не значит (показывает Крис), что работа была проделана напрасно. Ну а вот этот набор нам ближе к телу: Крис говорит о многолетней деятельности Postgres Professional по продвижению 64-разрядных xid. Эти патчи, говорит Крис, когда-то опередили время, зато теперь стали как никогда актуальны. И Timescale, где Крис теперь работает, включилась в доработку и продвижение этих важнейших патчей.

Напоминаем, что в конце марта определилась PostgreSQL 16 Release Management Team:

  • Альваро Эррара (Alvaro Herrera, EDB);

  • Амит Капила (Amit Kapila, Fujitsu India);

  • Джонатан Кац (Jonathan Katz, AWS).

Бонус: v. 15

ICU features in PostgreSQL 15

Питер Айзентраут (Peter Eisentraut, EDB) делится плодами своих усилий (он одновременно и автор, и коммитер патча) по доведению поддержки правил сортировки (collation) ICU до ума. Поддержка библиотеки ICU появилась в PostgreSQL 10, но её нельзя было использовать глобально для базы данных или всего кластера баз данных. Питер рассказывает не только о сделанном, но и о не сделанном - что сделать надо. И, видимо, будет сделано в скором времени.

Конечно, я заглянул сначала в PostgreSQL 15: Часть 5 или Коммитфест 2022-03, где сказано ещё и о информативных столбцах datlocprovider, daticulocale в pg_database, о которых Питер умалчивает. Умалчивает и в другой статье - How collation works, поясняющей работу правил сортировки, что ничуть не говорит о том, что статья не достойна чтения.

Питер не только рассказывает о сортировке, не только отсылает к стандартам, а ещё и разбирает по косточкам сами записи, связанные с символами UNICODE, заныривая в первоисточники - файлы DUCET и Implementation_Notes, рассказывает, зачем у символов веса и как они работают. Но ещё больше интересного обещает рассказать на эту тему в будущих статьях.

Вклады и круги

The Importance of Giving Back: Analyzing Code Contributions to PostgreSQL 15

Сара Конвей (Sarah Conway) из EDB опубликовала заметку о вкладах компаний в PostgreSQL 15, оформив результаты в красивую диаграмму-пирожок (не воспроизводим, соблюдая копирайт). EDB - лидер по вкладам. 2-е место уверенно держит Postgres Professional, третье у Fujitsu. Crunchy Data - 6-е (я думал, что выше), китайская HighGo - уже 11-е, а за ним юный и модный Neon, а Ajust - на 14-м. Я, конечно, обращаю внимание на те компании, чьи статьи мы часто цитируем. Подальше расположились Arenadata, Bank of China, Data Egret, EPAM Systems, в хвосте затаились IBM, HP и Intel. Пирожок выпекался на основе имён "вкладчиков", упомянутых в release notes, их привязывали к компаниям и смотрели статистику. Также смотрели список contributors/committers. То есть, если много участников процесса (что, безусловно, важный критерий) внесли понемногу кода, компания опередит ту, в которой есть 1, но экстремально плодовитый. Хаас (ниже), наоборот, считает только строки кода, поэтому картина совсем другая. В идеале испечь бы гибридный пирожок, посчитав суммы строк кода для упомянутых вкладчиков.

Заметка, вообще-то, о том, как выбрать поставщика Postgres-СУБД. Сара предлагает такие критерии:

  • поддерживает ли компания своих сотрудников, предлагающих сообществу код или другую помощь?

  • есть ли у компании внятно прописанная политика в отношении открытого кода?

  • как обстоят дела с компанейскими блогами, вебинарами, подкастами, документацией?

И отвечает: да, наша EDB, она такая.

Robert Haas: Who Contributed to PostgreSQL Development in 2022?

Роберт Хаас (Robert Haas) в своём блоге недавно дал очередную статистику вкладов - за 2022 на этот раз. 2021 и 2020 здесь. Традиционно там списки лидеров по числу строк кода, коммитеров и самых активных в рассылках - не компаний, а разработчиков лично. Первая пятёрка по вкладу в строчках:

  • Том Лейн (Tom Lane) 36623 строк в 356 коммитах; а в 2021 было 66210 | 438

  • Андрес Фройнд (Andres Freund) 34140 | 207 - приблизился!

  • Питер Айзентраут (Peter Eisentraut) 18697 | 263

  • Брюс Момджан (Bruce Momjian) 9677 |  61

  • Томас Вондра (Tomas Vondra) 9438 | 23

СУБД-круг Громова 2022 - исследование русских СУБД-вендоров, российское ПО базы данных

В Кругах Громова появился огромный (более 400 стр. PDF) обзор СУБД на российском рынке. Его можно получить, запросив на сайте. Из здешних постгресовых обозреваются:

  • Postgres Pro,

  • Jatoba,

  • Platform V Pangolin,

  • Tantor,

  • Квант-Гибрид,

  • Astra Linux Special Edition СУБД.

Но есть там ещё рубрика Российские:

  • Ред База Данных,

  • ЛИНТЕР,

  • CronosPRO,

  • Енисей.

Это исследование обсуждается, например, на IT Channel News:

Кто есть кто на российском рынке СУБД?

На том же ресурсе цитируют подсчёты Натальи Касперской: % СУБД в ЕИС «Госзакупки»:

На рынке СУБД произошла смена лидера продаж

А именно:

В денежном выражении в 2022 г. затраты госкомпаний на приобретение российских СУБД, выросли, по сравнению с 2021 г., почти в три раза: c 690 млн. до более чем 2 млрд. руб».

Интересно отметить, что 89% этой суммы пришлось на СУБД Postgres Pro. Далее с большим отрывом следуют Arenadata (4%), Oracle (2%) и «Ред База данных» (2%). Для сравнения: 2021 г. на долю Oracle приходилось 84% продаж.

Конференции

PgConf Nepal 2023

Пройдёт уже 11-12-го мая в Университете Катмаду. Первая тройка организаторов:

  1. Dr. Oleg Bartunov - Postgres Professional, Russia

  2. Mr. Andreas Scherbaum - European PostgreSQL

  3. Dr. Bal Krishna Bal - Kathmandu University

Расписание ещё (на 3-е мая) не опубликовано, есть график мастерклассов. Известно, что участвуют Олег Бартунов, Егор Рогов и Павел Толмачёв (оба - коллеги из отдела образования), Александр Бурцев (все 4 из Postgres Professional), а также Крис Трейверс (Chris Travers, Timescale), Умайр Шахид (Umair Shahid, Percona) и много незнакомых мне фамилий, звучащих по-индийски.

На конференции будет представлен только что отпечатанный перевод Малютки. В качестве afterparty - восхождения и высокогорные марафоны.

PGIbiza 2023: Postgres and Ecosystem

Тоже неплохое место. После 4-летнего перерыва (виноват, говорят, ковид) пройдёт на острове 29-31-го августа. Скоро будут принимать заявки. Организатор - Fundación PostgreSQL - испаноговорящий постгресовый фонд.

PGDay Belgium 2023

PostgreSQL Database Conference состоится 12-го мая в Лёвен (Leuven) - Хаарсроде (Haasrode), 25 км. от Брюсселя. Регистрация продолжается, есть список выступающих и расписание.

Saint Highload++

Пройдёт в Санкт-Петербурге 26-27-го июня. Уже доступно расписание. Там есть, например, такие доклады:

Страничка тематики баз данных здесь, она, видимо, будет обновляться.

HighLoad++ 2023

Московский Highload++ пройдёт в ноябре, даты пока не объявлены. Есть страничка, где все конференции Олега Бунина.

PGConf.Russia 2023

Уже прошла. Вот наша статья о ней: PGConf.Russia 2023: это было красиво. Почти все слайды и видео уже доступны участникам (после регистрации в личном кабинете).

Гео

PgOSM Flex for Production OpenStreetMap data

В блоге RustProof Labs Райан Ламберт (Ryan Lambert) рассказывают об инструменте PgOSM Flex, который помогает загружать в PostGIS данные OpenStreetMap, используя osm2pgsql. И приводит несколько примеров загрузки OpenStreetMap.

Особенно любопытно было листать эту статью, посетив до этого доклад Игоря Сухорукова Как поместить весь мир в обычный ноутбук: PostgreSQL и OpenStreetMap на PGConf.Russia 2023.

Брайан, кстати, напоминает, что доступна его книжка Mastering PostGIS and OpenStreetMap.

European Route Planning with Postgres

Марк Литвинчик (Mark Litwintschik) берёт маршруты автобусов по Европе и с помощью расширения pgRouting планирует маршруты. Полезный и интересный опыт.

Postgres Raster Query Basics

Пол Рэмзи (Paul Ramsey) рассказывает о том, как хранятся растровые данные, как можно организовывать запросы к таким данным из PostGIS.

Shoot yourself

The Part of PostgreSQL We Hate the Most

Автор - профессор Карнеги Меллона Энди Павло (Andy Pavlo) из компании OtterTune. Классик начинает с классики: как появлялась и продвигалась концепция MVCC, а доходит до того, что реализация этого MVCC в PostgreSQL худшая (он именно буквально подчёркивает это) из ряда MySQL, Oracle и Microsoft SQL Server. Но мы тут, в OtterTune, вам с этим поможем, и вашим RDS или Aurora теперь особенно ничего угрожать не будет - говорит Энди.

Он ссылается на "лучшую статью времён и народов по MVCC" 2018-го года - An Empirical Evaluation of In-Memory Multi-Version Concurrency Control - своего коллектива, он вспоминает о захиревшей попытке zheap project, он наступает на больную мозоль - случай Uber, и, разумеется, препарирует работу автовакуума. В статье много наглядных схем и графиков. И, между прочим, уличает писателей с Uber в существенной ошибке (даёт ссылку, но она никуда не ведёт). Заодно рекламирует Database of Databases, в которой на сегодня 897 баз. Короче, это интересно.

Nine ways to shoot yourself in the foot with PostgreSQL

Фил Бут (Pfil Booth) делится в своём блоге собственными неудачами в эксплуатации рабочих баз, советует разобраться в этих 9 вопросах сразу, до того как база вырастет и выстрелит в ногу. Ничего особенно сенсационного нет, начинается всё с настройки work_mem. Видали мы и более основательные разборы этой реально важно темы, а Кристоф Петтус (Christophe Pettus) вообще заявил здесь, что ВСЕ формулы для work_mem лгут (мы его бегло обозревали в Postgresso 3 за 2023).

Но здесь интересен, скорее, список выстрелов, чем конкретные советы. На хабре есть русский перевод - Девять способов выстрелить себе в ногу с PostgreSQL - переводчика Вадима Иншева aka PatientZero, но я позволю себе некоторую вкусовщину и дам свою версию выстрелов:

  1. оставьте как есть work_mem по умолчанию;

  2. затолкайте всю логику в функции и процедуры Postgres;

  3. навесьте кучу триггеров;

  4. увлекайтесь NOTIFY;

  5. НЕ запрашивайте EXPLAIN ANALYZE на реальных данных;

  6. предпочитайте CTI подзапросам;

  7. в критичных по времени исполнения запросах используйте рекурсивные CTI;

  8. не создавайте индексов на внешних ключах;

  9. сравнивайте индексированные столбцы, используя предикат IS NOT DISTINCT FROM.

ORDINALITY и перекосы

Easy PostgreSQL Time Bins

Пол Рэмзи (Paul Ramsey, Crunchy Data) пишет о том, как эффективно управляться с временнЫми данными. Для иллюстрации он берёт геоданные землетрясений и пользуется PostGIS. Землетрясения (крупные) случаются не каждый день, поэтому гистограммы и разные диаграммы могут получиться некрасивыми, если не учитывать временнУю разряженность.

Пол показывает, как работает появившаяся в PostgreSQL функция date_bin(). Её он использует в вместе с generate_series().

В другой раз он использует функции width_bucket(), unnest() и запрос с довольно экзотичным ключевым словом WITH ORDINALITY.

Maximizing PostgreSQL’s Charms: A Pattern for Indexes and Skewness When Migrating from Oracle

Дипак Махто (Deepak Mahto) выбрал не затасканную тему: перекос данных при миграции. Он предлагает в этом случае пользоваться частичными индексами (partial indexes).

Старый добрый psql

PostgreSQL Basics: Getting started with psql

Райан Буз (Ryan Booz, Redgate), знакомый по PGSQL PHRIDAYs (на этот раз отдохнём от них), агитирует за psql. Читатели это обзора вряд ли нуждаются в такой агитации, но в статье есть любопытная табличка истории psql, начавшейся в 1970-м. Кому-то может пригодиться советы по инсталляции Postgres на Мак, кому-то - в докере.

Некоторые релизы

openGauss 5.0.0

Честно говоря, об openGauss я узнал на PGConf.Russia 2023 из доклада Максима Милютина Аналитические open-source решения на базе PostgreSQL. Эту постгресовую СУБД разрабатывает Huawei, и она показывает неплохие результаты на их чипах kunpeng на базе ARM. В 2021-м появилась 1.0.1, а сейчас уже 5.0.0. Вот правильная (!) ссылка на страницу Release Notes. Распространяется по лицензии Mulan PSL v2.

dbdev: A Postgres Package Manager

Разработчики из Supabase представили database.dev - сайт, на котором можно найти расширения на доверенных языках Postgres. Создатели говорят оdbdev:это для PostgreSQL то же, что pm для JavaScript, pip для Python иcargo для Rust. А вообще цель их создать open ecosystem для работы с пакетами.

На сегодня всё.

Комментарии (0)