2013-04-09 86 views
1

來自此文檔http://www.postgresql.org/docs/current/static/explicit-locking.htmlPostgreSQL鎖定模式

我知道PostgreSQL提供了各種鎖定模式來控制對錶中數據的併發訪問。

我的問題是我有很多會話將訪問我的數據庫,但我很困惑,我應該使用40列或許多列與較少的列(一對一關係)1大表。

  1. 因爲當我選擇數據,我會選擇這一切--->它需要更多的時間,當我使用INNER JOIN許多表選擇,但它需要較少的時間從1個大表來選擇。所以,如果我使用了很多表格,那麼我的php會響應得更慢。

  2. 但是,當我只使用一個表時,許多會話將更新我的表中的數據,我害怕死鎖或延遲,因爲命令UPDATE,DELETE和INSERT獲取目標表上的ROW EXCLUSIVE鎖定模式。通常,這種鎖定模式將由修改表中數據的任何命令獲取。

任何人都可以推薦哪種方法是最好的方法嗎?一張大桌子還是很多桌子?

+1

對於一張大桌子或許多桌子,您的問題無法在不知道您存儲在其中的情況下回答。標準的建議是規範化你的模式http://www.bkent.net/Doc/simple5.htm – Eelke 2013-04-09 05:41:49

+0

我存儲了設備信息,例如id,name,public ip,private ip,gateway,mask,external port,internal port,etc .. 我很困惑,我應該把它做成一個有很多列的大表,或者把它分成許多表,對於exp:dev_info,dev_ip,dev_port – user430926 2013-04-09 06:04:43

+0

爲了解決你的「慢查詢」,請閱讀這個http:// wiki。 postgresql.org/wiki/SlowQueryQuestions並相應地更新您的問題。 – 2013-04-09 07:13:32

回答

6

確實INSERT,UPDATEDELETE必須獲取ROW EXCLUSIVE要更新的表的鎖定。

但是,此鎖並不妨礙SELECT正常工作。 SELECT只需要ACCESS SHARE鎖定。此鎖與ROW EXCLUSIVE兼容 - 換句話說,只要您沒有獲取任何明確的鎖,就可以完美執行SELECT,而其他數據則通過INSERTUPDATEDELETE進行更新。

換句話說,你永遠不應該看到任何使用第二種方法的死鎖(只是不要使用SELECT FOR UPDATE,你會沒事的)。

瞭解更多PostgreSQL documentation

+0

如果第一種方法更新第一列,第二種方法也更新其他B列,它會等到第一個UPDATE事務完成,然後更新第二個或將它衝突? – user430926 2013-04-09 05:54:24

+2

您應該閱讀[關於MVCC的更多內容](http://www.postgresql.org/docs/current/static/transaction-iso.html#XACT-READCOMMITTED)。 TLDR:如果完全相同的行被更新,第二個UPDATE *可能*等待第一個。在這種情況下,標準化應該有所幫助 – mvp 2013-04-09 06:00:06

+0

因此,ROW EXCLUSIVE鎖定要更新的表,但只鎖定我要更新的行嗎?不是整桌子? 1st UPDATE:UPDATE mytable SET ... WHERE key = 1; – user430926 2013-04-09 06:53:45