在对比 Oracle、MySQL 和 PostgreSQL 关于 range/list 分区键更新操作时,
-
Oracle:
- 默认情况下不允许对分区键进行更新操作,否则会报错
ORA-14402: updating partition key column would cause partition to change
。 - 可以通过设置
ALTER TABLE table_name ENABLE ROW MOVEMENT;
来允许分区键的更新操作,这将允许数据跨分区移动 。
- 默认情况下不允许对分区键进行更新操作,否则会报错
-
MySQL:
- MySQL 支持在分区表上执行 UPDATE 操作,但必须确保更新的数据满足分区规则,即更新后的分区键值必须位于正确的分区中 。
- 对于 RANGE 分区,可以使用
ALTER TABLE ... REORGANIZE PARTITION
来移动数据到不同的分区 。
-
PostgreSQL:
- PostgreSQL 在 10 版本之前不支持分区表,从 10 版本开始引入分区表,但在 11 版本之前不支持分区键的更新操作 。
- 从 11 版本开始,PostgreSQL 支持分区键的更新操作,如果分区键字段被更新,系统会自动将记录转移到合适的分区中 。
PG和MySQL的区别
特性 | MySQL | PostgreSQL |
---|---|---|
实例 | 通过执行 MySQL 命令(mysqld)启动实例。 一个实例可以管理一个或多个数据库。 一台服务器可以运行多个 mysqld 实例。 一个实例管理器可以监视 mysqld 的各个实例。 | 通过执行 Postmaster 进程(pg_ctl)启动实例。 一个实例可以管理一个或多个数据库,这些数据库组成一个集群。集群是磁盘上的一个区域,这个区域在安装时初始化并由一个目录组成,所有数据都存储在这个目录中。 使用 initdb 创建第一个数据库。 一台机器上可以启动多个实例。 |
数据库 | 数据库是命名的对象集合,是与实例中的其他数据库分离的实体。一个 MySQL 实例中的所有数据库共享同一个系统编目。 | 数据库是命名的对象集合,每个数据库是与其他数据库分离的实体。每个数据库有自己的系统编目,但是所有数据库共享 pg_databases。 |
数据缓冲区 | 通过 innodb_buffer_pool_size 配置参数设置数据缓冲区。这个参数是内存缓冲区的字节数,InnoDB 使用这个缓冲区来缓存表的数据和索引。在专用的数据库服务器上,这个参数最高可以设置为机器物理内存量的 80%。 | Shared_buffers 缓存。在默认情况下分配 64 个缓冲区。默认的块大小是 8K。可以通过设置 postgresql |