如何在执行查询时获取从数据库返回的数据的字节大小?这样做的原因是使用两种不同的技术比较数据库服务器上的负载。我们运行的报告是根据相同的数据集构建的,这些报告会为每个报告加载整个数据集。现在我们正在缓存数据集并从缓存中运行报告。我们按客户端运行报告,一些数据集明显大于其他数据集,我需要一些方法来为数据库服务器负载减少提供可衡量的指标。
我尝试通过DbConnection,DbDataReader和DbCommand查找任何现有功能,但无法找到它。如果可能的话,测量给定连接或读取器的数据吞吐量会很棒,但任何解决方案都是可以接受的。是否可以使用数据库服务器代理来测量它?
数据库是Oracle 10g。
答案 0 :(得分:3)
一种可能性就是简单地使用网络嗅探器。 Wireshark非常好。通过连接进行测量(在给定计算机上使用多个连接时)会很棘手,但您可以使用它来测量进出客户端计算机的所有流量。这样做的一个好处是它还可以测量传出请求,这些请求在您的情况下应该很小(报告生成),但仍然是整体负载的一部分。
以这种方式衡量它的另一个好处是它会发现请求大小的差异(如果有的话)。例如,如果一个方法导致在单独的请求中从服务器读取单个记录,而另一个方法导致在一个请求中读取“批量”记录,那么您将能够看到这些差异。在这种情况下,这两种方法都可能表明DbDataReader级别的总数据是相同的,但第一种方法会导致更多的网络流量。
Wireshark显示了许多可能对此有用的统计信息。它可以给出包的总数,包的平均大小,总大小,每秒平均字节数等。
答案 1 :(得分:2)
您是否尝试过在数据库端进行测量? Oracle 10g似乎有a whole stack of performance tuning and monitoring tools。
答案 2 :(得分:0)
除了遍历它之外,你无法获得结果集的大小。如果从预先编码的角度来看,你负担不起,你可以在结果集的第一行中从服务器返回结果集的大小。或返回两个结果集。
答案 3 :(得分:0)
我认为没有任何简单的方法可以做到这一点。为了获取元数据,您确实需要将数据表示为DataSet或DataTable,而不是通过DbDataReader或DataRow,以便所有键,列和元数据都表示为一个整体。
我要做的是创建二进制格式化程序和内存流,并将DataSet / DataTable作为二进制数据序列化到内存流中。然后,您应该能够从流中询问长度。这应该非常准确地告诉您在问题上发布的数据大小
这可能是性能杀手,因此您可能只想在调试环境中使用它,只了解数据的大小