2011-03-01 137 views
0

任何人都可以請幫我理解PostgreSQL的內部?如果我從兩個客戶端訪問兩個單獨的表(相同的數據庫),那麼與在不同時間在不同的表上執行查詢時相比,查詢響應時間會增加。我很困惑,不同表上的同時查詢如何導致更長的執行時間。理論上,如果我在不同的表上同時執行查詢,則兩個客戶端的表都被解鎖,並且執行時間應該保持不變。PostgreSQL中單獨表(同一數據庫)上的併發查詢

我想知道由於使用公共共享資源是否有任何開銷,因爲數據庫是相同的。

請幫忙!

回答

1

那麼,我們來看最基本的情況。

你有兩個大的表存儲在磁盤上。

你他們對這兩個單獨的表運行兩個查詢。

但是,雖然它們是由DB表示的兩個單獨的邏輯表,但它們實際上共享相同的磁盤。

因此,當每個單獨的postgres進程讀取每個表時,磁盤頭都在滑行並來回跳動以嘗試提供數據,因此每個進程都在磁盤驅動器上彼此對抗,單個共享資源。

這就像有一個銀行有兩個出納窗口和兩條線,但只有一個出納員在後面做所有的工作。

這並沒有考慮到其他幾十億因素,它們可能會降低或加快您的查詢速度。只是一個可能發生的案例的基本例子。

+0

尋求你描述的磁盤在實踐中並不真正發生。如果有較長的順序讀取,OS級預讀將確保每個表的讀取塊將足夠​​長,以便查找時間不重要。 – intgr 2011-03-19 16:21:30

0

這裏有很多事情要記住。

首先,順序和隨機磁盤I/O之間存在巨大差異。使用隨機磁盤I/O,您不會獲得操作系統來幫助預取,但是您可以使用順序訪問。因此,在連續讀取操作系統時,將獲取比我們最初讀取的數據更多的數據,我們將在操作系統從另一個表中提取另一個查詢的數據時訪問它。在隨機訪問中,您會得到所描述的效果,但是在隨機訪問中,您無論如何都需要等磁盤驅動器移動而沒有併發問題,因爲您正在進行隨機讀取。

要記住的第二件事是不同的查詢計劃有不同的I/O配置文件。如果我們將表的10%頁面從磁盤中拉出來,並且我們有一個索引,那麼我們可以選擇順序加載索引,然後按照邏輯順序遍歷來查找我們的記錄(而磁盤正在做些什麼對於其他查詢),然後接受開銷,從磁盤隨機訪問幾個頁面。這當然涉及到這種等待頭部移動的問題,並且可能會或可能不會有併發問題,這可能會使情況變得更糟。因此,查詢1完成索引掃描並且查詢2將執行順序掃描是完全可能的,並且將在查詢1處理索引時提取所需的大部分數據。那麼你可能會遇到一些Will描述的問題,但可能並不多。

最後的事情,這是非常關鍵的,是緩存。數據庫傾向於緩存大量記錄,因爲這完全避免了磁盤I/O。所以在這種情況下,你可能實際上有一些非常不同的東西。查詢1可能從內存或主要來自內存中工作,而查詢2可能會碰到磁盤。一般情況下,如果你有足夠的內存來滿足你感興趣的大部分數據的要求,那麼這些數據就可以放在內存中,這樣就可以爲其他軟件(如內核)騰出空間,那麼可能出現的任何磁盤I/O問題都不會成爲實際問題,並且唯一一次你通常會碰到磁盤將是提交WAL段。

所以答案是「這取決於」。這取決於你的系統。這取決於你的RAM和數據大小。這取決於你的硬盤和操作系統。這取決於具體的查詢。這取決於其他使用模式。這取決於。