2012-02-22 69 views
0

我有一個大表(2M +記錄載入列)。我打算爲重複數據刪除目的做一個GROUP BY。我想知道以下兩種策略中的哪一種會更好?在Postgres中GROUP BY的性能

  1. GROUP BY多個列(爲col_a,col_b,col_c)
  2. 添加新列dedup_col包括使用爲col_a,col_b,col_c形成歸一化的串,然後執行GROUP BY上dedup_col。預先填充dedup_col。

我知道我可以運行基準測試,但我希望在開始實施之前進行一些理論性的輸入。

回答

3

對於上帝的愛,請選擇1.不要訴諸#2,除非你有#1認真的表現選擇,並且你已經用盡了所有其他選項(包括索引)來解決它。

選項#2是一個可怕的想法。實際上,你正在通過實施一個窮人的索引版本來重塑輪胎......糟透了。

從來沒有,永遠,去規範化(這就是你正在做的選項2)你的數據的性能,直到你確定了性能問題。即使那樣,你可能不應該這樣做。

僅供參考:如果您的索引設置正確,則2百萬條記錄不是一個大數據庫。

3

我會對各種查詢運行EXPLAIN PLAN來比較成本。這比任何你在這裏得到的理論答案都要有價值。讓PostgreSQL告訴你它會做什麼。

0

我通常最終使用的方法是使用ctid密鑰。例如:

delete from yourtable 
where ctid not in (
SELECT MAX(dt.ctid) 
FROM yourtable As dt 
GROUP BY dt.col_a, dt.col_b, dt.col_c); 

但也有許多其他的選擇...很多取決於表,索引的數量,等等...刪除可能是昂貴的,雖然因爲我也有實例哪裏最好從選擇的唯一行創建一個新表,然後刪除orignal表並重命名新的表以獲得原始名稱。

+0

另外,請查看:http://www.postgresonline.com/journal/archives/22-Deleting-Duplicate-Records-in-a-Table.html – 2012-02-22 03:36:38