代码之家  ›  专栏  ›  技术社区  ›  Nick Larsen

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

  •  2
  • Nick Larsen  · 技术社区  · 16 年前

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

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

    数据库是oracle10g。

    4 回复  |  直到 16 年前
        1
  •  3
  •   Mark Wilkins    16 年前

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

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

        2
  •  2
  •   Nick Miller    16 年前

    你试过在数据库端测量它吗?Oracle 10g似乎有 a whole stack of performance tuning and monitoring tools .

        3
  •  0
  •   Andrey    16 年前

    你不能得到结果集的大小,除非在它上面循环。如果从preface的角度看您负担不起,您可以在结果集的第一行返回来自服务器的结果集的大小。或返回两个结果集。

        4
  •  0
  •   Fadrian Sudaman    16 年前

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

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

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