Compute
Elastic Cloud Server
Huawei Cloud Flexus
Bare Metal Server
Auto Scaling
Image Management Service
Dedicated Host
FunctionGraph
Cloud Phone Host
Huawei Cloud EulerOS
Networking
Virtual Private Cloud
Elastic IP
Elastic Load Balance
NAT Gateway
Direct Connect
Virtual Private Network
VPC Endpoint
Cloud Connect
Enterprise Router
Enterprise Switch
Global Accelerator
Management & Governance
Cloud Eye
Identity and Access Management
Cloud Trace Service
Resource Formation Service
Tag Management Service
Log Tank Service
Config
OneAccess
Resource Access Manager
Simple Message Notification
Application Performance Management
Application Operations Management
Organizations
Optimization Advisor
IAM Identity Center
Cloud Operations Center
Resource Governance Center
Migration
Server Migration Service
Object Storage Migration Service
Cloud Data Migration
Migration Center
Cloud Ecosystem
KooGallery
Partner Center
User Support
My Account
Billing Center
Cost Center
Resource Center
Enterprise Management
Service Tickets
HUAWEI CLOUD (International) FAQs
ICP Filing
Support Plans
My Credentials
Customer Operation Capabilities
Partner Support Plans
Professional Services
Analytics
MapReduce Service
Data Lake Insight
CloudTable Service
Cloud Search Service
Data Lake Visualization
Data Ingestion Service
GaussDB(DWS)
DataArts Studio
Data Lake Factory
DataArts Lake Formation
IoT
IoT Device Access
Others
Product Pricing Details
System Permissions
Console Quick Start
Common FAQs
Instructions for Associating with a HUAWEI CLOUD Partner
Message Center
Security & Compliance
Security Technologies and Applications
Web Application Firewall
Host Security Service
Cloud Firewall
SecMaster
Anti-DDoS Service
Data Encryption Workshop
Database Security Service
Cloud Bastion Host
Data Security Center
Cloud Certificate Manager
Edge Security
Managed Threat Detection
Blockchain
Blockchain Service
Web3 Node Engine Service
Media Services
Media Processing Center
Video On Demand
Live
SparkRTC
MetaStudio
Storage
Object Storage Service
Elastic Volume Service
Cloud Backup and Recovery
Storage Disaster Recovery Service
Scalable File Service Turbo
Scalable File Service
Volume Backup Service
Cloud Server Backup Service
Data Express Service
Dedicated Distributed Storage Service
Containers
Cloud Container Engine
SoftWare Repository for Container
Application Service Mesh
Ubiquitous Cloud Native Service
Cloud Container Instance
Databases
Relational Database Service
Document Database Service
Data Admin Service
Data Replication Service
GeminiDB
GaussDB
Distributed Database Middleware
Database and Application Migration UGO
TaurusDB
Middleware
Distributed Cache Service
API Gateway
Distributed Message Service for Kafka
Distributed Message Service for RabbitMQ
Distributed Message Service for RocketMQ
Cloud Service Engine
Multi-Site High Availability Service
EventGrid
Dedicated Cloud
Dedicated Computing Cluster
Business Applications
Workspace
ROMA Connect
Message & SMS
Domain Name Service
Edge Data Center Management
Meeting
AI
Face Recognition Service
Graph Engine Service
Content Moderation
Image Recognition
Optical Character Recognition
ModelArts
ImageSearch
Conversational Bot Service
Speech Interaction Service
Huawei HiLens
Video Intelligent Analysis Service
Developer Tools
SDK Developer Guide
API Request Signing Guide
Terraform
Koo Command Line Interface
Content Delivery & Edge Computing
Content Delivery Network
Intelligent EdgeFabric
CloudPond
Intelligent EdgeCloud
Solutions
SAP Cloud
High Performance Computing
Developer Services
ServiceStage
CodeArts
CodeArts PerfTest
CodeArts Req
CodeArts Pipeline
CodeArts Build
CodeArts Deploy
CodeArts Artifact
CodeArts TestPlan
CodeArts Check
CodeArts Repo
Cloud Application Engine
MacroVerse aPaaS
KooMessage
KooPhone
KooDrive

VACUUM

Updated on 2024-08-20 GMT+08:00

Description

VACUUM recycles storage space occupied by tables or B-Tree indexes. In normal database operation, rows that have been deleted are not physically removed from their table; they remain present until a VACUUM is done. Therefore, it is necessary to do VACUUM periodically, especially on frequently-updated tables.

