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

标签 .net database performance

我正在使用 ODP.NET 从 oracle 数据库加载数据。

在当前的实现中,代码按照以下方式做了一些事情:

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 个实体需要几秒钟。

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

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

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

最佳答案

您可能会想到带宽和延迟之间的区别。

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

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

我相信世界另一端的正常延迟时间约为半秒 - 因此对于分别检索的 200 个实体,大约需要 100 秒。

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

关于.net - 查询远程数据库时性能下降 - 这正常吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6029605/

相关文章:

c# - 数据读取器 GetInt32() & GetInt16()

c# - 仅允许 TLS 1.0 后仍然可以进行 TLS 1.2 握手

c# - 无法找到程序集 Entity Framework v 4.4.0.0

数据库行/记录指针

PHP PDO : How to deal with bindValue() and reserved keywords?

wpf - BitmapImage 解码速度表现 wpf

forms - Angular 2 : Too many components in a module?

c# - 从 .WAV 文件中读取 24 位样本

c# - 在 Entity Framework 中配置本地数据库位置

mysql - 我们可以优化这个 SQL 查询吗?