官术网_书友最值得收藏!

Optimizing storage and managing cleanup

Transactions are an integral part of the PostgreSQL system. However, transactions come with a small price tag attached. As already shown in this chapter, it can happen that concurrent users will be presented with different data. Not everybody will get the same data returned by a query. In addition to that, DELETE and UPDATE are not allowed to actually overwrite data as ROLLBACK would not work. If you happen to be in the middle of a large DELETE operation, you cannot be sure whether you will be able to COMMIT or not. In addition to that, data is still visible while you do a DELETE, and sometimes data is even visible once your modification has long since finished.

Consequently, this means that cleanup has to happen asynchronously. A transaction can not clean up its own mess and COMMIT/ROLLBACK might be too early to take care of dead rows.

The solution to the problem is VACUUM:

test=# h VACUUM
Command: VACUUM
Description: garbage-collect and optionally analyze a database
Syntax:
VACUUM [ ( { FULL | FREEZE | VERBOSE | ANALYZE } [, ...] ) ] [ table_name [ (column_name [, ...] ) ] ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] [ table_name ]
VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] ANALYZE [ table_name [ (column_name [, ...] ) ] ]

VACUUM will visit all pages that potentially contain modifications and find all the dead space. The free space found is then tracked by the free space map (FSM) of the relation.

Note that VACUUM will, in most cases, not shrink the size of a table. Instead, it will track and find free space inside existing storage files.

Tables will usually have the same size after a VACUUM. If there are no valid rows at the end of a table, file sizes can go down in some rare cases. This is not the rule but rather the exception.

What this means to end users will be outlined in the Watching VACUUM at work section of this chapter.

主站蜘蛛池模板: 德庆县| 泰顺县| 通河县| 虎林市| 咸阳市| 河曲县| 桦甸市| 奉新县| 林周县| 博湖县| 廊坊市| 额尔古纳市| 长沙县| 扶绥县| 文昌市| 台南县| 光山县| 会宁县| 淄博市| 乐安县| 巴青县| 赞皇县| 北辰区| 富宁县| 合作市| 阳城县| 长兴县| 清河县| 镇安县| 双流县| 韩城市| 长沙市| 大化| 治多县| 林西县| 内江市| 仙游县| 苍山县| 杭州市| 宣恩县| 确山县|