Precautions

  • If no table is specified, VACUUM processes the tables on which the user has the corresponding permission in the current database. With a parameter, VACUUM processes only that table.
  • To perform VACUUM operation on a table, you must be a table owner or a user granted the VACUUM permission on the table. When the separation of duties is disabled, system administrators have this permission by default. However, database owners are allowed to VACUUM all tables in their databases, except shared catalogs. (The restriction for shared catalogs means that a true database-wide VACUUM can only be executed by the system administrator). VACUUM skips over any tables that the calling user does not have the permission to vacuum.
  • VACUUM cannot be executed inside a transaction block.
  • It is recommended that active production databases be vacuumed frequently (at least nightly), in order to remove dead rows. After adding or deleting a large number of rows, it might be a good idea to run VACUUM ANALYZE for the affected table. This will update the system catalogs with the results of all recent changes, and allow the query planner to make better choices in planning queries.
  • FULL is recommended only in special scenarios. For example, you wish to physically narrow the table to decrease the occupied disk space after deleting most rows of a table. VACUUM FULL usually shrinks a table more than VACUUM does. The FULL option does not clear indexes. You are advised to periodically use the REINDEX statement. If the physical space usage does not decrease after you run the statement, check whether there are other active transactions (that have started before you delete data transactions and not ended before you run VACUUM FULL). If there are such transactions, run this statement again when the transactions quit.
  • VACUUM FULL returns the free space in the table to the tablespace by rebuilding the table. During the rebuilding, extra storage space equivalent to the valid data size in the table is required. For a non-segment-page table, after VACUUM FULL is executed, the physical files occupied by the original table are deleted, and the physical file space occupied by the original table is returned to the OS. For a segment-page table, after VACUUM FULL is executed, the physical space occupied by the original table is returned to the segment-page data file instead of the OS.
  • VACUUM causes a substantial increase in I/O traffic, which might cause poor performance for other active sessions. Therefore, it is sometimes advisable to use the cost-based VACUUM delay feature.
  • When VERBOSE is specified, VACUUM prints progress messages to indicate which table is currently being processed. Various statistics about the tables are printed as well.
  • When the option list is surrounded by parentheses, the options can be written in any order. If there are no brackets, the options must be given in the order displayed in the syntax.
  • VACUUM and VACUUM FULL clear deleted tuples after the delay specified by vacuum_defer_cleanup_age.
  • VACUUM ANALYZE executes a VACUUM operation and then an ANALYZE operation for each selected table. This is a handy combination form for routine maintenance scripts.
  • Plain VACUUM (without FULL) simply recycles space and makes it available for reuse. This form of statement can operate in parallel with normal reading and writing of the table, as an exclusive lock is not obtained. VACUUM FULL executes wider processing, including moving rows across blocks to compress tables so they occupy the minimum number of disk blocks. This form is much slower and requires an exclusive lock on each table while it is being processed.
  • A deadlock may occur when multiple VACUUM FULL statements are executed simultaneously.
  • If the xc_maintenance_mode parameter is not enabled, the VACUUM FULL operation will skip all system catalogs.
  • If you run VACUUM FULL immediately after running DELETE, the space will not be recycled. After running DELETE, execute 1000 non-SELECT transactions, or wait for 1s and then execute one transaction. Then, run VACUUM FULL to the space.
  • During VACUUM FULL, an exclusive lock is added to the table. Therefore, you are advised not to run VACUUM FULL during peak hours because it may cause long waiting time or service interruption.
  • For Ustore, the behavior of manual VACUUM is the same as that in Astore. Locks are obtained to clear heap tables and indexes. In Ustore, AUTOVACUUM only clears GPIs of partitioned tables, updates FSMs of heap tables, and recycles index pages.
  • When VACUUM FULL is executed, partitions are traversed for clearance and GPIs are rebuilt after partition clearance. Therefore, if there are a large number of partitions, you are advised to delete GPIs first and rebuild indexes after VACUUM FULL is executed. In this way, the execution time of VACUUM FULL is reduced.

Syntax

  • Recycle space and update statistics information, without requirements for keyword orders.
    VACUUM [ ( { FULL | FREEZE | VERBOSE | {ANALYZE | ANALYSE }} [,...] ) ]
        [ table_name [ (column_name [, ...] ) ] [ PARTITION ( partition_name ) | SUBPARTITION ( subpartition_name ) ] ];
  • Recycle space, without updating statistics information.
    VACUUM [ FULL [COMPACT] ] [ FREEZE ] [ VERBOSE ] [ table_name 
    [ PARTITION ( partition_name )  | SUBPARTITION ( subpartition_name ) ] ];
  • Recycle space and update statistics information, and require keywords in order.
    VACUUM [ FULL ] [ FREEZE ] [ VERBOSE ] { ANALYZE | ANALYSE } [ VERBOSE ] 
        [ table_name [ (column_name [, ...] ) ] ] [ PARTITION ( partition_name ) ];
  • Recycle the space of a specified bucket and update the bucketxid column in the pg_hashbucket system catalog. Statistics are not updated. This function is not supported in the current version.
    1
    VACUUM FREEZE BUCKETS (bucketid [, ...]);
    

