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 ответов

17 просмотров

что-то пересокращали: - не хватает 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 сделать

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

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

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта