批量插入数据到SQL Server数据库以进行负载测试的最佳/最快方法是什么?

3

我刚刚写了一些东西用于将10000行数据插入到一个表中以进行负载测试。

每行数据都是相同且无趣的。

我是这样做的:

DECLARE @i int = 0
WHILE @i < 10000 BEGIN
    exec blah.CreateBasicRow ;
    SET @i = @i + 1
END

所有的基础行创建只是用有效的内容填充非空列。

结果发现这非常慢,有时甚至会卡住!那么我有什么其他选择?编写一些内容来生成一个具有更少插入语句的重复数据的长文件是否更好?还有其他选项吗?

更新

限制条件是必须以 sqlcmd 可处理的形式呈现 - 我们的数据库版本控制过程会生成要由 sqlcmd 运行的 SQL 文件。因此,我可以使用不同形式的数据生成补丁文件,但不能使用其他工具插入数据。


1
@KrishnrajRana 我并不认为是这样的。那个人试图从C#中实现它。我会更新我的问题... - JonnyRaa
1个回答

2

您可以通过在循环周围包装事务来加速此特定代码。这样,SQL Server就不必在每次迭代时将日志硬化到磁盘上(可能会多次,具体取决于您在该过程中发出DML语句的频率)。

话虽如此,最快的方法是一次性插入所有记录。类似于

insert into Target
select someComputedColumns
from Numbers n
WHERE n.ID <= 10000

对于典型情况,这应该在1秒内执行。但是它会破坏使用该过程的封装。


只是将其包装在事务中似乎有很大帮助。我不确定我是否理解了您的其他建议 - 数字实际上需要包含数据还是其他东西? - JonnyRaa
我应该详细说明一下。Numbers是一个典型的数字表,包含至少10k行。这只是为了方便。主要目的是生成并一次性插入所有内容,以便查询优化器可以完全优化此算法。 - usr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接