Parameters

  • FULL

    Selects "FULL" vacuum, which can recycle more space, but takes much longer and exclusively locks the table.

    NOTE:

    Using FULL will cause statistics missing. To collect statistics, add the keyword ANALYZE to VACUUM FULL.

  • FREEZE

    Is equivalent to running VACUUM with the vacuum_freeze_min_age parameter set to 0.

  • VERBOSE

    Prints a detailed VACUUM activity report for each table.

  • ANALYZE | ANALYSE

    Updates statistics used by the planner to determine the most efficient way to execute a query.

    NOTE:

    VACUUM is also triggered when autovacuum is set to analyze for a Ustore partitioned table.

  • table_name

    Specifies the name (optionally schema-qualified) of a specific table to vacuum.

    Value range: name of a specific table to vacuum Defaults are all tables in the current database.

  • column_name

    Specifies the name of the column to be analyzed. This parameter must be used together with ANALYZE.

    Value range: name of the column to be analyzed Defaults are all columns.

    NOTE:

    The mechanism of the VACUUM ANALYZE statement is to execute VACUUM and ANALYZE in sequence. Therefore, if column_name is incorrect, VACUUM may be successfully executed but ANALYZE may fail to be executed. For a partitioned table, ANALYZE may fail to be executed after VACUUM is successfully executed on a partition.

  • PARTITION

    COMPACT and PARTITION cannot be used at the same time.

  • partition_name

    Specifies the level-1 partition name of the table to be cleared. If it is left empty, all level-1 partitions are cleared.

  • subpartition_name

    Specifies the level-2 partition name of the table to be cleared. If it is left empty, all level-2 partitions are cleared.

Examples

  • VACUUM
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    -- Create the table tbl_test and insert data into the tables.
    gaussdb=# CREATE TABLE tbl_test(c1 int); 
    gaussdb=# INSERT INTO tbl_test VALUES (1); 
    
    -- View the data and the CTID of the data.
    gaussdb=# SELECT ctid,* FROM tbl_test;
     ctid  | c1 
    -------+----
     (0,1) |  1
    (1 row)
    
    -- Delete the data record.
    gaussdb=# DELETE FROM tbl_test;
    
    -- Insert a data record again. It is found that a new ctid is used.
    gaussdb=# INSERT INTO tbl_test VALUES (2);
    gaussdb=# SELECT ctid,* FROM tbl_test;
     ctid  | c1 
    -------+----
     (0,2) |  2
    (1 row)
    
    -- After the VACUUM statement is executed, the old space is reused when data is inserted.
    gaussdb=# VACUUM ANALYZE tbl_test;
    gaussdb=# INSERT INTO tbl_test VALUES (3);
    gaussdb=# SELECT ctid,* FROM tbl_test;
     ctid  | c1 
    -------+----
     (0,1) |  3
     (0,2) |  2
    (2 rows)
    
    -- Delete the table.
    gaussdb=# DROP TABLE tbl_test;
    
  • VACUUM FULL
    -- Create a table.
    gaussdb=# CREATE TABLE tbl_test2(c1 int);
    
    -- Insert 100,000 data records and check the table size.
    gaussdb=# INSERT INTO tbl_test2 VALUES (generate_series(1,100000));
    gaussdb=# SELECT 'tbl_test2' AS tablename, pg_size_pretty(pg_relation_size('tbl_test2')) AS size;
     tablename |  size   
    -----------+---------
     tbl_test2 | 3048 kB
    (1 row)
    
    -- Delete data and check the table size.
    gaussdb=# DELETE FROM tbl_test2;
    gaussdb=# SELECT 'tbl_test2' AS tablename, pg_size_pretty(pg_relation_size('tbl_test2')) AS size;
     tablename |  size   
    -----------+---------
     tbl_test2 | 3048 kB
    (1 row)
    
    -- Use VACUUM FULL to reclaim space and check the table size.
    gaussdb=# VACUUM FULL ANALYZE tbl_test2;
    gaussdb=# SELECT 'tbl_test2' AS tablename, pg_size_pretty(pg_relation_size('tbl_test2')) AS size;
     tablename |  size   
    -----------+---------
     tbl_test2 | 0 bytes
    (1 row)
    
    
    -- Delete.
    gaussdb=# DROP TABLE tbl_test2;

Suggestions

  • VACUUM
    • VACUUM cannot be executed inside a transaction block.
    • It is recommended that active production databases be vacuumed frequently (at least nightly), in order to remove dead rows. It is strongly recommended that you run VACUUM ANALYZE after adding or deleting a large number of records.
    • FULL is recommended only in special scenarios. For example, you wish to physically narrow the table to decrease the occupied disk space after deleting most rows of a table.

We use cookies to improve our site and your experience. By continuing to browse our site you accept our cookie policy. Find out more

Feedback

Feedback

Feedback

0/500

Selected Content

Submit selected content with the feedback