Forum OpenACS Development: Re: acs_object__new slowness...
I created 500k users, but only 6 rel_segments (for main site and 2 subsites), and 2 rel_constraints (one for each subsites). My daughter contributed to the experiment by turning my computer off so yeah, everything has been restarted after a vacuumdb -f -z.
I have a second db (on the same server) with 100k users, 20 rel_segs, and 3 rel_constraints and the query takes .5ms (rather than the 1-2 seconds with the dataset which is 5x larger). Same
I dropped the group_elem_idx_container_idx and on the 500k user db the query dropped to under 1ms and had this plan:
explain analyze select constraint_id, constraint_name from rel_constraints_violated_one where rel_id = 20938;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Nested Loop (cost=26.42..34855.94 rows=1 width=262) (actual time=0.07..0.07 rows=0 loops=1)
Join Filter: (("inner".segment_id = "outer".required_rel_segment) AND ("inner".element_id = "outer".container_id))
Filter: ("inner".element_id IS NULL)
-> Merge Join (cost=3.05..10.36 rows=1 width=159) (actual time=0.07..0.07 rows=0 loops=1)
Merge Cond: ("outer".group_id = "inner".group_id)
Join Filter: ("outer".object_type = "inner".rel_type)
-> Nested Loop (cost=0.00..17.74 rows=5 width=133) (actual time=0.07..0.07 rows=0 loops=1)
Join Filter: (("inner".tree_sortkey >= "outer".tree_sortkey) AND ("inner".tree_sortkey <= tree_right("outer".tree_sortkey)))
-> Nested Loop (cost=0.00..14.53 rows=1 width=106) (actual time=0.07..0.07 rows=0 loops=1)
Join Filter: ("inner".object_type = "outer".rel_type)
-> Nested Loop (cost=0.00..11.54 rows=1 width=79) (actual time=0.07..0.07 rows=0 loops=1)
Join Filter: ("inner".rel_segment = "outer".segment_id)
-> Index Scan using rel_segments_grp_rel_type_uq on rel_segments rs (cost=0.00..5.32 rows=6 width=23) (actual time=0.02..0.03 rows=6 loops=1)
-> Seq Scan on rel_constraints rel (cost=0.00..1.02 rows=1 width=56) (actual time=0.00..0.00 rows=0 loops=6)
Filter: (rel_side = 'one'::bpchar)
-> Seq Scan on acs_object_types o2 (cost=0.00..2.44 rows=44 width=27) (never executed)
-> Seq Scan on acs_object_types o1 (cost=0.00..2.44 rows=44 width=27) (never executed)
-> Sort (cost=3.05..3.06 rows=3 width=26) (never executed)
Sort Key: public.group_element_index.group_id
-> Index Scan using group_elem_idx_rel_id_idx on group_element_index (cost=0.00..3.04 rows=3 width=26) (never executed)
Index Cond: (rel_id = 20938)
-> Materialize (cost=33280.71..33280.71 rows=104324 width=103) (never executed)
-> Hash Join (cost=23.36..33280.71 rows=104324 width=103) (never executed)
Hash Cond: ("outer".rel_type = "inner".object_type)
Join Filter: ("outer".group_id = "inner".group_id)
-> Seq Scan on group_element_index (cost=0.00..19349.74 rows=927174 width=26) (never executed)
-> Hash (cost=23.29..23.29 rows=29 width=77) (never executed)
-> Nested Loop (cost=1.07..23.29 rows=29 width=77) (never executed)
Join Filter: (("inner".tree_sortkey >= "outer".tree_sortkey) AND ("inner".tree_sortkey <= tree_right("outer".tree_sortkey)))
-> Hash Join (cost=1.07..4.03 rows=6 width=50) (never executed)
Hash Cond: ("outer".object_type = "inner".rel_type)
-> Seq Scan on acs_object_types o2 (cost=0.00..2.44 rows=44 width=27) (never executed)
-> Hash (cost=1.06..1.06 rows=6 width=23) (never executed)
-> Seq Scan on rel_segments rs (cost=0.00..1.06 rows=6 width=23) (never executed)
-> Seq Scan on acs_object_types o1 (cost=0.00..2.44 rows=44 width=27) (never executed)
Total runtime: 0.29 msec
(36 rows)