Hi all I’m having a problem with a slow query – I tried several things to optimize the queries but didn’t really help. The output of explain analyse shows sequential scan on a table of 25 million rows. Even though it is indexed and (I put a multi-column
index on the fields used in the query), the explain utility shows no usage of the scan… Query takes around 200 sec… Before considering a design change…I wanted to make sure that there is no way to optimize the query…. explain analyze select s.attvalue from functionalvarattributes s, tags t, variableattributetypes vat where t.id=s.tag_id and t.status!='Internal'and vat.fieldtype in ('DBF_INLINK','DBF_OUTLINK','DBF_FWDLINK') and vat.id=s.atttype_id and
split_part(split_part(s.attvalue,' ',1),'.',1) in (select e.name from functionalvariables e, usertemplatevariable ut where e.usertemplatevar_id=ut.id and ut.usertempl_id=15) except select s.attvalue from functionalvarattributes s, tags t, usertemplvarattribute
utva, usertemplatevariable utv, variableattributetypes vat where vat.fieldtype in ('DBF_INLINK','DBF_OUTLINK','DBF_FWDLINK') and vat.id=s.atttype_id and utv.id=utva.usertempvariable_fk and utv.usertempl_id=15 and t.id=s.tag_id and t.status!='Internal'and split_part(split_part(s.attvalue,'
',1),'.',1) in (select e.name from functionalvariables e, usertemplatevariable ut where e.usertemplatevar_id=ut.id and ut.usertempl_id=15); QUERY PLAN
--------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------- HashSetOp Except (cost=171505.51..2086914.68 rows=1103 width=8) (actual time=186584.977..186584.977 rows=0 loops=1) -> Append (cost=171505.51..2031899.30 rows=22006150 width=8) (actual time=36550.214..186584.539 rows=320 loops=1) -> Subquery Scan on "*SELECT* 1" (cost=171505.51..905822.16 rows=155062 width=8) (actual time=36550.213..87210.878 rows=2 lo ops=1) -> Hash Join (cost=171505.51..904271.54 rows=155062 width=8) (actual time=36550.212..87210.874 rows=2 loops=1) Hash Cond: (split_part(split_part((s.attvalue)::text, ' '::text, 1), '.'::text, 1) = (e.name)::text) -> Hash Join (cost=193.91..726328.81 rows=310124 width=8) (actual time=42.242..63701.027 rows=308287 loops=1) Hash Cond: (s.tag_id = t.id) -> Hash Join (cost=188.03..716954.60 rows=1671226 width=16) (actual time=42.154..63387.723 rows=651155 loo ps=1) Hash Cond: (s.atttype_id = vat.id) -> Seq Scan on functionalvarattributes s (cost=0.00..604691.04 rows=25430204 width=24) (actual time= 0.007..53954.210 rows=25429808 loops=1) -> Hash (cost=183.18..183.18 rows=388 width=8) (actual time=42.113..42.113 rows=388 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 16kB -> Seq Scan on variableattributetypes vat (cost=0.00..183.18 rows=388 width=8) (actual time=0. 003..41.984 rows=388 loops=1) Filter: ((fieldtype)::text = ANY ('{DBF_INLINK,DBF_OUTLINK,DBF_FWDLINK}'::text[])) Rows Removed by Filter: 5516 -> Hash (cost=5.43..5.43 rows=36 width=8) (actual time=0.064..0.064 rows=36 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 2kB -> Seq Scan on tags t (cost=0.00..5.43 rows=36 width=8) (actual time=0.012..0.052 rows=36 loops=1) Filter: ((status)::text <> 'Internal'::text) Rows Removed by Filter: 158 -> Hash (cost=171250.07..171250.07 rows=4923 width=24) (actual time=23162.533..23162.533 rows=16 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 1kB -> HashAggregate (cost=171200.84..171250.07 rows=4923 width=24) (actual time=23162.498..23162.518 rows=16
loops=1) -> Hash Join (cost=8.95..171188.53 rows=4923 width=24) (actual time=17.642..23162.464 rows=48 loops= 1) Hash Cond: (e.usertemplatevar_id = ut.id) -> Seq Scan on functionalvariables e (cost=0.00..155513.07 rows=4164607 width=32) (actual time =0.008..21674.864 rows=4164350 loops=1) -> Hash (cost=8.75..8.75 rows=16 width=8) (actual time=0.058..0.058 rows=16 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 1kB -> Index Scan using usertemp_utv_idx on usertemplatevariable ut (cost=0.29..8.75 rows=16 width=8) (actual time=0.043..0.052 rows=16 loops=1) Index Cond: (usertempl_id = 15) -> Subquery Scan on "*SELECT* 2" (cost=172514.13..1126077.14 rows=21851088 width=8) (actual time=43579.873..99373.299 rows=3 18 loops=1) -> Hash Join (cost=172514.13..907566.26 rows=21851088 width=8) (actual time=43579.870..99372.820 rows=318 loops=1) Hash Cond: (split_part(split_part((s_1.attvalue)::text, ' '::text, 1), '.'::text, 1) = (e_1.name)::text) -> Hash Join (cost=193.91..726328.81 rows=310124 width=8) (actual time=2.724..71226.183 rows=308287 loops=1) Hash Cond: (s_1.tag_id = t_1.id) -> Hash Join (cost=188.03..716954.60 rows=1671226 width=16) (actual time=2.548..70764.941 rows=651155 loop s=1) Hash Cond: (s_1.atttype_id = vat_1.id) -> Seq Scan on functionalvarattributes s_1 (cost=0.00..604691.04 rows=25430204 width=24) (actual tim e=0.003..57363.539 rows=25429808 loops=1) -> Hash (cost=183.18..183.18 rows=388 width=8) (actual time=2.450..2.450 rows=388 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 16kB -> Seq Scan on variableattributetypes vat_1 (cost=0.00..183.18 rows=388 width=8) (actual time= 0.014..2.153 rows=388 loops=1) Filter: ((fieldtype)::text = ANY ('{DBF_INLINK,DBF_OUTLINK,DBF_FWDLINK}'::text[])) Rows Removed by Filter: 5516 -> Hash (cost=5.43..5.43 rows=36 width=8) (actual time=0.131..0.131 rows=36 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 2kB -> Seq Scan on tags t_1 (cost=0.00..5.43 rows=36 width=8) (actual time=0.015..0.100 rows=36 loops=1) Filter: ((status)::text <> 'Internal'::text) Rows Removed by Filter: 158 -> Hash (cost=172318.46..172318.46 rows=141 width=24) (actual time=27594.115..27594.115 rows=2544 loops=1) Buckets: 1024 Batches: 1 Memory Usage: 134kB -> Nested Loop (cost=171201.54..172318.46 rows=141 width=24) (actual time=27586.058..27592.012 rows=2544 l oops=1) -> Nested Loop (cost=171201.12..172243.46 rows=16 width=32) (actual time=27585.957..27586.510 rows=2 56 loops=1) -> HashAggregate (cost=171200.84..171250.07 rows=4923 width=24) (actual time=27572.535..27572. 595 rows=16 loops=1) -> Hash Join (cost=8.95..171188.53 rows=4923 width=24) (actual time=27.159..27572.439 ro ws=48 loops=1) Hash Cond: (e_1.usertemplatevar_id = ut_1.id) -> Seq Scan on functionalvariables e_1 (cost=0.00..155513.07 rows=4164607 width=32 ) (actual time=0.163..23959.820 rows=4164350 loops=1) -> Hash (cost=8.75..8.75 rows=16 width=8) (actual time=0.070..0.070 rows=16 loops= 1) Buckets: 1024 Batches: 1 Memory Usage: 1kB -> Index Scan using usertemp_utv_idx on usertemplatevariable ut_1 (cost=0.29 ..8.75 rows=16 width=8) (actual time=0.040..0.057 rows=16 loops=1) Index Cond: (usertempl_id = 15) -> Materialize (cost=0.29..8.83 rows=16 width=8) (actual time=0.839..0.851 rows=16 loops=16) -> Index Scan using usertemp_utv_idx on usertemplatevariable utv (cost=0.29..8.75 rows=1 6 width=8) (actual time=0.039..0.080 rows=16 loops=1) Index Cond: (usertempl_id = 15) -> Index Only Scan using usertemplvarattribute_atttypeid_key on usertemplvarattribute utva (cost=0.4 2..4.60 rows=9 width=8) (actual time=0.004..0.011 rows=10 loops=256) Index Cond: (usertempvariable_fk = utv.id) Heap Fetches: 0 Total runtime: 186585.376 ms (67 rows) \d functionalvarattributes; Table "public.functionalvarattributes" Column | Type | Modifiers
---------------------+-----------------------------+---------------------------------------------------------------------- id | bigint | not null default nextval('functionalvarattributes_id_seq'::regclass) attvalue | character varying(4000) | not null createdat | timestamp without time zone | description | character varying(500) | updatedat | timestamp without time zone | autosaved | boolean | not null atttype_id | bigint | codactemplvaratt_fk | bigint | funcvar_fk | bigint | not null tag_id | bigint | usertemplvaratt_fk | bigint | useratttype_id | bigint | keyattvalue | character varying(255) | Indexes: "functionalvarattributes_pkey" PRIMARY KEY, btree (id) "functionalvarattributes_funcvar_fk_tag_id_atttype_id_key" UNIQUE CONSTRAINT, btree (funcvar_fk, tag_id, atttype_id) "usertemplvaratt_funcvaratt_idx" btree (usertemplvaratt_fk) "vat_funcvaratt_multi_idx" btree (atttype_id, attvalue, tag_id) Foreign-key constraints: "fk6b514a7b1929df33" FOREIGN KEY (useratttype_id) REFERENCES userattributetypes(id) "fk6b514a7b19d38f01" FOREIGN KEY (codactemplvaratt_fk) REFERENCES codactemplvarattribute(id) "fk6b514a7b2080a717" FOREIGN KEY (atttype_id) REFERENCES variableattributetypes(id) "fk6b514a7ba4d2f942" FOREIGN KEY (funcvar_fk) REFERENCES functionalvariables(id) "fk6b514a7bc81d711d" FOREIGN KEY (usertemplvaratt_fk) REFERENCES usertemplvarattribute(id) "fk6b514a7bcbbfa8b8" FOREIGN KEY (tag_id) REFERENCES tags(id) Version of postgresql is 9.3 on linux RHEL uname -a Linux 4504DS-SRV-0043.codac.iter.org 2.6.32-431.20.3.el6.x86_64 #1 SMP Fri Jun 6 18:30:54 EDT 2014 x86_64 x86_64 x86_64 GNU/Linux Thanks for your help Lana |