cluster table using index 根据索引重排表的物理存储顺序
最近家里有些事情,才开始进行更新
重排表物理存储顺序
语法
CLUSTER [VERBOSE] table_name [ USING index_name ]
CLUSTER [VERBOSE]
描述
根据索引的信息,编排表的物理存储顺序。操作是一次性的,意味着当操作结束后,新产生的数据,不会进行编排,当表依据索引进行编排后,PostgreSQL会记录该索引,当执行 CLUSTER table_name
时,会自动引用先前的索引。当 CLUSTER
不加任何参数时,会对该数据库下该用户的所有表(编排过的表)进行编排,若是超级用户,则会对所有表进行编排。此操作不能在事务中使用。操作过程中会加 ACCESS EXCLUSIVE
锁。
作用
当随机只读取一条记录时,表的物理存储顺序是不重要的。如果你访问很多数据并通过索引分组,或是根据索引键进行范围查询,或是一个索引有多条记录,重编排数据会很有用,因为当根据索引读取表的第一条数据时,其他所需数据也存在于改page中,这节省了磁盘和内存的使用,从而提高性能。
该 CLUSTER
会根据统计信息等内容选择索引扫描或顺序扫描对表数据进行重排序。
当根据索引进行扫描,会对表数据和索引数据进行临时copy处理,因此磁盘需要table size+index size的空间进行临时数据存储。
当进行顺序扫描时,会产生排序的临时文件,因此需要 table size * 2 + index size的空间进行临时数据存储,当然可以使用 enable_sort
禁止使用次方法。
示例
test=# create table aa(id int primary key);
CREATE TABLE
test=# select relname,relfilenode from pg_class where relname ~ 'aa';
relname | relfilenode
---------+-------------
aa | 33007
aa_pkey | 33010
(2 rows)
test=# cluster aa using aa_pkey ;
CLUSTER
test=# select relname,relfilenode from pg_class where relname ~ 'aa';
relname | relfilenode
---------+-------------
aa | 33012
aa_pkey | 33015
(2 rows)
-- relfilenode发生了改变
[CitusDB中国]站主,PostgreSQL粉丝,现从事Citus研发工作
愿Citus在中国发展的越来越好