【发布时间】:2015-11-05 21:54:50
【问题描述】:
在超过 100k 行的表中,如何有效地打乱特定列的值?
表定义:
CREATE TABLE person
(
id integer NOT NULL,
first_name character varying,
last_name character varying,
CONSTRAINT person_pkey PRIMARY KEY (id)
)
为了匿名数据,我必须就地对“first_name”列的值进行洗牌(我不允许创建新表)。
我的尝试:
with
first_names as (
select row_number() over (order by random()),
first_name as new_first_name
from person
),
ids as (
select row_number() over (order by random()),
id as ref_id
from person
)
update person
set first_name = new_first_name
from first_names, ids
where id = ref_id;
需要几个小时才能完成。
有没有有效的方法?
【问题讨论】:
-
您的两个 CTE 并没有真正随机化数据。你只是生成随机的“行号”,但你不使用它们。如果您省略
row_number()调用,它不会有任何不同。您还在两个 CTE 和person表之间进行交叉连接,这意味着您的语句会生成 100.000 * 100.000 * 100.000 行的中间结果。 -
stackoverflow.com/a/3100232/3574819 可能有助于加快更新速度
标签: sql performance postgresql shuffle