---
title: "列存 FAQ - OceanBase 数据库 V4.3.5 | OceanBase 文档中心"
description: 列存 FAQ 列存允许增删列吗？ 允许增加列和删列。 支持 Varchar 列字符数改大、改小。 列存支持多种 Offline DDL，和行存表无异。 有关列存修改的详细信息请参见 表行存列存转换（MySQL 模式） 和 表行存列存转换（Oracle 模式） 。 列存表的查询有何特点？ 冗余行存表中，列存表查询逻辑默…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.3.5 LTS

# 列存 FAQ

更新时间：2026-04-07 20:57:21

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.3.5/zh-CN/800.FAQ/800.column-storage-faq.md)  

## 列存允许增删列吗？

- 允许增加列和删列。
 - 支持 Varchar 列字符数改大、改小。
 - 列存支持多种 Offline DDL，和行存表无异。

有关列存修改的详细信息请参见[表行存列存转换（MySQL 模式）](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002015441)和[表行存列存转换（Oracle 模式）](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000002015372)。

## 列存表的查询有何特点？

- 冗余行存表中，列存表查询逻辑默认采用 Range Scan 走列存模式，而 Point Get 查询则会回退到行存模式。
 - 纯列存表中，任何查询都采用列存模式。

## 列存支持事务吗，对事务大小有什么限制？

和行存表一样，支持事务，并且事务大小无限制，具备高一致性。

## 列存表的日志同步、备份恢复等有什么特别之处吗？

没有任何特别之处，和行存表一致。同步的日志都是行存模式。

## 是否支持将行存表用 DDL 变成列存表？

支持。通过加列存、删行存实现。相关语法示例如下：

```shell
create table t1( pk1 int, c2 int, primary key (pk1));

alter table t1 add column group(all columns, each column);
alter table t1 drop column group(all columns, each column);

alter table t1 add column group(each column);
alter table t1 drop column group(each column);

```

#### 说明

`alter table t1 drop column group(all columns, each column);` 执行后，不用担心没有任何 Group 来承载数据，所有列会被放到一个叫做 `DEFAUTL COLUMN GROUP` 的默认 Group 中。

## 列存里支持多个列集合在一起吗？

在 OceanBase 数据库 V4.3.0 版本中，仅支持**要么每个列独立存储，要么所有列一起作为行存储**。暂不支持任选若干列集合在一起存储。

## 列存支持更新吗，以及 MemTable 里的结构是怎样的？

在 OceanBase 数据库中，增删改操作都在内存里完成，数据以行存的形式保存在 MemTable 里；而基线数据是只读的，以列存的形式保存在磁盘上。当读取一列数据时，会实时地融合 MemTable 中的行存数据和磁盘里的列存数据，输出给用户。这意味着，**OceanBase 数据库支持强一致读列存，不会有数据延迟**。写入 MemTable 的数据支持转储，转储数据依然以行存的形式保存。合并后，行存数据和基线列存数据融合，形成新的基线列存数据。

#### 注意

对于列存表来说，如果存在大量的更新操作，并且没有及时合并，查询性能会受到影响。因此，推荐在批量导入数据后发起一次合并操作，以获得最优的查询性能。而少量更新操作对性能影响不大。

![列存更新操作](https://obbusiness-private.oss-cn-shanghai.aliyuncs.com/doc/img/observer-enterprise/V4.3.0/8.faq/Column%20update.jpg)

## 支持对列存的某一列建索引吗？

支持。OceanBase 数据库不区分是对列存建索引，还是对行存建索引，创建的索引结构是一样的。

对列存某一列或几列建索引的意义在于可以构造一个覆盖索引，提升点查询性能，或者对特定列做排序以提升排序性能。

## “列存索引”是什么？

OceanBase 数据库还支持列存索引的概念，不同于“对列存建索引”。列存索引指的是索引表的结构是列存格式。

例如，我们已经有行存表 `t6` ，希望对 `c3` 求和且性能最好，这时可以对 `c3` 建一个列存索引：

```shell
create table t6(
   c1 TINYINT,
   c2 SMALLINT,
   c3 MEDIUMINT
);

create /*+ parallel(2) */ index idx1 on t6(c3) with column group (each column);

```

除此之外，我们还支持更多索引创建方式：

- 支持索引中冗余行存。

  ```shell
  create index idx1 on t1(c2) storing(c1) with column group(all columns, each column);
  alter table t1 add index idx1 (c2) storing(c1) with column group(all columns, each column);

  ```
 - 支持索引中纯列存。

  ```
  create index idx1 on t1(c2) storing(c1) with column group(each column);
  alter table t1 add index idx1 (c2) storing(c1) with column group(each column);

  ```

在数据库索引中使用 `STORING` 子句的目的是存储额外的非索引列数据到索引中。这可以为特定的查询提供性能优化，既可以避免回表，也可以降低索引排序的代价。当查询仅需要访问存储在索引中的列，而不需要回表查询原始行时，可以大幅提升查询效率。

## 列存表与列存副本的区别是什么？

列存表是指表的分区 Leader & Follower 的 Schema 均为列存格式，并且 OLAP 的查询可以是强读；而列存副本是在保证表的分区 Leader & Follower 的 Schema 为行存格式的前提下，只读副本 Learner 为列存格式，并且 OLAP 的查询只能是弱读。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
