Mam takie proste pytanie:
explain analyze SELECT id, ta, tb FROM public.xyz WHERE ta in(1,2) AND tb = 44 ORDER BY id DESC LIMIT 1;
Limit (cost=0.44..73.58 rows=1 width=20) (actual time=13829.144..13829.145 rows=0 loops=1)
-> Index Scan Backward using xyz_pkey on xyz (cost=0.44..1226229.92 rows=16765 width=20) (actual time=13829.142..13829.142 rows=0 loops=1)
Filter: ((ta = ANY ('{1,2}'::integer[])) AND (tb = 44))
Rows Removed by Filter: 26782368
Planning Time: 0.444 ms
Execution Time: 13829.183 ms
Zmiana limit 1 na limit 100 skutkuje całkiem innym planem:
explain analyze SELECT id, ta, tb FROM public.xyz WHERE ta in(1,2) AND tb = 44 ORDER BY id DESC LIMIT 100;
Limit (cost=1313.18..1313.43 rows=100 width=20) (actual time=0.100..0.101 rows=0 loops=1)
-> Sort (cost=1313.18..1355.09 rows=16765 width=20) (actual time=0.100..0.100 rows=0 loops=1)
Sort Key: id DESC
Sort Method: quicksort Memory: 25kB
-> Index Only Scan using xyz_tb_ta_id_idx on xyz (cost=0.56..672.43 rows=16765 width=20) (actual time=0.093..0.094 rows=0 loops=1)
Index Cond: ((tb = 44) AND (ta = ANY ('{1,2}'::integer[])))
Heap Fetches: 0
Planning Time: 0.187 ms
Execution Time: 0.119 ms
Jak zrobić żeby to pierwsze też użyło indexu?
Dodam, że w tabeli jest kilkadziesiąt milionów rekordów, ale żaden nie spełnia tych warunków.
Oprócz tego mam jeszcze jeden bardzo niepożadany efekt uboczny 1 pytania: wzrost zużycia RAM o kilka GB do czasu zamknięcia połączenia. Na zdalnym docker przez wsl z limitami tego nie odczułem, ale jak zainstalowałem standalone postgresql bez dockera to mi zajęło prawie cały RAM(ustawiłem 6 GB w virtualbox).