Обновить

Маленькие, но мощные оптимизации: как pgpro_planner спасает запросы из мира 1С

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели9.8K
Всего голосов 21: ↑21 и ↓0+24
Комментарии11

Комментарии 11

Где pgpro_planner помогает, а где нет

А случайно нет готовых примеров для Демобазы 2.0 ?

Для продолжения экспериментов с производительностью под параллельной нагрузкой.

Не тестировали если честно, но думаю можем провести эксперименты и показать результаты)

Ок, спасибо за информацию.

Тема в работе . Результаты экспериментов будут опубликованы.

Можно будет потом сравнить

Я правильно понимаю, что для ванилы не сборки?

Для ванилы мы не поддерживаем, только для энтерпрайза. Хотя для ванилы (кроме мастера) могут быть только пока нестабильные тесты быть), в остальном работает)

Ограничения для IN (VALUES …) → = ANY(array)

...

Трансформация не применяется, если внутри VALUES: ...[и далее по пунктам]

Представим такой код:

SELECT ten FROM onek t WHERE unique1 IN (VALUES (0), (1), (NULL), (2));

Есть ли смысл в частичном преобразовании в ANY? т.е. примерно вот так: (все что можно, суем в ANY, остальное оставляем как было)

SELECT ten FROM onek t WHERE 
unique1 = ANY('{0, 1, 2}'::numeric[])
OR unique1 IN (VALUES (NULL));

p.s. я не силен в особенностях внутреннего устройства postgresql

Имейте в виду, что если вы написали unique1 IN (0,1), то это просто эквивалент unique1=0 OR unique1=1 - обычное выражение. А если добавили VALUES, то у вас скобки возвращают подзапрос со всей вытекающей обработкой подзапроса. И в документации IN описан в двух местах, как два оператора. VALUES - это эквиваент SELECT 0 union SELECT 1 - фактически обрезанная форма команды SELECT без FROM.

Семантически такое переписывание корректно, но практической пользы в нём нет.
NULL в ANY с строгим оператором всё равно не участвует в сравнении, поэтому вынос только не-NULL констант в ANY при сохранении IN (VALUES (NULL)) ничего не меняет.
Без кода это действительно сложно пояснить, но если смотреть на реализацию: btpreprocess_array_keys (используется при обработке индексных условий) игнорирует NULL и работает только с константными значениями. В случае BitmapIndexScan результат дополнительно перепроверяется через ExecQualAndReset, который обращается к данным, хранимым в таблице.) ExecEvalScalarArrayOp также корректно обрабатывает массивы и формирует результат в зависимости от строгости оператора.
Кстати, когда коммитили в 18-ю, добавляли сразу туда NULL элементы и план выглядит так:

postgres=# create table t (x int);
CREATE TABLE
postgres=# explain analyze SELECT x FROM t WHERE x IN (VALUES (0), (1), (NULL), (2));
                                           QUERY PLAN                                           
------------------------------------------------------------------------------------------------
 Seq Scan on t  (cost=0.00..48.25 rows=38 width=4) (actual time=0.020..0.021 rows=0.00 loops=1)
   Filter: (x = ANY ('{0,1,NULL,2}'::integer[]))
 Planning:
   Buffers: shared hit=71
 Planning Time: 3.584 ms
 Execution Time: 0.157 ms
(6 rows)


На фоне приседаний многих компаний выпускающих энтерпрайзные postgres для 1С у меня возник вопрос:

Это феномен чисто Российский когда компания производитель СУБД оптимизирует СУБД под конкретный софт (под 1С) или это имеет место быть и в других кровавых Ынтерпрайзах типа MSSQL/Oracle ?

Если ли другие производители СУБД (MSSQL/Oracle) подстраивают свой разработки под конкретный софт, то можно еще примеры под какой софт они подстраиваются?

И Oracle, и Microsoft бились за SAP (против DB2), внося изменения в свои базы под лозунгом - лучшая БД для SAP. Именно так прогрес идет у баз данных. Улучшение для 1С не означает, что у остальных начнутся проблемы. 1С генерирует запросы, и там есть определенные закономерности (в том числе - частое использование IN и далее список из тысячи значений - так программист 1С привык писать код), и эти закономерности можно оптимизировать. Почему нет? FreeBSD 10 лет назад оптимизировалось под Postgres, чтобы ускорить свою систему работы с памятью и файловой системой

Вторая и третья оптимизации для 1С не актуальны, т.к. там таких кейсов почти нет)

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Информация

Сайт
www.postgrespro.ru
Дата регистрации
Дата основания
Численность
501–1 000 человек
Местоположение
Россия
Представитель
Иван Панченко