使用的是Postgres-9.4 Ubuntu的15.10如何執行快速加入PostgreSQL的
表演加入對索引列兩個表,並得到Seq Scan
表a
:約7個百萬行,包含char()&varchar()&float
,已經聚集b樹索引上date char(11)
。每日約1〜2500行。
表b
:〜6k行,包含2列date char(11) and feature float[]
在date char(11)
上也有聚集的b-tree索引。每個日期只有1條記錄。
我有以下查詢,cols
在select
太多和太醜陋了,所以我長話短說:
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)
我試過PostgreSQL query runs faster with index scan, but engine chooses hash join,
的建議,但set random_page_cost = 2
和set work_mem = '2048MB'
可以有任何效果:計劃和時間保持不變。
我看到一些文章說位圖索引掃描可以做得更好,但我不知道如何創建這樣的索引:看起來postgres是決定是否應該在查詢時產生的東西的人。
其他信息:
關於資源使用:
查詢只需要一個邏輯核心的工作,我有足夠的內存(32GiB,當數據庫大小< 6GiB)
'炭()&VARCHAR()&浮子,已聚集B樹索引'不是你表的可讀描述。請添加真實的DDL。 – wildplasser