Re: approve VKPts5 unsubscribe pgsql - Mailing list pgsql-sql
From | Alexey V. Meledin |
---|---|
Subject | Re: approve VKPts5 unsubscribe pgsql |
Date | |
Msg-id | 3658.000403@webclub.ru Whole thread Raw |
In response to | approve VKPts5 unsubscribe pgsql (tszczachor@zke.com.pl (Tomasz Szcząchor)) |
Responses |
Re: planner complaints (was approve VKPts5 unsubscribe pgsql)
|
List | pgsql-sql |
Hi! 1. I have: vladimir=> explain SELECT acc.ifs_account_id FROM vladimir-> ifs_account acc, vladimir-> ifs_tree_default def, vladimir-> ifs_account_tree_data atd vladimir-> WHERE vladimir-> acc.ifs_status_id = 12 vladimir-> AND atd.ifs_tree_id IN(14,26) vladimir-> AND def.ifs_tree_default_id IN(587,175) vladimir-> AND atd.ifs_account_id = acc.ifs_account_id vladimir-> AND atd.ifs_data_id = def.ifs_data_id; NOTICE: QUERY PLAN: Nested Loop (cost=0.00 rows=1 width=16) -> Seq Scan on ifs_account acc (cost=0.00 rows=0 width=4) -> Seq Scan (cost=757.02rows=1 width=12) (**) -> ??? (cost=757.02 rows=1 width=12) -> Hash Join (cost=757.02 rows=1 width=12) -> Seq Scan on ifs_account_tree_data atd (cost=751.76 rows=3 width=8 ) -> Hash (cost=4.07 rows=3 width=4) -> Index Scan using xpkifs_tree_default,xpkifs_tree_default onifs_tree_default def (cost=4.07 rows=3 width=4) What mean "???" at (**). There is no index? Or unknown method? 2. Seq Scan - Sequential Scan - this mean FULL TABLE SCAN (DATA SCAN)? 3. I try to play with indeces on this tables 3.1. Setting all btree indeces explain SELECT acc.ifs_account_id FROM ifs_account acc, ifs_tree_default def, ifs_account_tree_data atd WHERE acc.ifs_status_id = 12 AND atd.ifs_tree_id IN(14,26) AND def.ifs_tree_default_id IN(587,175) AND atd.ifs_account_id = acc.ifs_account_id AND atd.ifs_data_id = def.ifs_data_id; Nested Loop (cost=0.00 rows=1 width=16) -> Nested Loop (cost=0.00 rows=1 width=12) -> Seq Scan on ifs_tree_defaultdef (cost=0.00 rows=0 width=4) -> Seq Scan on ifs_account_tree_data atd (cost=0.00 rows=0 width=8)-> Seq Scan on ifs_account acc (cost=0.00 rows=0 width=4) Not optimal way I think 2. I've replace btree indexes on relation AND atd.ifs_data_id = def.ifs_data_id; with: create index itd_hash_data_id on ifs_tree_default USING HASH (ifs_data_id); create index iatd_hash_data_id on ifs_account_tree_data USING HASH (ifs_data_id); PS: Can't replace on on ifs_account_id because of PRIMARY KEY (may be direct Alternative Entry helps me, but is it right way to optimize?) so: Nested Loop (cost=0.00 rows=1 width=16) -> Seq Scan on ifs_account acc (cost=0.00 rows=0 width=4) -> Seq Scan (cost=10.17rows=1 width=12) -> ??? (cost=10.17 rows=1 width=12) -> Nested Loop (cost=10.17 rows=1 width=12) -> Index Scan using xpkifs_tree_default, xpkifs_tree_default on ifs_tree_default def (cost=4.07 ows=3 width=4) -> Index Scan using xif588ifs_account_tree_data on ifs_account_tree_d ata atd (cost=2.03 rows=3 width=8) 3. I've delete all indexes on AND atd.ifs_data_id = def.ifs_data_id; Then I've got: Nested Loop (cost=0.00 rows=1 width=16) -> Seq Scan on ifs_account acc (cost=0.00 rows=0 width=4) -> Seq Scan (cost=757.02rows=1 width=12) -> ??? (cost=757.02 rows=1 width=12) -> Hash Join (cost=757.02 rows=1width=12) -> Seq Scan on ifs_account_tree_data atd (cost=751.76 rows=3 width=8 ) -> Hash (cost=4.07 rows=3 width=4) -> Index Scan using xpkifs_tree_default,xpkifs_tree_default onifs_tree_default def (cost=4.07 rows=3 width=4) Hash Join appears. But there is no indexes, so "Table Scan" appears (approximately 18000 rows in ifs_account_tree_data)? BAD!?! So, where is the optimal way? To make separate queries and use temporary tables to decrease JOINs? Regards, Alexey V. Meledin InterForge Developers Group, Saint-Petersburg look_to: <www.etcompany.ru><www.businessweb.ru> <www.inplan.spb.ru><www.pia.ru>>>>>>>>>>>>>>>>> mail_to: <avm@webclub.ru><nick_as: <cureman>>>>