И снова PostgreSQL

Nov 23, 2021 18:28


... Есть у нас один "проблемный" сервис, который очень сильно нагружает БД PostgreSQL. Вытащили его из общего кластера на отдельную машину, и как выяснилось, вовремя успели. Потому что прямо в ближайшие же после этого дни сервис стал вообще ронять СУБД по OOM (out-of-memory), что вообще-то для Postgres-а не очень характерно. После этого программисты, наконец, всерьёз зачесались и стали искать причины.

Выяснилось интересное. Там помимо прочего лежит таблица, секционированная по дате (create table ... CHECK... INHERITS). И некоторый тяжелый запрос, который ищет в этой таблице вида
SELECT блабла FROM блаблабла WHERE create_date = to_date('2020-10-05', 'YYYY-MM-DD');

И в таком виде Postgres плевать хотел на партиционирование, а начинал параллельный скан по всем секциям, чем собственно и жрал память как корова веники. Но стоило только заменить последнюю часть запроса на один из вариантов:
WHERE create_date = '2020-10-05'::date
WHERE create_date=CAST( '2020-10-05' AS date )
WHERE create_date= date '2020-10-05'

как сразу же базу "отпускало", и она начинала искать прицельно в нужной секции.

Всё-таки Postgres весьма загадочная штука отдельными своими местами. Вот тут есть обсуждение подобной багофичи. Судя по всем, при использовании "to_date" планировщик заранее не знает на этапе парсинга запроса что вернёт эта функция, поэтому запускает полное сканирование таблицы. А когда ему на вход дают константу в явном виде, то он быстро понимает что это такое и где его искать.

Что совсем интересно, разработчик потом попробовал то же самое на Oracle, поскольку требуется совместимость этого программного кода с разными БД. Так вот, из всех вариантов выше, на Oracle корректно отработал только способ "WHERE create_date=date '2020-10-05'". Причем, движок Oracle эту штуку сам преобразует запрос в "TO_DATE(' 2020-10-05 00:00:00', 'syyyy-mm-dd hh24:mi:ss')", но шосукарактерно, совершенно корректно отрабатывает такую конструкцию. Ох уж эти SQL-диалекты и кросплатформменость...

... Кстати, про Oracle. Периодически мне в LinkedIn стучатся разные неожиданные личности. Одна из них подкинула мне вот такую вакансию. Чуваки ищут на саппорт инженера, который работал бы с ораклом, нутаниксом, SAP-ом, Linux-ом, AIX-ом, BSD, TCP-сетями и разговорным английским, и чтобы всё это за 100 тысяч рублей в месяц. А-ха-ха-ха! До второго пришествия, наверное, даже найдут. Пожелаем им удачи в поисках. И чем думают те, кто составляет описание и публикует описание подобных вакансий? Не перестаю удивляться. Мир [censored] разнообразен и удивителен.

датабазы, postgresql, ссылки, трудовыебудни

Previous post Next post
Up