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 ) - 計數值在這裏
據我所知,'text_pattern_ops'不應該被視爲在這種特殊情況下的性能提升。相反,它會降低UPDATE語句的速度。 – 2014-10-02 20:21:22
感謝@nobodynoone 我已重新索引而不 - >散列連接(成本= 99.59..1044897.45行= 20820483寬度= 75) 指數沒有text_pattern_ops是對所述查詢的影響不大的成本 – hackg 2014-10-02 20:57:58
@Craig林格氏 我試過這2個設置關閉,甚至仍然不會使用索引。這表明你的建議是「沒有證據表明索引會幫助這個查詢」,並且規劃者不會訴諸於使用索引。謝謝你解決我的困惑。它的確在處理所有20密耳的行 – hackg 2014-10-03 20:38:11