Hi, don't you want an index on t_a2b.col_a, maybe partial where col_a=1 ?
On Wed, Jun 22, 2016 at 2:07 AM, Jonathan Vanasco <postg...@2xlp.com> wrote: > > On Jun 21, 2016, at 6:55 PM, David G. Johnston wrote: > > Aside from the name these indexes are identical... > > > sorry. tired eyes copy/pasting between windows and trying to 'average' out > 40 similar queries. > > These two items combined reduce the desirability of diagnosing this...it > doesn't seem like you've faithfully recreated the scenario for us to > evaluate. > > Your post is also not self-contained and you haven't provided the actual > EXPLAINs you are getting. > > > I played around with some more indexes, creating and disabling them on one > specific query > Eventually i found some index formats that didn't pull in the whole table. > They gave approximately the same results as the other selects, with some > differences in reporting. the heap scan on the table was negligible. the > big hit was off the outer hash join. > the formatting in explain made a negligible check look like it was the > root issue > > > CREATE TABLE t_a (id SERIAL PRIMARY KEY, > col_1 INT NOT NULL, > col_2 BOOLEAN DEFAULT NULL > ); > CREATE INDEX test_idx__t_a_col1_col2__v1 on t_a (col_1) WHERE col_2 IS NOT > FALSE; > CREATE INDEX test_idx__t_a_col1_col2__v2 on t_a (col_1, id) WHERE col_2 IS > NOT FALSE; > CREATE INDEX test_idx__t_a_col1_col2__v3 on t_a (id, col_1) WHERE col_2 IS > NOT FALSE; > CREATE INDEX test_idx__t_a_col1_col2__v4 on t_a (id, col_1, col_2) WHERE > col_2 IS NOT FALSE; > CREATE INDEX test_idx__t_a_col1_col2__v5 on t_a (col_1, col_2) WHERE col_2 > IS NOT FALSE; > > CREATE TABLE t_b (id SERIAL PRIMARY KEY, > col_1 INT NOT NULL, > col_2 BOOLEAN DEFAULT NULL > ); > CREATE TABLE t_a2b (a_id INT NOT NULL REFERENCES t_a(id), > b_id INT NOT NULL REFERENCES t_b(id), > col_a INT NOT NULL, > PRIMARY KEY (a_id, b_id) > ); > > EXPLAIN ANALYZE > SELECT t_a2b.b_id AS t_a2b_b_id, > count(t_a2b.b_id) AS counted > FROM t_a2b > JOIN t_a ON t_a2b.a_id = t_a.id > WHERE t_a.col_1 = 730 > AND t_a2b.col_a = 1 > AND (t_a.col_2 IS NOT False) > GROUP BY t_a2b.b_id > ORDER BY counted DESC, > t_a2b.b_id ASC > LIMIT 25 > OFFSET 0 > ; > > > > QUERY PLAN > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ > Limit (cost=270851.55..270851.62 rows=25 width=4) (actual > time=1259.950..1259.953 rows=25 loops=1) > -> Sort (cost=270851.55..270863.43 rows=4750 width=4) (actual > time=1259.945..1259.945 rows=25 loops=1) > Sort Key: (count(t_a2b.b_id)) DESC, t_a2b.b_id > Sort Method: top-N heapsort Memory: 26kB > -> HashAggregate (cost=270670.01..270717.51 rows=4750 width=4) > (actual time=1259.430..1259.769 rows=1231 loops=1) > Group Key: t_a2b.b_id > -> Hash Join (cost=171148.45..270516.71 rows=30660 > width=4) (actual time=107.662..1230.481 rows=124871 loops=1) > Hash Cond: (t_a2b.a_id = t_a.id) > -> Seq Scan on t_a2b (cost=0.00..89741.18 > rows=2485464 width=8) (actual time=0.011..661.978 rows=2492783 loops=1) > Filter: (col_a = 1) > Rows Removed by Filter: 2260712 > -> Hash (cost=170446.87..170446.87 rows=56126 > width=4) (actual time=107.409..107.409 rows=48909 loops=1) > Buckets: 65536 Batches: 1 Memory Usage: 2232kB > -> Bitmap Heap Scan on t_a > (cost=1055.41..170446.87 rows=56126 width=4) (actual time=18.243..94.470 > rows=48909 loops=1) > Recheck Cond: ((col_1 = 730) AND (col_2 > IS NOT FALSE)) > Heap Blocks: exact=43972 > -> Bitmap Index Scan on > test_idx__t_a_col1_col2__v2 (cost=0.00..1041.38 rows=56126 width=0) > (actual time=8.661..8.661 rows=48909 loops=1) > Index Cond: (col_1 = 730) > Planning time: 0.796 ms > Execution time: 1260.092 ms > > > QUERY PLAN > > ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ > Limit (cost=208239.59..208239.65 rows=25 width=4) (actual > time=1337.739..1337.743 rows=25 loops=1) > -> Sort (cost=208239.59..208251.47 rows=4750 width=4) (actual > time=1337.737..1337.739 rows=25 loops=1) > Sort Key: (count(t_a2b.b_id)) DESC, t_a2b.b_id > Sort Method: top-N heapsort Memory: 26kB > -> HashAggregate (cost=208058.05..208105.55 rows=4750 width=4) > (actual time=1337.183..1337.556 rows=1231 loops=1) > Group Key: t_a2b.b_id > -> Hash Join (cost=108628.33..207935.37 rows=24537 > width=4) (actual time=173.116..1306.910 rows=124871 loops=1) > Hash Cond: (t_a2b.a_id = t_a.id) > -> Seq Scan on t_a2b (cost=0.00..89741.18 > rows=2485464 width=8) (actual time=0.010..669.616 rows=2492783 loops=1) > Filter: (col_a = 1) > Rows Removed by Filter: 2260712 > -> Hash (cost=108066.87..108066.87 rows=44917 > width=4) (actual time=172.884..172.884 rows=48909 loops=1) > Buckets: 65536 Batches: 1 Memory Usage: 2232kB > -> Index Only Scan using > test_idx__t_a_col1_col2__v4 on t_a (cost=0.43..108066.87 rows=44917 > width=4) (actual time=0.031..160.088 rows=48909 loops=1) > Index Cond: (col_1 = 730) > Heap Fetches: 2426 > Planning time: 0.769 ms > Execution time: 1337.861 ms > >