2014-03-18 37 views
0

我正在看一個相當大的數據庫..可以說我有一個產品記錄上的導出標誌。
如果我想估計有多少產品設置爲false,我可以調用類似這樣的產品 Product.where(:exported => false).count ..。是可能的紅寶石設置特定的活動記錄調用髒髒

我的問題是,即使計數需要很長時間,因爲100萬個產品的表正在寫入。更具體地說,出口正在發生,我感興趣的價值在不斷變化。

所以我想在桌上做一個骯髒的閱讀...總是不骯髒的閱讀。而且我100%不希望所有後續調用此連接上的數據庫變得很髒。
但是,對於這一個電話,骯髒是我想要的。

哦..我應該提到紅寶石1.9.3 heroku和postgresql。

現在..如果我錯過了另一種方法來計數,我會很高興嘗試。

OH SNOT最後一件事..這個例子是人爲的。

+0

http://wiki.postgresql.org/wiki/Slow_Counting提供有關如何獲得快速近似值的建議。 –

回答

0

只要查詢開始執行,它就會反對凍結的只讀狀態,因爲這就是MVCC的全部內容。只有在隨後對該狀態進行修改時,該快照中的值纔會更改。如果您的查詢需要一個小時才能運行,則它無關緊要,它將在時間上鎖定的數據上運行。

如果您的查詢需要很長時間,您需要在您的exported列中使用索引,或者在您的條件中使用任何值,作爲COUNT,這通常會非常快。

+1

請注意,只有PostgreSQL 9.2及以上版本可以使用僅限索引的掃描時受益於不合格'count'的索引。 –

+0

這個領域並不是那麼重要..這是一個人爲的例子。但也許我可以縮小我想要做的這些領域,並使用索引。我認爲索引在經常變化的領域上很重要。 – baash05

+0

@ baash05他們是。這是增加寫入負載和讀取時可能改進I/O成本之間的性能折衷。 –

2

PostgreSQL不支持髒讀。

您可能希望使用觸發器來維護計數的物化視圖 - 但這樣做意味着一次只有一個事務可以插入產品,因爲它們會爭用鎖定產品數量的鎖彙總表。另外,use system statistics to get a fast approximation

或者,在PostgreSQL 9.2及更高版本上,確保有一個主鍵(因此有一個唯一索引),並確保真空定期運行。那麼你應該可以做很快的計數,因爲PostgreSQL應該在主鍵上選擇僅索引掃描。

請注意,即使PG 支持髒讀,讀仍然沒有達到完全恢復到最新的結果,因爲行將順序掃描有時插入背後讀指針。獲得完美最新計數的唯一方法是防止併發插入LOCK TABLE thetable IN EXCLUSIVE MODE

+0

我並不是真的在尋找一個最新的數據。只是每隔一段時間就會更新一次,我的老闆要求我點數。 (有多少人改變了戴夫?)一個骯髒的查詢本來就夠好了。 – baash05

+0

那麼,在那種情況下,我沒有看到你的原始解決方案有什麼問題。如果您需要一個適度的最新答案但很快需要,您可以隨時將一個定期計數安排到一個歷史記錄表中,這樣您就可以在詢問時選擇歷史記錄表。 –