2016-03-06 74 views
0

使用的是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條記錄。

我有以下查詢,colsselect太多和太醜陋了,所以我長話短說:

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 = 2set work_mem = '2048MB'可以有任何效果:計劃和時間保持不變。

我看到一些文章說位圖索引掃描可以做得更好,但我不知道如何創建這樣的索引:看起來postgres是決定是否應該在查詢時產生的東西的人。

其他信息:

關於資源使用:

查詢只需要一個邏輯核心的工作,我有足夠的內存(32GiB,當數據庫大小< 6GiB)

+0

'炭()&VARCHAR()&浮子,已聚集B樹索引'不是你表的可讀描述。請添加真實的DDL。 – wildplasser

回答

2

沒有索引會此查詢使用,因爲public.a所有7M行正在使用的查詢。只有當你做出更嚴格的過濾,使得public.a行的只有一小部分是必要的,運行查詢,你會看到該指數被使用。

如果你看一下查詢的實際運行時間,你會注意到,順序掃描只需要不到1秒(967.771毫秒,要準確),而加入佔據了約48秒。上日期炭(11)