Все потоки
Поиск
Написать публикацию
Обновить
106.03

PostgreSQL *

Свободная объектно-реляционная СУБД

Сначала показывать
Порог рейтинга

Компания Postgres Professional выпустила несколько пакетов обновлений для системы управления базами данных Postgres Pro Enterprise версий 11, 12, 13, 14 и 15. СУБД Postgres Pro Enterprise построена на PostgreSQL и распространяется на коммерческой основе. По словам создателей СУБД Postgres Pro Enterprise, их платформа предназначена для высоконагруженных систем и содержит ряд усовершенствований по сравнению с базовыми возможностями PostgreSQL.

В новых версиях:

— исправлена проблема в вычислении базы страницы для шестидесятичетырёхбитных идентификаторов транзакций;

— исправлена некорректная работа функции pg_database_size для механизма сжатия CFS;

— устранена ошибка в pgpro_scheduler, когда руководящий планировщик удалял данные о процессе database manager до его инициализации;

— прекращена поддержки ОС Debian 9;

— доработаны модули pg_probackup, pg_hint_plan, PTRACK;

 — расширены возможности хранения типов данных mchar, mvarchar, и теперь корректно хранится до 1 Гбайт данных этих типов.

Более подробно о новых обновлениях можно прочитать на сайте Postgres Pro Enterprise.

Теги:
Всего голосов 3: ↑3 и ↓0+3
Комментарии0

Элегантное решение проблемы увеличения инкремента при вставке дубликатов.

Множество раз в различных форумах всплывает вопрос: Как избежать увеличения автоинкремента при вставке дубликатов в таблицу?

Хотя я сам на тех же форумах отвечал что это не критично и не стоит из-за этого волноваться, а если волнуетесь то используйте bigserial и тогда точно хватит! Но душа тем не менее требовала гармонии. И так классика:

create table tbl (
    id serial, 
    val text,
    primary key (id),
    unique (val)
);
-- Вставляем Раз и Два
insert into tbl (val) values ('One'), ('Two');

-- Попробуем так
insert into tbl (val) values ('One'), ('Three') on conflict (val) do nothing;

select * from tbl;

+====+=======+
| id | val   |
+====+=======+
| 1  | One   |
| 2  | Two   |
| 4  | Three |
+----+-------+

Видно, автоинкремент растет даже если мы используем UPSERT Конечно есть вариант с проверкой NOT EXISTS, но это не для слабонервных:

insert into target2 (val) 
select val from source
where not exists (select true from target2 where target2.val = source.val);

И вот наконец то в PostgreSQL 15 завозят оператор MERGE:

merge into target3 t
using source s on t.val = s.val
when not matched then insert (val) values (val);

здесь тестируем SQL запросы

здесь читаем про Применение оператора MERGE в PostgreSQL

Всего голосов 8: ↑8 и ↓0+10
Комментарии0

FETCH FIRST … ROWS WITH TIES

В этой статье я хочу показать новще решение распостраненной задачи. Найти в таблице записи с максимальным значением в одной из колонок.Для примера мы будем искать сотрудников с максимальной зарплатой.

Первое что приходит в голову - это ORDER BY salary DESC LIMIT 1 Логично но не правильно потому что максимальную зарплату мщгут получать несколько сотрудников.

Стандартное решение - сравнить зарплату с результатом подзапроса:

select * 
from employees
where salary = (select max(salary) from employees);

стандартно - не значит эффективно. Если наша СУБД поддерживает оконные функции:

with ranked as (
    select 
        employees.*,
        dense_rank() over (order by salary desc) r
    from employees
) select * from ranked where r = 1;

немного эффективней, но слишком многословно :(

Есть еще один вариант о котором знают не все. Стандарт SQL:2008 предлагает новое решение данной задачи: FETCH FIRST … ROWS WITH TIES :

select * 
from employees
order by salary desc
fetch first 1 rows with ties;

Компактно и элегантно. Проверить эти у другие запросы можно на SQLize.online

Всего голосов 14: ↑13 и ↓1+12
Комментарии2

Вклад авторов