и у запроса есть limit и order by.
Как может так получиться, что запрос с limit 2 выполняется на порядок медленнее, чем с limit 50?
У них и планы разные - один использует индекс, другой нет.
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);
А можете показать explain analyze для обоих запросов?
У вас, кстати, не такая схема (индэкс на data явно не тот).
Так Idea выдает. Вот как он создавался: CREATE INDEX CONCURRENTLY IF NOT EXISTS credit_application_data_idx ON credit_application USING gin (data);
Обсуждают сегодня