klink0v (klink0v) wrote,
klink0v
klink0v

Category:

И снова PostgreSQL

... Есть у нас один "проблемный" сервис, который очень сильно нагружает БД 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] разнообразен и удивителен.

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

  • Мелкий наброс насчет Linux-дистрибутивов

    Мелкий холиварчик на тему Linux-дистрибутивов. Все нижеизложенное является исключительно моим личным мнением. У меня иногда спрашивают какой мой…

  • ОколоITшный дыбр #23

    ... Есть такое замечательное упражнение с bash quoting. Когда тебе хочется выполнить какую-нибудь цепочку команд в шелле из-под sudo на удаленной…

  • Памятка по APT и GPG в Debian-based

    ... Начиная с Debian 11 и Ubuntu 20 механизм "apt-key" признан официально устаревшим (deprecated). Сейчас предлагается самостоятельно…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 9 comments