
# DWS是否需要定时对常用的表做VACUUM FULL和ANALYZE操作？
需要。
对于频繁增、删、改的表，需要定期执行VACUUM FULL和ANALYZE，该操作可回收已更新或已删除的数据所占用的磁盘空间，防止因数据膨胀和统计信息不准造成性能下降。
- 一般情况下，对表执行完大量**增、改**操作后，建议进行ANALYZE。
- 对表执行过**删除** 操作后，建议进行VACUUM，一般不建议日常使用VACUUM FULL选项，但是可以在特殊情况下使用。例如，用户删除了一个表的大部分行之后，希望从物理上缩小该表以减少磁盘空间占用。VACUUM和VACUUM FULL具体的差异可以参考[VACUUM和VACUUM FULL]。
#### 语法格式
指定某张表进行分析。
```
ANALYZE table_name;
```
对数据库中的所有表（非外部表）进行分析。
```
ANALYZE;
```
指定某张表进行VACUUM。
```
VACUUM table_name;
```
指定某张表进行VACUUM FULL。
```
VACUUM FULL table_name;
```
更多语法参见[VACUUM](https://support.huaweicloud.com/sqlreference-dws/dws_06_0226.html)和[ANALYZE \| ANALYSE](https://support.huaweicloud.com/sqlreference-dws/dws_06_0245.html)。
![](https://support.huaweicloud.com/dws_faq/public_sys-resources/note_3.0-zh-cn.png)
- 如果执行VACUUM FULL命令后所占用物理空间无变化（未减少），请确认是否有其他活跃事务（删除数据事务开始之前开始的事务，并在VACUUM FULL执行前未结束）存在，如果有，需等其他活跃事务退出后进行重试。
- 8.1.3及以上版本中Vacuum/Vacuum Full可在管理控制台操作，详情可参见[智能运维](https://support.huaweicloud.com/mgtg-dws/dws_01_1160.html)。
 
 #### VACUUM和VACUUM FULL
在DWS中，VACUUM的本质就是一个"吸尘器"，用于吸收"尘埃"。而尘埃其实就是旧数据，如果这些数据没有及时清理，那么将会导致数据库空间膨胀，性能下降，更严重的情况会导致异常退出。
VACUUM的作用：
- 空间膨胀问题：清除废旧元组以及相应的索引。包括提交的事务delete的元组（以及索引）、update的旧版本（以及索引），回滚的事务insert的元组（以及索引）、update的新版本（以及索引）、copy导入的元组（以及索引）。
- FREEZE：防止因事务ID回卷问题（Transaction ID wraparound）而导致的异常退出，将小于OldestXmin的事务号转化为freeze xid，更新表的relfrozenxid，更新库的relfrozenxid、truncate clog。
- 更新统计信息：VACUUM ANALYZE时，会更新统计信息，使得优化器能够选择更好的方案执行SQL语句。
VACUUM命令存在两种形式，VACUUM和VACUUM FULL，目前VACUUM对行存表有作用，对列存表无显著的作用，列存表只能依靠VACUUM FULL释放空间。具体区别见下表：
表1VACUUM和VACUUM FULL 
| 差异项  | VACUUM                                                                                       | VACUUM FULL                                                 |
|:---|:---|:---|
| 空间清理 | 如果删除的记录位于表的末端，其所占用的空间将会被物理释放并归还操作系统。而如果不是末端数据，会将表中或索引中dead tuple（死亡元组）所占用的空间置为可用状态，从而复用这些空间。 | 不论被清理的数据处于何处，这些数据所占用的空间都将被物理释放并归还于操作系统。当再有数据插入后，分配新的磁盘页面使用。 |
| 锁类型  | 共享锁，可以与其他操作并行。                                                                               | 排他锁，执行期间基于该表的操作全部挂起。                                        |
| 物理空间 | 不会释放。                                                                                        | 会释放。                                                        |
| 事务ID | 不回收。                                                                                         | 回收。                                                         |
| 执行开销 | 开销较小，可以定期执行。                             | 开销很大，建议确认数据库所占磁盘页面空间接近临界值再执行操作，且最好选择业务低峰期完成。                |
| 执行效果 | 执行后基于该表的操作效率有一定提升。                                                                           | 执行完后，基于该表的操作效率大大提升。                                         |
   
