簡體   English   中英

查詢遠程數據庫時性能下降 - 這是正常的嗎?

[英]Slow performance when querying remote db - is this normal?

我正在使用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

當DB處於本地網絡標准時,負載133實體需要幾秒鍾來加載所有133個實體。

當db是托管在世界另一端的數據中心的VM上的遠程數據庫時,這需要大約3.5分鍾來加載它們。

特別慢的位似乎是查詢幾何。 在初始測試中(在TOAD中 - 不在服務加載代碼中),使用遠程機器加載單個實體的幾何圖形似乎需要大約2秒。 如果我們將查詢更改為一次加載所有幾何,它似乎仍然需要2秒。 這種意味着它不是網絡開銷(因為返回的數據量對於返回所有幾何的查詢來說要多得多,但時間是相同的)。

對於遠程數據庫與本地預期的這種性能開銷是什么? 為什么單獨執行每個查詢所花費的時間比一次完成所有查詢要長得多? 我們可以做些什么來緩解這種情況(除了一次性完成所有查詢)?

您可能正在考慮帶寬和延遲之間的區別。

延遲是單次往返所花費的時間,而帶寬是在給定時間段(例如1秒)內可以流過的數據量。

如果您正在運行200個查詢(來自客戶端代碼,而不是來自存儲過程),那么無論每個查詢中有多少數據,您都將獲得200次往返

我相信世界另一端的正常延遲大概是半秒鍾 - 所以對於200個單獨檢索的實體,大約100秒。

這些數字與您的數字並不完全匹配,因此可能存在更高的延遲(取決於各種網絡因素)。 我通常會在數據庫服務器上尋找查詢/查找開銷(假設存在索引問題),但是您已經提到本地沒有顯着的開銷(可能是使用相同的數據?)。

您注意到了網絡延遲

每次進行查詢時,服務器至少需要進行一次往返。

如果服務器是“遠”,即500毫秒ping,這意味着每個查詢至少有一秒的延遲。 這是不可壓縮的 - 即使查詢沒有返回任何行,也會發生1s命中。

網絡的帶寬是無關的特征。 如果您的帶寬很高,您不會注意到傳輸大型數據集與小型數據集之間存在很大差異。 但兩者仍將以完全相同的方式遭受延遲命中。

我發現這篇文章有趣(如果過時)信息: 這是延遲,愚蠢

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM