默认网络数据包大小的差异:SqlConnection 与 SQL Server 默认值

Posted

技术标签:

【中文标题】默认网络数据包大小的差异:SqlConnection 与 SQL Server 默认值【英文标题】:Differences in Default Network Packet Size: SqlConnection vs. SQL Server defaults 【发布时间】:2015-05-12 01:49:13 【问题描述】:

我昨天注意到 .NET 的 SqlConnection 类中的默认网络数据包大小与 SQL Server 本身的默认值之间存在显着差异。

对于SqlConnection 类的PacketSize 属性,根据this link:

网络数据包的大小(以字节为单位)。默认值为 8000。

在那篇文章的先前版本中,它提到(一直追溯到 .NET 1.1)默认值为 8192 字节。但是,对于 SQL Server(根据 this link):

默认数据包大小为 4,096 字节。

从那篇文章看来,至少从 SQL Server 2005 开始,这就是默认设置。有人知道它们之间存在这种差异的原因吗?

更新:为了给这个问题增添更多乐趣,我一直在与Thomas LaRock(他恰好是 SQL MVP)交谈,他向我提到,在 SQL Server 2000 中,默认网络数据包大小为事实上,8192 字节(如 .NET 1.1!)。但是,它在后来的版本中发生了变化,因为它造成了多少碎片,需要每周重新启动服务器。

那么为什么 SQL Server 减少了一半,而 .NET 只减少了 192 字节呢?是否有什么东西迫使 SQL Server 为此只使用 2 的倍数?

【问题讨论】:

碎片化什么? 很遗憾,我认为您不会在这里找到最佳答案。提问的目的是什么?历史/民间的个人知识?这些尺寸是根据在大多数情况下可能是最佳的而设置的。如果您使用较大的值进行 BULK 上传会更好(注意网络 MTU)。我只能提出对实际答案几乎没有影响的可能问题。 【参考方案1】:

情况一直如此。即使在 SQL 7.0 和 SQL Server 2000 中,default value was 4096 bytes。

problem 发生在您尝试使用高于 8060 字节的网络内存时,因为这需要 SQL Server 从使用 384 MB 大小的内存区域分配内存。

从客户端应用程序端修改数据包大小非常容易。在连接字符串中,您只需设置packet size=4096

建议不要在运行 SQL Server 的服务器上调整默认网络大小,除非您正在使用 SSIS 进行一些繁重的工作,或者您的应用程序正在执行批量复制操作、发送和接收 BLOB 数据。

请注意,SybaseASE 使用 512 字节作为默认数据包大小,因此 SQL Server 6.5 可能会将其设置为默认值(但如果 SQL 6.5 是这种情况,我没有提及引用)。

参考:Network Packet Size: to Fiddle With or Not to Fiddle With

【讨论】:

我明白这一点,但我想知道为什么 .Net 与基本 sql 不同。

以上是关于默认网络数据包大小的差异:SqlConnection 与 SQL Server 默认值的主要内容,如果未能解决你的问题,请参考以下文章

ping小包是多少的包

常用ping命令。

linux网络测试命令

omn et ++的默认包大小和数据速率

traceroute----追踪数据包在网络上的传输过程

traceroute/tracert--获取网络路由路径