JSON down performacen when id:1

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello to everyone

I'm new here, and I hope that my question is on the correct mail-list.

We use PostgreSQL to store JSON-B in different tables, all tables have the same schema and all tables are indexed with GIN index for the JSON data.

We use two properties of the JSON to locate data:

{
"section_id":"1",
"section_tipo":"numisdata3"
}

The issue:
When we search our locator with section_id: 1 (or any number < 4), PostgreSQL takes around 40000, 5000, 8000ms or more.
When we search our locator with section_id: 4 (or any other bigger number), PostgreSQL takes around 100 ms. ( ~ expected time)

Next queries are done in a database with +/- 1 million of rows in total, and we tested in PostgreSQL 13,14 and 15 with similar results.

_____________________________________________

The query for section_id: 1 (13 rows)

EXPLAIN ANALYZE SELECT section_tipo, section_id, datos
FROM "matrix"
WHERE (
datos#>'{relations}' @> '[{"section_id":"1","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
SELECT section_tipo, section_id, datos
FROM "matrix_activities"
WHERE (
datos#>'{relations}' @> '[{"section_id":"1","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
SELECT section_tipo, section_id, datos
FROM "matrix_hierarchy"
WHERE (
datos#>'{relations}' @> '[{"section_id":"1","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
 SELECT section_tipo, section_id, datos
FROM "matrix_list"
WHERE (
datos#>'{relations}' @> '[{"section_id":"1","section_tipo":"numisdata3"}]'::jsonb)
ORDER BY section_tipo, section_id ASC
LIMIT ALL;

QUERY PLAN
Sort  (cost=8984.49..8991.16 rows=2669 width=1357) (actual time=8752.794..8752.797 rows=13 loops=1)
  Sort Key: matrix.section_tipo, matrix.section_id
  Sort Method: quicksort  Memory: 47kB
  ->  Append  (cost=92.21..8832.59 rows=2669 width=1357) (actual time=415.709..8741.565 rows=13 loops=1)
        ->  Bitmap Heap Scan on matrix  (cost=92.21..199.36 rows=27 width=1144) (actual time=415.708..8325.296 rows=11 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "1", "section_tipo": "numisdata3"}]'::jsonb)
              Rows Removed by Index Recheck: 272037
              Heap Blocks: exact=34164 lossy=33104
              ->  Bitmap Index Scan on matrix_relations_idx  (cost=0.00..92.20 rows=27 width=0) (actual time=61.462..61.462 rows=155031 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "1", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Seq Scan on matrix_activities  (cost=0.00..0.00 rows=1 width=68) (actual time=0.012..0.012 rows=0 loops=1)
              Filter: ((datos #> '{relations}'::text[]) @> '[{"section_id": "1", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Bitmap Heap Scan on matrix_hierarchy  (cost=52.26..8492.67 rows=2614 width=1362) (actual time=269.624..414.954 rows=2 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "1", "section_tipo": "numisdata3"}]'::jsonb)
              Rows Removed by Index Recheck: 5043
              Heap Blocks: exact=3034
              ->  Bitmap Index Scan on matrix_hierarchy_relations_idx  (cost=0.00..51.61 rows=2614 width=0) (actual time=9.529..9.529 rows=5049 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "1", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Bitmap Heap Scan on matrix_list  (cost=12.21..100.53 rows=27 width=1161) (actual time=1.260..1.260 rows=0 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "1", "section_tipo": "numisdata3"}]'::jsonb)
              ->  Bitmap Index Scan on matrix_list_relations_idx  (cost=0.00..12.21 rows=27 width=0) (actual time=1.258..1.258 rows=0 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "1", "section_tipo": "numisdata3"}]'::jsonb)
Planning Time: 33.625 ms
Execution Time: 8753.461 ms

_____________________________________________

The query for section_id: 2 (18 rows)


EXPLAIN ANALYZE SELECT section_tipo, section_id, datos
FROM "matrix"
WHERE (
datos#>'{relations}' @> '[{"section_id":"2","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
SELECT section_tipo, section_id, datos
FROM "matrix_activities"
WHERE (
datos#>'{relations}' @> '[{"section_id":"2","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
SELECT section_tipo, section_id, datos
FROM "matrix_hierarchy"
WHERE (
datos#>'{relations}' @> '[{"section_id":"2","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
 SELECT section_tipo, section_id, datos
FROM "matrix_list"
WHERE (
datos#>'{relations}' @> '[{"section_id":"2","section_tipo":"numisdata3"}]'::jsonb)
ORDER BY section_tipo, section_id ASC
LIMIT ALL;

Sort  (cost=8984.49..8991.16 rows=2669 width=1357) (actual time=5236.090..5236.097 rows=18 loops=1)
  Sort Key: matrix.section_tipo, matrix.section_id
  Sort Method: quicksort  Memory: 57kB
  ->  Append  (cost=92.21..8832.59 rows=2669 width=1357) (actual time=200.244..5235.964 rows=18 loops=1)
        ->  Bitmap Heap Scan on matrix  (cost=92.21..199.36 rows=27 width=1144) (actual time=200.244..5188.015 rows=16 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "2", "section_tipo": "numisdata3"}]'::jsonb)
              Rows Removed by Index Recheck: 270935
              Heap Blocks: exact=33885 lossy=33106
              ->  Bitmap Index Scan on matrix_relations_idx  (cost=0.00..92.20 rows=27 width=0) (actual time=51.763..51.764 rows=153659 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "2", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Seq Scan on matrix_activities  (cost=0.00..0.00 rows=1 width=68) (actual time=0.022..0.022 rows=0 loops=1)
              Filter: ((datos #> '{relations}'::text[]) @> '[{"section_id": "2", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Bitmap Heap Scan on matrix_hierarchy  (cost=52.26..8492.67 rows=2614 width=1362) (actual time=5.112..47.171 rows=2 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "2", "section_tipo": "numisdata3"}]'::jsonb)
              Rows Removed by Index Recheck: 2479
              Heap Blocks: exact=1805
              ->  Bitmap Index Scan on matrix_hierarchy_relations_idx  (cost=0.00..51.61 rows=2614 width=0) (actual time=4.834..4.834 rows=2484 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "2", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Bitmap Heap Scan on matrix_list  (cost=12.21..100.53 rows=27 width=1161) (actual time=0.738..0.738 rows=0 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "2", "section_tipo": "numisdata3"}]'::jsonb)
              ->  Bitmap Index Scan on matrix_list_relations_idx  (cost=0.00..12.21 rows=27 width=0) (actual time=0.735..0.735 rows=0 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "2", "section_tipo": "numisdata3"}]'::jsonb)
Planning Time: 30.869 ms
Execution Time: 5236.796 ms

_____________________________________________

The query for section_id: 3 (7 rows)

EXPLAIN ANALYZE SELECT section_tipo, section_id, datos
FROM "matrix"
WHERE (
datos#>'{relations}' @> '[{"section_id":"3","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
SELECT section_tipo, section_id, datos
FROM "matrix_activities"
WHERE (
datos#>'{relations}' @> '[{"section_id":"3","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
SELECT section_tipo, section_id, datos
FROM "matrix_hierarchy"
WHERE (
datos#>'{relations}' @> '[{"section_id":"3","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
 SELECT section_tipo, section_id, datos
FROM "matrix_list"
WHERE (
datos#>'{relations}' @> '[{"section_id":"3","section_tipo":"numisdata3"}]'::jsonb)
ORDER BY section_tipo, section_id ASC
LIMIT ALL;

Sort  (cost=8984.49..8991.16 rows=2669 width=1357) (actual time=1796.808..1796.813 rows=7 loops=1)
  Sort Key: matrix.section_tipo, matrix.section_id
  Sort Method: quicksort  Memory: 36kB
  ->  Append  (cost=92.21..8832.59 rows=2669 width=1357) (actual time=114.715..1796.731 rows=7 loops=1)
        ->  Bitmap Heap Scan on matrix  (cost=92.21..199.36 rows=27 width=1144) (actual time=114.714..1403.005 rows=6 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "3", "section_tipo": "numisdata3"}]'::jsonb)
              Rows Removed by Index Recheck: 63200
              Heap Blocks: exact=39788
              ->  Bitmap Index Scan on matrix_relations_idx  (cost=0.00..92.20 rows=27 width=0) (actual time=52.239..52.239 rows=63248 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "3", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Seq Scan on matrix_activities  (cost=0.00..0.00 rows=1 width=68) (actual time=0.018..0.018 rows=0 loops=1)
              Filter: ((datos #> '{relations}'::text[]) @> '[{"section_id": "3", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Bitmap Heap Scan on matrix_hierarchy  (cost=52.26..8492.67 rows=2614 width=1362) (actual time=329.263..392.708 rows=1 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "3", "section_tipo": "numisdata3"}]'::jsonb)
              Rows Removed by Index Recheck: 4925
              Heap Blocks: exact=2996
              ->  Bitmap Index Scan on matrix_hierarchy_relations_idx  (cost=0.00..51.61 rows=2614 width=0) (actual time=6.059..6.059 rows=4930 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "3", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Bitmap Heap Scan on matrix_list  (cost=12.21..100.53 rows=27 width=1161) (actual time=0.988..0.988 rows=0 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "3", "section_tipo": "numisdata3"}]'::jsonb)
              ->  Bitmap Index Scan on matrix_list_relations_idx  (cost=0.00..12.21 rows=27 width=0) (actual time=0.985..0.985 rows=0 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "3", "section_tipo": "numisdata3"}]'::jsonb)
Planning Time: 4.339 ms
Execution Time: 1797.240 ms

_____________________________________________

The query for section_id: 4 (6 rows)

EXPLAIN ANALYZE SELECT section_tipo, section_id, datos
FROM "matrix"
WHERE (
datos#>'{relations}' @> '[{"section_id":"4","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
SELECT section_tipo, section_id, datos
FROM "matrix_activities"
WHERE (
datos#>'{relations}' @> '[{"section_id":"4","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
SELECT section_tipo, section_id, datos
FROM "matrix_hierarchy"
WHERE (
datos#>'{relations}' @> '[{"section_id":"4","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
 SELECT section_tipo, section_id, datos
FROM "matrix_list"
WHERE (
datos#>'{relations}' @> '[{"section_id":"4","section_tipo":"numisdata3"}]'::jsonb)
ORDER BY section_tipo, section_id ASC
LIMIT ALL;

QUERY PLAN
Sort  (cost=8984.49..8991.16 rows=2669 width=1357) (actual time=25.171..25.174 rows=6 loops=1)
  Sort Key: matrix.section_tipo, matrix.section_id
  Sort Method: quicksort  Memory: 34kB
  ->  Append  (cost=92.21..8832.59 rows=2669 width=1357) (actual time=6.227..25.112 rows=6 loops=1)
        ->  Bitmap Heap Scan on matrix  (cost=92.21..199.36 rows=27 width=1144) (actual time=6.227..24.955 rows=4 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "4", "section_tipo": "numisdata3"}]'::jsonb)
              Rows Removed by Index Recheck: 1758
              Heap Blocks: exact=1469
              ->  Bitmap Index Scan on matrix_relations_idx  (cost=0.00..92.20 rows=27 width=0) (actual time=3.139..3.139 rows=1765 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "4", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Seq Scan on matrix_activities  (cost=0.00..0.00 rows=1 width=68) (actual time=0.010..0.010 rows=0 loops=1)
              Filter: ((datos #> '{relations}'::text[]) @> '[{"section_id": "4", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Bitmap Heap Scan on matrix_hierarchy  (cost=52.26..8492.67 rows=2614 width=1362) (actual time=0.101..0.126 rows=2 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "4", "section_tipo": "numisdata3"}]'::jsonb)
              Rows Removed by Index Recheck: 1
              Heap Blocks: exact=3
              ->  Bitmap Index Scan on matrix_hierarchy_relations_idx  (cost=0.00..51.61 rows=2614 width=0) (actual time=0.088..0.088 rows=3 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "4", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Bitmap Heap Scan on matrix_list  (cost=12.21..100.53 rows=27 width=1161) (actual time=0.015..0.015 rows=0 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "4", "section_tipo": "numisdata3"}]'::jsonb)
              ->  Bitmap Index Scan on matrix_list_relations_idx  (cost=0.00..12.21 rows=27 width=0) (actual time=0.015..0.015 rows=0 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "4", "section_tipo": "numisdata3"}]'::jsonb)
Planning Time: 3.579 ms
Execution Time: 25.278 ms

_____________________________________________

The query for section_id: 5 (24 rows)

EXPLAIN ANALYZE SELECT section_tipo, section_id, datos
FROM "matrix"
WHERE (
datos#>'{relations}' @> '[{"section_id":"5","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
SELECT section_tipo, section_id, datos
FROM "matrix_activities"
WHERE (
datos#>'{relations}' @> '[{"section_id":"5","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
SELECT section_tipo, section_id, datos
FROM "matrix_hierarchy"
WHERE (
datos#>'{relations}' @> '[{"section_id":"5","section_tipo":"numisdata3"}]'::jsonb)
UNION ALL
 SELECT section_tipo, section_id, datos
FROM "matrix_list"
WHERE (
datos#>'{relations}' @> '[{"section_id":"5","section_tipo":"numisdata3"}]'::jsonb)
ORDER BY section_tipo, section_id ASC
LIMIT ALL;


QUERY PLAN
Sort  (cost=8984.49..8991.16 rows=2669 width=1357) (actual time=111.243..111.249 rows=28 loops=1)
  Sort Key: matrix.section_tipo, matrix.section_id
  Sort Method: quicksort  Memory: 69kB
  ->  Append  (cost=92.21..8832.59 rows=2669 width=1357) (actual time=13.804..111.086 rows=28 loops=1)
        ->  Bitmap Heap Scan on matrix  (cost=92.21..199.36 rows=27 width=1144) (actual time=13.803..108.578 rows=26 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "5", "section_tipo": "numisdata3"}]'::jsonb)
              Rows Removed by Index Recheck: 5967
              Heap Blocks: exact=4691
              ->  Bitmap Index Scan on matrix_relations_idx  (cost=0.00..92.20 rows=27 width=0) (actual time=11.815..11.815 rows=6000 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "5", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Seq Scan on matrix_activities  (cost=0.00..0.00 rows=1 width=68) (actual time=0.011..0.011 rows=0 loops=1)
              Filter: ((datos #> '{relations}'::text[]) @> '[{"section_id": "5", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Bitmap Heap Scan on matrix_hierarchy  (cost=52.26..8492.67 rows=2614 width=1362) (actual time=2.034..2.052 rows=2 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "5", "section_tipo": "numisdata3"}]'::jsonb)
              Rows Removed by Index Recheck: 1
              Heap Blocks: exact=3
              ->  Bitmap Index Scan on matrix_hierarchy_relations_idx  (cost=0.00..51.61 rows=2614 width=0) (actual time=1.987..1.987 rows=4 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "5", "section_tipo": "numisdata3"}]'::jsonb)
        ->  Bitmap Heap Scan on matrix_list  (cost=12.21..100.53 rows=27 width=1161) (actual time=0.426..0.426 rows=0 loops=1)
              Recheck Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "5", "section_tipo": "numisdata3"}]'::jsonb)
              ->  Bitmap Index Scan on matrix_list_relations_idx  (cost=0.00..12.21 rows=27 width=0) (actual time=0.418..0.418 rows=0 loops=1)
                    Index Cond: ((datos #> '{relations}'::text[]) @> '[{"section_id": "5", "section_tipo": "numisdata3"}]'::jsonb)
Planning Time: 4.328 ms
Execution Time: 111.514 ms

_____________________________________________

We have checked the index and it's ok, we did vacuum, vacuum analyze... 

We can understand that the first 3 searches for section_id didn't use the index... But... how can we fix it? 

Thanks!

Best
Alex
alex@xxxxxxxxx


657661974 · Denia 50, bajo izquierda · 46006 · Valencia




[Postgresql General]     [Postgresql PHP]     [PHP Users]     [PHP Home]     [PHP on Windows]     [Kernel Newbies]     [PHP Classes]     [PHP Books]     [PHP Databases]     [Yosemite]

  Powered by Linux