我在aws postgresql中有一个表,按date_col
分区,但索引在address
上。
我有一个查询,要列出给定address
和event_name
的所有项目
似乎没有全局辅助索引,因此每个查询将涉及所有分区。
如何改进查询?可以并行运行查询(借助分区键)?是否可以在gorm中执行此操作?
谢啦,谢啦
例如explain select * from tbl where address = '0x5564' and event_name = 'Change';
的输出为
-> Bitmap Heap Scan on tbl_2016 abl_2 (cost=37.86..41.86 rows=1 width=1087)
Recheck Cond: (((address)::text = '0x5564'::text) AND ((event_name)::text = 'Change'::text))
-> BitmapAnd (cost=37.86..37.86 rows=1 width=0)
-> Bitmap Index Scan on tbl_2016_address_idx (cost=0.00..4.06 rows=227 width=0)
Index Cond: ((address)::text = '0x5564'::text)
-> Bitmap Index Scan on abl_2016_event_decoded_idx (cost=0.00..33.79 rows=8874 width=0)
Index Cond: ((event)::text = 'Change'::text)
-> Bitmap Heap Scan on tbl_2017_01_01 tbl_3 (cost=4.01..11.80 rows=1 width=906)
Recheck Cond: ((address)::text = '0x5564'::text)
Filter: ((event)::text = 'Change'::text)
-> Bitmap Index Scan on tbl_2017_01_01_address_idx (cost=0.00..4.01 rows=2 width=0)
Index Cond: ((address)::text = '0x5564'::text)
-> Index Scan using tbl_2017_01_02_address_idx on tbl_2017_01_02 logs_4 (cost=0.01..8.01 rows=1 width=913)
Index Cond: ((address)::text = '0x5564'::text)
Filter: ((event)::text = 'Change'::text)
...
字符串
从解释计划看,查询似乎正在查询所有分区,但正在尝试使用每个分区上的索引...
我的问题是,有可能通过分区的帮助使查询并行运行。我应该在gorm中手动操作吗?
谢啦,谢啦
1条答案
按热度按时间hts6caw31#
并行查询和分区几乎是不相关的。事实上,分区可能会降低并行查询的效率。如果你想鼓励并行查询,你可以将parallel_*_cost设置为零。当然,这样做会鼓励并行查询,即使它会适得其反。
如果你想同时读取多个页面,增加effective_io_concurrency可能是一个更好的选择。