2

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

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

数据库是Oracle 10g。

4

4 回答 4

3

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

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

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

于 2010-03-06T00:53:47.890 回答
2

您是否尝试过在数据库端测量它?Oracle 10g 出现了一整套性能调优和监控工具

于 2010-03-07T14:11:49.890 回答
0

除了循环遍历之外,您无法获得结果集的大小。如果从 preformace 的角度来看你买不起,你可以在结果集的第一行从服务器返回结果集的大小。或返回两个结果集。

于 2010-03-02T18:42:44.017 回答
0

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

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

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

于 2010-03-08T22:44:16.040 回答