4

我正在编写一个程序来生成海量(约 10 亿条记录,分布在约 20 个表中)的数据量并填充 SQL Server 中的表。这是跨越多个表的数据,可能具有多个外键约束,以及多个类似“枚举”的表,其值的分布也需要看似随机,并且经常从其他表中引用。这导致了很多ORDER BY NEWID()类型代码,这对我来说似乎很慢。

我的问题是:哪种策略会更高效:

  1. 在 SQL Server 中生成和插入数据,使用基于集合的操作和一堆ORDER BY NEWID()来获得随机性

  2. 在客户端生成所有数据(应该使从枚举表中选择随机值等操作更快),然后将数据导入 SQL Server

我可以从这两种策略中看到一些积极和消极的一面。显然,随机数据的生成在客户端会更容易并且可能更高效。但是,将该数据发送到服务器会很慢。否则,导入数据并将其插入基于集合的操作中的规模应该相似。

有没有人做过类似的事情?

4

2 回答 2

4

ORDER BY NEWID(),正如其他成员所说,可能是极其昂贵的操作。在 SQL Server 中获取随机数据还有其他更快的方法:

SELECT * FROM StackOverflow.dbo.Users TABLESAMPLE (.01 PERCENT);

或者

DECLARE @row bigint=(
SELECT RAND(CHECKSUM(NEWID()))*SUM([rows]) FROM sys.partitions
WHERE index_id IN (0, 1) AND [object_id]=OBJECT_ID(‘dbo.thetable’));

SELECT *
FROM dbo.thetable
ORDER BY (SELECT NULL)
OFFSET @row ROWS FETCH NEXT 1 ROWS ONLY;

归功于 Brent Ozar 和他最近的博客文章:https ://www.brentozar.com/archive/2018/03/get-random-row-large-table/

我会选择在 RDBMS 端生成海量数据量..

于 2018-03-27T20:59:53.750 回答
0

你不需要创建数十亿的 newid

创建一个具有一百万个随机数的表并多次引用它。如果您每百万行随机重复一次,我怀疑一切都会好起来的。

做一个随机的陈述点和增量。使用 % on increment 循环。

如果您需要值 0 - n 再次使用 %。

于 2018-03-27T22:06:50.027 回答