2017-02-11 76 views
0

我正在對postgresql 9.6進行一些測試。我創建了一個表:爲什麼每次事務回滾後,PostgreSQL中的表大小都在增加?

CREATE TABLE salary 
(
    id serial NOT NULL, 
    employee_id numeric, 
    salary_amount numeric, 
    CONSTRAINT salary_pkey PRIMARY KEY (id) 
) 

然後插入一些數據和回退:

begin; 
insert into salary (employee_id, salary_amount) 
values 
(2,1000),(3,2000),(5,2000),(6,2000),(7,2000),(9,2000),(4,2000); 

rollback; 

回滾該交易的薪金錶的規模在不斷擴大之後,但創建任何記錄。

  1. 爲什麼每次事務回滾之後空表的大小都在增加?
  2. 這會影響查詢性能嗎?
+0

這就是事務中使用的空間分配..但應該在下一次重用。 – scaisEdge

+0

每次我用回滾運行這個事務時,表的大小都在增加!這個已用空間的位置在哪裏? – Arezoo

+0

應該是交易(承諾)所需的空間..但與回滾的空間不重用..與他人承諾後reslc ..通常.. – scaisEdge

回答

1

該文件變大了,因爲在事務回滾之前記錄被寫入表的文件。即使他們在文件中,他們對其他交易也不可見。

查詢性能受文件中死元組影響,因爲簡單地說,查詢可能必須在查找活動記錄時通過它們讀取。這就是爲什麼PostgreSQL有一個名爲「吸塵」的操作,可以清理未使用的數據,釋放它佔據新記錄的空間。

任何中途最近的PostgreSQL版本將在必要時自動清空你的表格。您還可以強制該用真空SQL命令:

VACUUM salary; 

或者在命令行上:

vacuumdb -t salary database 

你不需要,除非你有在桌子上一些嚴重的大規模活動要做到這一點,雖然。請注意,即使在清空之後,文件通常也不會變小:VACUUM不會移動記錄,因此文件大小由最後一個活動記錄的位置控制。

相關問題