2

我有一个正在运行的服务,它可以转换数据并将转换后的(几百万行)数据写入 SQL Server。前端从这些表中读取。

自然,我们的目标是尽可能快地写入这些数据,但不牺牲读取性能。

我目前的方法是编写单独的行,一次一个服务器调用。这似乎最大限度地减少了锁定,但写入速度并不是最佳的。不受限制,我们可能达到每秒几千行。

我也尝试批量加载数据,但我遇到了死锁和超时。我假设这是由于插入/更新时的锁升级(我将提交分批成 256 行)。

关于在不牺牲读取性能的情况下更快地将记录提交到数据库的任何想法?

一些细节:

  • 转换后的数据驻留在许多不同的表中,所有表都编入索引以最大限度地提高读取性能。
  • 我使用一个持续打开的连接来写入数据。
4

1 回答 1

1

这假设您使用的是 SQL Server 2008+,但如果您使用的是,那么我会考虑使用接受表值参数的存储过程。然后,您可以使用所需的任何批处理大小调用该过程,并且锁定只会在插入这些行所花费的时间内保留。当您运行批量复制时,在复制期间会保留锁定,因此更改批量大小不会对锁定持续时间产生重大影响(当然,更改整体批量复制时间除外) .

我写了一篇带有帮助类的博客文章,用于在此处轻松地将数据作为 TVP 提交。您可以在此处阅读 MSDN 上有关使用 TVP 参数创建程序的信息。也值得一读 Bob B 的博客文章,这些文章在这里这里(也在我的博客文章中引用)。

于 2012-11-16T13:55:13.973 回答