查询 1
您应该将abcd 传递到您的子查询中以防止“优化”。
UPDATE dataset1
SET abcd = (SELECT abc
FROM dataset2
WHERE abcd = abcd
ORDER BY random()
LIMIT 1
);
SQL Fiddle
查询 2
下面的查询在普通 PostgreSQL 上应该更快。
UPDATE dataset1
SET abcd = (SELECT abc
FROM dataset2
WHERE abcd = abcd
OFFSET floor(random()*(SELECT COUNT(*) FROM dataset2))
LIMIT 1
);
SQL Fiddle
但是,正如您所报告的,Redshift 并非如此,它是一种列式存储。
查询 3
在单个查询中从dataset2 获取所有记录比逐个获取记录更有效。让我们测试一下:
UPDATE dataset1 original
SET abcd = fake.abc FROM
(SELECT ROW_NUMBER() OVER(ORDER BY random()) AS id, abc FROM dataset2) AS fake
WHERE original.id % (SELECT COUNT(*) FROM dataset2) = fake.id - 1;
SQL Fiddle
注意整数id列应该存在于dataset1中。
此外,对于大于dataset2 中记录数的dataset1.id,abcd 是可预测的。
查询 4
让我们在dataset1 中创建整数fake_id 列,用随机值预填充它并对dataset1.fake_id = dataset2.id 执行连接:
UPDATE dataset1
SET fake_id = floor(random()*(SELECT COUNT(*) FROM dataset2)) + 1;
UPDATE dataset1
SET abcd = abc
FROM dataset2
WHERE dataset1.fake_id = dataset2.id;
SQL Fiddle
查询 5
如果您不想将fake_id 列添加到dataset1,让我们计算fake_id 的“即时”:
UPDATE dataset1
SET abcd = abc
FROM (
SELECT with_fake_id.id, dataset2.abc FROM
(SELECT dataset1.id, floor(RANDOM()*(SELECT COUNT(*) FROM dataset2) + 1) AS fake_id FROM dataset1) AS with_fake_id
JOIN dataset2 ON with_fake_id.fake_id = dataset2.id ) AS joined
WHERE dataset1.id = joined.id;
SQL Fiddle
性能
在普通 PostgreSQL 上,查询 4 似乎是最有效的。
我将尝试在试用 DC1.Large 实例上比较性能。