Performance 如何在postgresql上执行快速连接
在ubuntu-15.10上使用postgres-9.4 对索引列上的两个表执行联接并获取Performance 如何在postgresql上执行快速连接,performance,postgresql,Performance,Postgresql,在ubuntu-15.10上使用postgres-9.4 对索引列上的两个表执行联接并获取Seq Scan 表a:~700万行,包含char()&varchar()&float,在date char(11)上有聚集的b树索引。每个日期1~2500行 表b:~6k行,包含2列date char(11)和feature float[]在date char(11)上也有聚集的b树索引。每个日期只有一条记录 我有以下查询,select中的cols太多太难看,因此我将其缩短: SELECT 6 reg
Seq Scan
表a
:~700万行,包含char()&varchar()&float
,在date char(11)
上有聚集的b树索引。每个日期1~2500行
表b
:~6k行,包含2列date char(11)和feature float[]
在date char(11)
上也有聚集的b树索引。每个日期只有一条记录
我有以下查询,select
中的cols
太多太难看,因此我将其缩短:
SELECT
6 regexp_split_to_array(a.char_cols),
ARRAY[ a.all_float] || b.feature
FROM
a JOIN b ON
a.date = b.date;
大约需要50000ms,使用EXPLAIN-ANALYZE-VERBOSE
我得到以下结果:
QUERY PLAN
-----------------------------------------------------------------------------
Hash Join (cost=501.67..790703.48 rows=7154354 width=856) (actual time=3.216..49223.885 rows=7154589 loops=1)
Output: A_LOT_MESS
Hash Cond: (a.date = b.date)
-> Seq Scan on public.a (cost=0.00..521913.54 rows=7154354 width=440) (actual time=0.001..967.771 rows=7154589 loops=1)
Output: EVERY_COLS_OF_A
-> Hash (cost=424.63..424.63 rows=6163 width=428) (actual time=3.157..3.157 rows=6163 loops=1)
Output: b.feature, b.date
Buckets: 1024 Batches: 1 Memory Usage: 2769kB
-> Seq Scan on public.b (cost=0.00..424.63 rows=6163 width=428) (actual time=0.003..1.156 rows=6163 loops=1)
Output: b.feature, b.date
Planning time: 1.041 ms
Execution time: 49396.419 ms
(12 rows)
我试着从
但无论是set random\u page\u cost=2,还是set work\u mem='2048MB'
都不会产生任何影响:计划和时间保持不变
我看到一些文章说位图索引扫描可以做得更好,但我不知道如何创建这样的索引:似乎是postgres决定在查询某些内容时是否应该生成它
其他信息:
关于资源使用:
查询只需要一个逻辑核就可以工作,而且我有足够的内存(32GiB,当数据库大小时,此查询将不使用索引,因为查询正在使用所有700万行public.a
。只有当您进行更严格的筛选,以便运行查询时只需要public.a
中的一小部分行时,您才会看到索引被使用
如果查看查询的实际运行时间,您会注意到顺序扫描所需时间不到1秒(准确地说是967.771毫秒)而联接大约需要48秒。此查询将不使用索引,因为查询正在使用所有700万行的public.a
。只有当您进行更严格的筛选,以便只有public.a
中的一小部分行需要运行查询时,您才会看到索引被使用
如果查看查询的实际运行时间,您会注意到顺序扫描所需时间不到1秒(精确地说是967.771毫秒),而连接所需时间约为48秒。char()&varchar()&float,在date char(11)上具有聚集的b树索引
不是表的可读描述。请添加真实的DDL。char()&varchar()&float,在日期char(11)上具有聚集b树索引。
不是表的可读描述。请添加真实的DDL。