【问题标题】:In what format is SQL Server data serialized when it is sent through the network?SQL Server 数据通过网络发送时以什么格式序列化?
【发布时间】:2010-08-10 08:39:20
【问题描述】:

我问这个问题的原因是因为我们计划从 SQL Server 数据库读取大量(几 GB)数据到 .Net 应用程序进行处理。我想知道要为每条记录计算多少空间开销,以估计对我们网络流量的影响。

例如一条记录由 5 个整数组成(这使得 4 * 5 = 20 个字节的数据)。每条记录物理传输多少字节?是否有精确的公式或经验法则?

【问题讨论】:

  • 实际上,如果您传输 5 个 int,您将获得 8092 个字节的传输 - 总是如此。 SQL Server 被组织成 8K 的页面 - 你永远不会得到小于 8K 的块。
  • @marc_s:你在考虑 IO 和内存吗?
  • @gbn:如果你碰巧有一个不幸的布局,你可能会使用 4100 字节的 8K 页面,因此你将有近 50% 的“松弛”/空白空间每次来电都来。

标签: .net sql-server performance


【解决方案1】:

SQL Server 使用TDS protocol。还有MSDN

坦率地说,我不会担心。不幸的是,无论如何完成,GB 的数据都需要时间。

【讨论】:

  • 谢谢,“表格数据流协议规范”的 MSDN 链接真的很有帮助(尽管它有 154 页非常详尽!)
【解决方案2】:

我对实际格式一无所知,但我建议采用经验方法并连接 Wireshark 并自己测量数据。

【讨论】:

  • 这是一个有用的评论,不是答案。
  • @Manu - 根据 Chris 的回答,网络是许多系统的复杂交互。因此,不可能从协议规范中准确预测您的特定实现将如何反应。测量一些东西会给你现实世界和理论数字,在某个阶段你必须测量网络来验证你在设计中所做的所有假设。
【解决方案3】:

正如 Peter M 所说,测试一下。

没有足够真实的计算可以为您提供足够的信息来处理。

现实情况是需要考虑的变量太多。例如:

所涉及的 NIC 的实际传输速率是多少?请注意,此速率将根据已安装的网卡以及这些卡使用的驱动程序而有所不同。您可以很容易地拥有一张 1G​​b 的卡,但由于驱动程序问题,它只能以 300Mb 的速度传输。我什至见过由完全相同的制造商生产的两张卡具有相同的驱动程序,由于其中一张卡的配置略有不同,因此传输速度也不同。

有问题的两台机器之间还有哪些其他设备?同样,根据硬件、操作系统等,您可能会看到截然不同的数字。来自 TRENDNet 的 100 美元 8 端口 1Gb 非托管交换机的吞吐量将与 5000 美元的 1Gb cisco 托管交换机完全不同。

您还必须在传输时考虑现有网络的“天气”。在这将共享的同一线路上,其他网络流量的吞吐量是多少。这将是一个瞬态因素,因为现有网络负载会随着对它的不同需求而发生变化。

另外,有些网卡支持 TCP 卸载,有些不支持。如果您的网卡不这样做,那么有效传输速率将受到这些盒子上的 CPU 正在执行的任何其他操作的阻碍。

接下来,必须考虑硬盘驱动器。考虑到这是大量的数据,那么各种硬盘的读写速度都会有影响。当然,网络实际上可能能够以 90% 的效率运行,但如果您正在谈论大量数据,硬盘驱动器本身可能无法跟上,因此导致效率下降到 25% 或更低。

重点是,您必须对其进行测试,最终,SQL Server 使用的协议对您的发现无关紧要。不要只运行一个测试,而是运行大量的真实世界测试。只有这样你才能得出一个平均值;根据当时发生的其他情况,这可能仍然会关闭,但您应该能够达到 10% 以内。

【讨论】:

【解决方案4】:

根据我的观察,标准 SQL 命令会导致大量往返。因此,如果您可以将其重述为上传一张表格,那么对于传输大量数据会有所帮助。然后可以使用批量复制操作,效率更高。请参阅:Bulk Copy Operations in SQL Server (ADO.NET)bcp Utility

【讨论】:

  • 批量复制操作仅在写入 sql server 时相关,而不是在从中读取数据时相关
  • @Manu:是的。写作时的表现差异很大。但是我在阅读时也看到了相当大的加速。我想这取决于你的情况。
【解决方案5】:

实际上 TDS 协议是一个非常慢的协议。 SQL Server 针对处理数据进行了优化,而不是针对来回封送大量数据。虽然表示开销并不大,但它是一个请求-响应协议和缺少 boxcaring 的事实使得它与专用的高吞吐量协议相比相当慢,即使在 SQL Server 内部(如数据库镜像或服务代理协议)也是如此。但即便如此,由于 TDS 的速度如此之慢,通过 TDS 管道全速运行的 SQL Server 肯定会使您的 .Net 客户端不堪重负。

总体而言,如果您曾经问​​过与您提出的问题类似的问题,则意味着您做错了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-16
    • 2014-12-13
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多