研究目的(サードパーティのデータ科学者コミュニティグループへのアウトソーシングなど)では、特定の機密フィールド(顧客名、電話番号、住所など)をマスクしてプロダクションデータベースをエクスポートする必要があります。dbテーブルのフィールドを匿名化および消毒する最速の方法は?
このorder_requests
テーブルのプロダクションデータベースには約5億行があるので、フィールドnickname
をnickname_transformed
にマスクしたいと思います。どうすれば速くできますか?
order_requests
テーブル構造:dblink
と
┌──────────────────┬─────────────────────────────┬────────────────────┐
│ Column │ Type │Modifiers │
├──────────────────┼─────────────────────────────┼────────────────────┤
│ id │ integer │ not null default │
│ │ nextval('order_requests_id_seq'::regclass)│
│ vehicle_cd │ integer │ │
│ nickname │ character varying(255) │ │
│ phone_number │ character varying(255) │ │
│ pickup_time │ timestamp without time zone │ │
... 20+ fields more ...
└──────────────────┴─────────────────────────────┴────────────────────┘
Indexes:
"order_requests_pkey" PRIMARY KEY, btree (id)
... 15+ indexes more ...
Foreign-key constraints:
... 7 foreign keys ...
Referenced by:
... 25+ references more ...
私の現在の実装(完了するために6時間、DB上のCPUのみ< 10%一方、スタンドアロンDBのみ自分自身を使用):
CREATE EXTENSION dblink;
ALTER TABLE
order_requests ADD nickname_transformed VARCHAR;
ALTER TABLE order_requests DISABLE TRIGGER USER;
CREATE OR REPLACE FUNCTION f_update_in_steps()
RETURNS void AS
$func$
DECLARE
_step int; -- size of step
_cur int; -- current ID (starting with minimum)
_max int; -- maximum ID
BEGIN
SELECT INTO _cur, _max min(id), max(id) FROM order_requests;
-- 100 slices (steps) hard coded
_step := ((_max - _cur)/1000) + 1; -- rounded, possibly a bit too small
-- +1 to avoid endless loop for 0
PERFORM dblink_connect('postgres://username:[email protected]:5432/dbname'); -- your foreign server as instructed above
FOR i IN 0..2000 LOOP -- 2000 >> 1000 to make sure we exceed _max
PERFORM dblink_exec(
$$UPDATE order_requests
SET nickname_transformed = md5(nickname)
WHERE id >= $$ || _cur || $$
AND id < $$ || _cur + _step || $$
AND true$$); -- avoid empty update
_cur := _cur + _step;
EXIT WHEN _cur > _max; -- stop when done (never loop till 200)
END LOOP;
PERFORM dblink_disconnect();
END
$func$ LANGUAGE plpgsql;
一部私の考えでの質問:
- クローン
id
、nickname
フィールド+空nickname_transformed
フィールドだけを持つ別のテーブルを作成した場合、そこに私の操作をしてくださいコピー戻るnickname_transformed
? - このarticleは、結果を達成するためにより複雑な方法を述べました。このための固体コードの例はありますか?
- What is the fastest way to apply 150M updates on PostgreSQL table
- How do I do large non-blocking updates in PostgreSQL?
ピュア機能/クエリです:それぞれの業務に
dblink
接続とリンクを管理する方法のようなもの、notify
など
はこれを読みましたこのジョブを1〜2ヶ月ごとにやり直さなければならないので好ましい。
を試してみましたこれです。クエリをありがとうが、まだ遅いです。 –