В таблице с строками> 100 тыс., Как я могу эффективно перетасовать значения определенного столбца?Столбец столбца PostgreSQL
определение Таблицы:
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 строк. –
http: // stackoverflow.com/a/3100232/3574819 может помочь сделать обновления быстрее – FuzzyTree