天天看點

PostgreSQL 巧妙的資料采樣方法

因為線上資料庫較大,通常我們可以通過資料采樣來建構測試庫。

資料采樣除了需要對資料進行均勻的抽取之外,還可能有一種需求是對資料進行加密,例如需要隐藏或加密一些敏感字段的資訊。

postgresql 9.5開始支援tablesample的文法,參考如下

<a href="https://www.postgresql.org/docs/9.6/static/tablesample-method.html">https://www.postgresql.org/docs/9.6/static/tablesample-method.html</a>

<a href="https://www.postgresql.org/docs/9.6/static/sql-select.html">https://www.postgresql.org/docs/9.6/static/sql-select.html</a>

如果是以前的版本,則可以通過自定義函數來實作資料的采樣。

9.5以前的postgresql,通過函數達到采樣目的。

1. 指定schema, tablename, 需要采樣的記錄數, 采樣的離散度,傳回符合要求的采樣記錄。

離散度取值範圍0-100,可以了解為資料采樣的覆寫範圍。

代碼如下

因為用到了統計資訊relpages和reltuples評估機率,是以表要有統計資訊,通常pg會自動收集,不需要人工幹預,隻要打開了autovacuum即可。

測試

在全表範圍随機采樣10條記錄

在20%的範圍随機采樣10條記錄

在1%的範圍随機采樣10條記錄

離散達到目的,性能也達到目的。

接下來把ctid去掉即可。

結果如下

<a href="http://info.flagcounter.com/h9v1">count</a>

繼續閱讀