我正在编写一个程序,用于在SQL Server中生成大量(大约20个表中大约10亿条记录)数据量和填充表。这是跨越多个表的数据,可能有多个外键约束,以及多个枚举'像表一样,其值的分布也需要看似随机,并且经常从其他表中引用。这导致了很多ORDER BY NEWID()
类型的代码,这对我来说似乎很慢。
我的问题是:哪种策略会更高效:
使用基于集合的操作和一堆ORDER BY NEWID()
在SQL Server中生成和插入数据以获得随机性
生成客户端上的所有数据(应该更快地从枚举表中选择随机值等操作),然后将数据导入SQL Server
我可以从这两种策略中看到一些积极因素和消极因素。显然,随机数据的生成将更容易,并且可能在客户端中更高效。但是将数据传输到服务器会很慢。否则,导入数据并将其插入基于集合的操作中的规模应该类似。
有没有人做过类似的事情?
答案 0 :(得分:3)
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端生成大量数据量。
答案 1 :(得分:0)
您不需要创建数十亿新品
创建一个包含百万随机的表并多次引用它。如果你随机重复每一百万行,我怀疑一切都会好的。
做一个随机的说明点和增量。使用%on increment循环。
如果您需要值0 - n再次使用%。