C#获取从SQL查询返回的数据的大小

如何在执行查询时获取从数据库返回的数据的大小(以字节为单位)? 这样做的原因是使用两种不同的技术比较数据库服务器上的负载。 我们运行的报表是根据相同的数据集构建的,这些报表会为每个报表加载整个数据集。 现在我们正在缓存数据集并从缓存中运行报告。 我们按客户端运行报告,一些数据集明显大于其他数据集,我需要一些方法来为数据库服务器负载减少提供可衡量的指标。

我已经尝试通过DbConnection,DbDataReader和DbCommand查找任何现有function,但无法找到它。 如果可能的话,测量给定连接或读取器的数据吞吐量会很棒,但任何解决方案都是可以接受的。 是否可以使用数据库服务器代理来测量它?

该数据库是Oracle 10g。

一种可能性是简单地使用网络嗅探器。 Wireshark非常棒。 通过连接进行测量(在给定计算机上使用多个连接时)会很棘手,但您可以使用它来测量进出客户端计算机的所有流量。 这样做的一个好处是它还可以测量传出的请求,这些请求在您的情况下应该很小(报告生成),但仍然是整体负载的一部分。

以这种方式测量它的另一个好处是它会发现请求大小的差异(如果有的话)。 例如,如果一个方法导致在单独的请求中从服务器读取单个记录,而另一个方法导致在一个请求中读取“批量”记录,那么您将能够看到这些差异。 在这种情况下,这两种方法都可能表明DbDataReader级别的总数据是相同的,但第一种方法会导致更多的网络流量。

Wireshark显示了许多可能对此有用的统计信息。 它可以给出包的总数,包的平均大小,总大小,每秒平均字节数等。

您是否尝试在数据库端进行测量? Oracle 10g似乎拥有一整套性能调优和监控工具 。

你不能得到结果集的大小,除了循环遍历它。 如果从预先编码的角度来看你负担不起,你可以在结果集的第一行中从服务器返回结果集的大小。 或返回两个结果集。

我认为没有任何简单的方法可以做到这一点。 为了获取元数据,您确实需要将数据表示为DataSet或DataTable,而不是通过DbDataReader或DataRow,以便所有键,列和元数据都表示为一个整体。

我要做的是创建二进制格式化程序和内存流,并将DataSet / DataTable作为二进制数据序列化到内存流中。 然后,您应该能够从流中询问长度。 这应该非常准确地告诉您在您的问题上发布的数据大小

这可能是一个性能杀手,因此您可能只想在调试环境中使用它,只是为了了解数据的大小