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

Привет! У меня есть select с условием по полю в jsonb

и у запроса есть limit и order by.
Как может так получиться, что запрос с limit 2 выполняется на порядок медленнее, чем с limit 50?
У них и планы разные - один использует индекс, другой нет.

4 ответов

12 просмотров
Eugene-Ivlev Автор вопроса

1) Версия Postgres 12.7 2) Запрос: select uuid from credit_application where (data @?? cast('$.approvedProducts[*].guarantorSets[*].guarantors[*].suretyApplicationIntegrationId ? (@ == "100")' as jsonpath)) = true order by integration_id asc limit 50; 3) План запроса с limit 50: Limit (cost=2791.71..2791.83 rows=50 width=60) -> Sort (cost=2791.71..2797.12 rows=2164 width=60) Sort Key: integration_id -> Bitmap Heap Scan on credit_application (cost=543.77..2719.82 rows=2164 width=60) " Recheck Cond: (data @? '$.""approvedProducts""[*].""guarantorSets""[*].""guarantors""[*].""suretyApplicationIntegrationId""?(@ == ""100"")'::jsonpath)" -> Bitmap Index Scan on credit_application_data_idx (cost=0.00..543.23 rows=2164 width=0) " Index Cond: (data @? '$.""approvedProducts""[*].""guarantorSets""[*].""guarantors""[*].""suretyApplicationIntegrationId""?(@ == ""100"")'::jsonpath)" План запроса с limit 2: Limit (cost=0.43..260.42 rows=2 width=60) -> Index Scan using uk_d3e9ebs8y56ub3hcuavg3cgjw on credit_application (cost=0.43..281312.93 rows=2164 width=60) " Filter: (data @? '$.""approvedProducts""[*].""guarantorSets""[*].""guarantors""[*].""suretyApplicationIntegrationId""?(@ == ""100"")'::jsonpath)" 4) Схема таблицы: create table credit_application ( uuid char(32) not null constraint credit_application_pkey primary key, created_date timestamp, last_modified_date timestamp, data jsonb, integration_id varchar(255) not null constraint uk_d3e9ebs8y56ub3hcuavg3cgjw unique, sales_stage varchar(255), status varchar(255), reason_won_lost varchar(255), update_type varchar(255), closed_date timestamp ); alter table credit_application owner to application_storage; create index credit_application_data_idx on credit_application (data);

Eugene Ivlev
1) Версия Postgres 12.7 2) Запрос: select uuid ...

А можете показать explain analyze для обоих запросов?

Eugene Ivlev
1) Версия Postgres 12.7 2) Запрос: select uuid ...

У вас, кстати, не такая схема (индэкс на data явно не тот).

Eugene-Ivlev Автор вопроса
Ilya Anfimov
У вас, кстати, не такая схема (индэкс на data явно...

Так Idea выдает. Вот как он создавался: CREATE INDEX CONCURRENTLY IF NOT EXISTS credit_application_data_idx ON credit_application USING gin (data);

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

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

Какой-то там пердун в 90-х решил, что есть какая-то разная типизация. Кого вообще это волнует?
КТ315
49
void terminal_scroll() { memmove(terminal_buffer, terminal_buffer + VGA_WIDTH, buffer_size - VGA_WIDTH); memset(terminal_buffer + buffer_size - VGA_WIDTH, 0, VGA_WIDTH); ...
Егор
47
Всем привет! Подскажите, пожалуйста, в чем ошибка? Настраиваю подключение к MySQL. Либы лежат рядом с exe. Все как по "учебнику"
Евгений
16
А можете как-то проверить меня по знаниям по ассемблеру?
A A
132
Здравствуйте! У меня появилась возможность купить книгу "Изучай Haskell во имя добра!". Но я где-то слышал, что эта книга устарела. Насколько это правда??
E
22
Здравствуйте! Я вот на stepic решаю задачи на хаскеле https://stepik.org/lesson/8443/step/8?unit=1578 мой код import Data.List (isInfixOf) removing :: String -> [String] ->...
E
10
Камрады, кто тесно работал с vtv, хотел уточнить. Ширина column задаётся жёстко на этапе создания дерева или можно в рантайме ее менять программно (не мышкой)?
Ed Doc
10
да ладно ... что там неочевидного ? глянуть в исх-ки датасета и/или кверика чтобы понять в каком месте и как выполняется обращения к св-вам blablaSQL - минутное дело, даже е...
Сергей
7
Здесь для arm кто-нибудь кодит ?
Nothing
52
Всем привет, у меня есть сервер принимающий входящие HTTP подключения, как проверить, что подключение было через прокси или нет, есть какие то поля в заголовках по которым мо...
DS
8
Карта сайта