172 похожих чатов

Есть sql-запрос, вызываемый из приложения (ниже представлен сильно упрощенный вариант

с сохранением сути). На вход передаётся идентификатор документа первого уровня и массив натуральных ключей (допустим, опять же для простоты, что это связка имя-фамилия). Цель - найти идентификаторы документов третьего уровня, в связке с натуральными ключами, которые встречаются в переданном массиве. И вот эти конкатенации, касты к json и т.п. нереально тормозят запрос (если оставить те же join-ы одни, производительность возрастает в 20 раз) - можно ли с этим ужасом что-то сделать?

WITH keys AS (
SELECT hstore( %2%::TEXT[], array_fill(1::text, array[0]) ) natkey
)
SELECT thrd_lvl_documents.id, concat(
UPPER(COALESCE(thrd_lvl_documents.data::json#>'{employee}'->>'SecondName', '')) ||
UPPER(COALESCE(thrd_lvl_documents.data::json#>'{employee}'->>'Name', ''))
)AS nat_key
FROM
thrd_lvl_documents
JOIN snd_lvl_documents ON thrd_lvl_documents.snd_lvl_doc = snd_lvl_documents.id
JOIN fst_lvl_documents ON snd_lvl_documents.fst_lvl_doc = fst_lvl_documents.id
JOIN keys ON keys.natkey->concat(
UPPER(COALESCE(thrd_lvl_documents.data::json#>'{employee}'->>'SecondName', '')) ||
UPPER(COALESCE(thrd_lvl_documents.data::json#>'{employee}'->>'Name', ''))
) IS NOT NULL
WHERE
fst_lvl_documents.id = %1%::bigint

8 ответов

19 просмотров

что-то пересокращали: - не хватает SELECT - не понятна конструкция `JOIN keys ON keys.natkey->concat(…` - ну и надо бы EXPLAIN (analyze, buffers) чтобы видеть как тормозит

Vadim-Ushakov Автор вопроса
Виктор Егоров
что-то пересокращали: - не хватает SELECT - не пон...

Select добавил. JOIN keys ON keys.natkey->concat фактически, оригинальный перл автора данного запроса (на входе массив натуральных ключей кастится к hstore, а тут мы, получая очередную запись thrd_lvl_documents на месте выдёргиваем из данных куски, соединяем их воедино и проверяем оператором "->" наличие этих данных в hstore). Explain с замазанными названиями таблиц и полей вам что-нибудь даст?

Vadim Ushakov
Select добавил. JOIN keys ON keys.natkey->concat ф...

засуньте в explain.depesz.com, там есть анонимизация и удаление планов

Vadim-Ushakov Автор вопроса
Виктор Егоров
засуньте в explain.depesz.com, там есть анонимизац...

За сайт отдельное спасибо - не знал про существование подобного ресурса с автоматической анонимизацией.

Vadim Ushakov
https://explain.depesz.com/s/LJFc

- оценка записей для romeo_charlie плывёт, надо проанализировать; - всё время тратите на фильтрацию при слиянии. может вместо того, чтобы городить эту конструкцию c keys, посмотреть на оператор @@ и jsonpath? или сделать проверку на вхождение массива [ SecondName, Name ] в ваши keys? чтобы перенести фильтрацию из JOIN-а в IndexScan.

Vadim-Ushakov Автор вопроса
Виктор Егоров
- оценка записей для romeo_charlie плывёт, надо пр...

С индексом romeo_charlie мне ничего и не дадут сделать, а вот второй и третий совет попробую копнуть глубже - спасибо за помощь.

Vadim Ushakov
С индексом romeo_charlie мне ничего и не дадут сд...

это не индекс, а таблица. нужно ANALYZE сделать

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
Карта сайта