2
UPDATE 
npi_bn 
SET 
    count = npi_bn_count.count 
FROM 
    npi_bn_count 
WHERE 
    npi_bn.bn = npi_bn_count.bn 

問題:此更新查詢不使用我的索引(20萬行慢得令人難以置信)。其相當直接的文本連接和兩個表中的兩個字段都被編入索引。我怎樣才能讓規劃師使用我的索引?更新從表 - 不使用索引(PG 9.1)

EXPLAIN 
Update on npi_bn (cost=99.59..1045037.73 rows=20826256 width=75) 
    -> Hash Join (cost=99.59..1045037.73 rows=20826256 width=75) 
     Hash Cond: (npi_bn.bn = npi_bn_count.bn) 
     -> Seq Scan on npi_bn (cost=0.00..706474.20 rows=20832220 width=65) 
     -> Hash (cost=55.93..55.93 rows=3493 width=22) 
       -> Seq Scan on npi_bn_count (cost=0.00..55.93 rows=3493 width=22) 

曾嘗試:我已重建索引幾次,有/無text_pattern_ops跑分析

INFO:Postgres的9.1(64位)我與文本值的表中出現多次,我將這些值計算在內(多少次出現)並存儲在另一個表中。我想用計數值更新主表,所以每次看到數列中的值「ABC」時,它會列出它出現在表

索引次數:

CREATE INDEX idx_npi_bn_name 
    ON npi_bn 
    USING btree (bn text_pattern_ops); 

CREATE INDEX idx_npi_bn_count_name 
    ON npi_bn_count 
    USING btree (bn text_pattern_ops); 

實施例DATA:

╔════╦══════════════╦══════╗ 
║ ID ║ bn (text) ║ count║ 
╠════╬══════════════╬══════╣ 
║ 1 ║ abc   ║ 2 ║ 
║ 2 ║ efg   ║ 1 ║ 
║ 3 ║ abc   ║ 2 ║ 
║ 4 ║ xyz   ║ 1 ║ 
╚════╩══════════════╩══════╝ 

主表= npi_bn

  • ID(INT)
  • BN(文本) - 很多重複
  • 計數(INT) - 場我想更新

COUNTS存儲在表格= npi_bn_count

  • 億元(文本)
  • 計數(INT ) - 計數值在這裏
+0

據我所知,'text_pattern_ops'不應該被視爲在這種特殊情況下的性能提升。相反,它會降低UPDATE語句的速度。 – 2014-10-02 20:21:22

+0

感謝@nobodynoone 我已重新索引而不 - >散列連接(成本= 99.59..1044897.45行= 20820483寬度= 75) 指數沒有text_pattern_ops是對所述查詢的影響不大的成本 – hackg 2014-10-02 20:57:58

+0

@Craig林格氏 我試過這2個設置關閉,甚至仍然不會使用索引。這表明你的建議是「沒有證據表明索引會幫助這個查詢」,並且規劃者不會訴諸於使用索引。謝謝你解決我的困惑。它的確在處理所有20密耳的行 – hackg 2014-10-03 20:38:11

回答

3

沒有證據表明索引可以幫助查詢。

您正在閱讀和處理所有行。散列連接或合併連接可能會更快。

如果你想比較,嘗試(用於測試目的)的設置:

enable_hashjoin = off 
enable_mergejoin = off 

它可能會然後用你的指數(ES),如果他們是合適的......而且會更慢。

如果速度更快,那麼您的random_page_cost可能並不反映機器的實際性能,應該低得多。