用虚拟数据填充SQL表的最快方法是什么?
我有一个包含大约40个不同类型字段(int,bit,varchar等)的宽表,需要进行一些性能测试。我正在使用SQL Server 2008。
谢谢!
答案 0 :(得分:41)
推荐免费的GNU许可随机自定义数据生成器http://www.generatedata.com/
答案 1 :(得分:18)
答案 2 :(得分:10)
迟到的答案但对此线程的其他读者可能有用。 除了其他解决方案,我建议使用SSMS或自定义SQL导入脚本程序从.csv文件导入数据。有关如何执行此操作的分步教程,因此您可能需要查看它:http://solutioncenter.apexsql.com/how-to-generate-randomized-test-data-from-a-csv-file/
请注意,使用SSMS或自定义SQL导入脚本导入.csv文件比手动创建SQL插入更容易,但是存在一些限制,如教程中所述:
如果需要填充数千行,并且.csv文件包含几百行数据,那还不够。解决方法是反复重新导入相同的.csv文件,直到需要为止。这种方法的缺点是它会插入具有相同数据的大块行,而不会随机化它们。
本教程还介绍了如何使用名为ApexSQL Generate的第三方SQL数据生成器。该工具具有集成功能,可从导入的.csv格式文件生成大量随机数据。应用程序具有功能齐全的免费试用版,因此您可以下载并试用它以查看它是否适合您。
答案 3 :(得分:3)
您在INSERT之后只需要Go 1000
,填写1000次,就像这样:
INSERT INTO dbo.Cusomers(Id, FirstName, LastName) VALUES(1, 'Mohamed', 'Mousavi')
GO 1000
它将创建一个包含1000个相同行的表。另一种解决方案是,您可以使用一些数据填充表格的第一行,然后通过反复重复第一行来填充下一行表格,这意味着您自己填充表格:
INSERT INTO dbo.Customers
SELECT * FROM dbo.Customers
GO 10
如果一个或多个列是标识(意味着它们接受唯一值,如果它是自动增量的),则只是不将它放在查询中,例如,如果dbo.Customer中的Id是标识,则查询进行像这样:
INSERT INTO dbo.Customers
SELECT FirstName, Last Name FROM dbo.Customers
GO 10
取代:
INSERT INTO dbo.Customers
SELECT Id, FirstName, Last Name FROM dbo.Customers
GO 10
否则你会遇到这个错误:
An explicit value for the identity column in table 'dbo.Customers' can only be specified when a column list is used and IDENTITY_INSERT is ON.
注意:
这是一种算术级数,所以它会持续一点,不要在GO
前使用大数字。
如果你想要一个更精细的表格,那么你可以通过执行一个简单的查询并按照以下步骤以相同的方式实现:
选择一个行数非常多的表,例如dbo.Customers
右键单击它并选择Script Table as > Create To > New Query Editor Window
将您的新表命名为dbo.CustomersTest,现在您可以执行查询以获得与dbo.Customers具有相似结构的新表。
注意:请记住,如果它有一个标识字段,请更改它Identity Specification to No
因为您应该重复填充原始数据的新表。
INSERT INTO [dbo].[CustomersTest]
SELECT * FROM [dbo].[Customers]
GO 1000
正如@SQLMenace所提到的,RedGate数据生成器是一个很好的工具来实现它,它需要369美元,你有14天的试用机会虽然。
好的一点是,RedGate会识别外键,因此您可以在查询中应用JOIN。
你有很多选项可以让你决定如何填充每一列,每个列都是在语义上预期的,以便建议相关的数据,例如,如果你有一个名为'Department'的列,它不是由奇怪的字符填充,它由“技术”,“Web”,“客户”等表达式填充。甚至您可以使用正则表达式来限制所选字符。
我用超过10,000,000条记录填充了我的表格,这是一个非常棒的模拟。