查询远程数据库时性能下降 - 这是正常的吗?

时间:2011-05-17 10:38:49

标签: .net database performance

我正在使用ODP.NET从oracle db进行一些加载。

在当前的实现中,代码执行以下操作:

query entityIds to load based on criteria  
    foreach entityId
        load attributes 
        query geometries that exist
        foreach geometry that exists
            load geometry
        next
    next

当数据库处于本地网络标准时,负载133实体需要几秒钟来加载所有133个实体。

当db是托管在世界另一端数据中心的VM上的远程数据库时,这需要大约3.5分钟来加载它们。

特别慢的位似乎是对几何体的质疑。在初始测试中(在TOAD中 - 不在服务加载代码中),使用远程机器加载单个实体的几何图形似乎需要大约2秒。如果我们将查询更改为一次加载所有几何,它似乎仍然需要2秒。这种意味着它不是网络开销(因为返回的数据量对于返回所有几何的查询来说要多得多,但时间是相同的)。

远程数据库与本地预期的这种性能开销是什么?为什么单独执行每个查询所花费的时间比一次完成所有查询要长得多?我们可以做些什么来缓解这种情况(除了一次性完成所有查询)?

2 个答案:

答案 0 :(得分:4)

您可能正在考虑带宽和延迟之间的区别。

延迟是单次往返所花费的时间,而带宽是指在给定时间段内(例如1秒)可以流过的数据量。

如果您正在运行200个查询(来自客户端代码,而不是来自存储过程),那么无论每个查询中有多少数据,您都将获得200次往返

世界另一端的正常延迟大概是我认为的半秒 - 所以对于200个单独检索的实体,大约100秒。

这些数字与您的数字并不完全匹配,因此可能会有更高的延迟(取决于各种网络因素)。我通常会在数据库服务器上查找查询/查找开销(假设存在索引问题),但是您已经提到本地没有显着的开销(可能是使用相同的数据?)。

答案 1 :(得分:4)

您注意到网络延迟

每次进行查询时,服务器都需要至少进行一次往返。

如果服务器是“远”,即500毫秒ping,这意味着每个查询至少有一秒的延迟。这是不可压缩的 - 即使查询没有返回任何行,也会发生1s命中。

网络带宽是一个无关的特征。如果您的带宽很高,您不会注意到传输大型数据集与小型数据集之间存在很大差异。但两者仍将以完全相同的方式遭受延迟命中。

我发现这篇文章有趣(如果注明日期)信息:It's the latency, Stupid