Sql server 平衡SQL Server写性能和读性能所需的输入

Sql server 平衡SQL Server写性能和读性能所需的输入,sql-server,Sql Server,我有一个正在运行的服务,它转换数据并将转换后的(几百万行)数据写入SQL Server。前端从这些表中读取数据 当然,我们有一个雄心壮志,就是在不牺牲读取性能的情况下,尽可能快地写入这些数据 我目前的方法是编写单独的行,一次一个服务器调用。这似乎可以最小化锁定,但写入速度不是最佳的。不受限制的情况下,我们可以达到每秒数千行的速度 我还尝试批量加载数据,但遇到死锁和超时。我假设这是由于插入/更新时的锁升级(我将提交分为256行) 有什么想法可以更快地将记录提交到数据库而不牺牲读取性能 一些细节:

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

当然,我们有一个雄心壮志,就是在不牺牲读取性能的情况下,尽可能快地写入这些数据

我目前的方法是编写单独的行,一次一个服务器调用。这似乎可以最小化锁定,但写入速度不是最佳的。不受限制的情况下,我们可以达到每秒数千行的速度

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

有什么想法可以更快地将记录提交到数据库而不牺牲读取性能

一些细节:

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

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

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