我们有一个.NET(C#)应用程序,每秒向Sql Server数据库执行大约10-30个插入命令。在设计应用程序时,执行插入的应用程序与Sql Server数据库在现场,因此没有真正考虑网络延迟。
至少网络延迟就像你通过广域网或互联网一样没有被考虑在内。
应用程序按顺序执行这些插入。因此,如果10-30次插入超过1秒,则应用程序开始落后。我们所采用的缓冲系统只处理网络延迟中的偶然“打嗝”,假设网络延迟最终会消失,应用程序将有机会赶上。
如果网络延迟一直足够高,10-30次插入总是需要一秒钟,那么应用程序就会变得无法使用。
为了这个问题,让我们假设我们无法做任何事情来减少网络延迟,或者增加sql server性能,或类似的东西,并且10-30插入命令总是会采取超过1秒,导致应用程序落后于故障点。
在.NET或Sql Server本身是否有一种很好的方法可以并行执行这些命令,以便利用带宽来弥补延迟?
我意识到我们可以编写自己的系统来处理所有这些,但看起来它已经成为云数据库服务器的常见问题。
我已经阅读了关于批处理和利用事务在管道上一次发送更多命令的内容,但即使这样做,如果网络延迟足够高,它似乎最终还会出现问题。
我们希望应用程序能够容忍更高和更高的延迟,但也不会在插入上落后太多。
答案 0 :(得分:0)
有两种技术可供您考虑使用。
<强>配料强>
将所有插入放入一个SQLCommand。
string sql = "insert into a (...) values (...);insert into a (...) values (...);.....";
这必须动态构建,除非预先清理这些值,否则应使用参数而不是将值嵌入到sql中。这将通过网络在一次旅行中完成所有插入,从而最大限度地减少延迟。 但是,如果要插入的数据跨越多个表,它们之间具有FK关系,并且子项中的FK是新插入的父表中的IDENTITY列,那么这将无法正常工作。但是,一切都不会丢失。
使用批处理加SP的暂存表
创建一组包含您必须插入的数据的表,但不包括最终表中可能实际存在的任何FK关系。批量插入以将数据插入到临时表中,然后调用SP,该SP可以将数据从登台表移动到最终表中,同时保留它们之间的关系。这可以让你进行两次网络往返,而不是10到30,这应该会有所帮助。