跳至主要內容

Klustron 不支持的PostgreSQL语法和功能汇总

Klustron大约 5 分钟

Klustron 不支持的PostgreSQL语法和功能汇总

Klustron(原KunlunBase) 支持大多数 PostgreSQL DDL SQL 语法和几乎全部 DML SQL 语法,下文列出的功能点除外。 对于Klustron 支持的SQL语法和功能用法,可以 参考PostgreSQL文档open in new window

一、不支持的功能特性

  1. 外键

    创建外键的DDL语句会被忽略,返回客户端警告消息而不是错误消息。这样,数据导入可以正常运行,只是在KlustronDB中,不存在外键约束。

  2. 数组类型 和 Range 类型

    从Klustron-1.3版本开始,支持了元素类型为数值类型的任意维度的数组类型。

  3. 数据流式复制,包括基于 WAL 的物理复制以及逻辑复制

    执行这些功能对应的DDL语句,KlustronDB均会报错。KlustronDB 在存储shard中有独特的Fullsync高可用机制,基于MySQL的binlog replication.

  4. 数据表和索引的存储相关选项

    • create table 语句的所有 storage params(存储参数),以及表空间(TABLESPACE)选项。这些选项会被忽略并返回警告消息给客户端。新增了适应于Klustron的存储选项
    • exclude约束:不支持,如果使用了则报错。
    • 索引的include字段:忽略。Include字段用于实现覆盖索引的效果,忽略后索引功能可以正常工作。
    • 系统列(OID, CTID 等)。注意,tableOID系统列仍然有效,可以正常使用。

    这些操作不可以针对用户数据表执行操作,可以针对计算节点本地存储的元数据表执行操作。

  5. 针对数据表的存储管理命令

    包括 cluster, vacuum, reindex

    这些命令自1.3.3 版本开始支持,在此之前的版本会报错。支持的方式:

    • CLUSTER命令:直接忽略,因为KlustronDB的数据存储方式是b+tree 而不是heap, 不需要此操作。
    • VACUUM 和 REINDEX 命令:发送OPTIMIZE TABLE 命令给目标表。

    原本PostgreSQL的后台进程自动定期执行的 autovacuum 仍然会后台定期自动运行。由于在计算节点中仅存储元数据表,占用空间极小(通常几个MB),因此与PostgreSQL不同,KlustronDB中定期自动运行的VACUUM不会消耗大量IO带宽,不会影响系统性能。

  6. 'create table as select from'语句

    该语句自Klustron-1.2 版本开始支持。

  7. CREATE/ALTER/DROP TABLESPACE 语句以及表空间管理功能

    Klustron不使用PostgreSQL的存储引擎存储用户数据,因此不支持PostgreSQL的表空间管理功能。

  8. create index高级功能 Klustron 不支持这些索引选项和功能:

    • 表达式作为索引字段
    • partial index 选项:忽略。此选项用于忽略某些数据行不为它们插入索引行。
    • CONCURRENT选项:忽略
    • include子句:忽略
    • 'COLLATE'子句 :禁止, 不可以使用其他COLLATION来做字符串比较和排序,仅可以使用该列的COLLATION。
    • 'nulls first' / 'nulls last' :如果指定了会被自动忽略,总是使用MySQL的默认方式(nulls first),与 PostgreSQL的默认方式(nulls last) 刚好相反。
    • opclass禁止,如果指定了会报错
    • hash索引类型:由于MySQL 不支持hash index,所以即使指定了也会被自动忽略,索引仍然使用b+tree
    • rtree索引类型:不支持;但是Klustron支持使用空间索引类型,配合PostGIS扩展组件。
    • exclude子句:不支持,如果使用了就会报错。

    从Klustron-1.3和Klustron-1.2.2版本开始,可以成功创建partial索引,partial 选项被忽略,也就是所有数据行都会有索引行,这样并不会影响查询结果的正确性,仅在理论上对查询性能可能有一些影响。

  9. create / alter database 的TABLESPACE 选项, 这些选项会被忽略。

  10. CREATE/ALTER TABLE不支持的功能 Klustron自动忽略这些选项:

    • SET { WITH | WITHOUT } OIDS
    • SET { LOGGED | UNLOGGED }
    • 列和表级别的外键约束
    • CLUSTER 选项:CLUSTER ON index_name ; SET WITHOUT CLUSTER
    • 表空间(TABLESPACE )选项
    • 存储参数open in new window
    • 流复制设置(含有REPLICA关键字的子句)
  11. 不可以在显式事务中执行DDL语句

    这个要求与MySQL一致,对于PostgreSQL用户来说,如果有此情形,则需要修改一下SQL代码:每一个DDL 都不能放在显式启动的事务中执行。

  12. Klustron 1.1 不支持但是 从 Klustron 1.2 版本起,支持的功能 存储过程,触发器,物化视图,policy(即row level security),domain, json数据管理

  13. 从Klustron-1.3版本开始,支持PostGIS和PGVector插件

    必须使用Klustron自带的PostGIS和PGVector插件,不可以使用PostgreSQL社区的版本。PostgreSQL社区的其他extension插件,只要支持PostgreSQL-11 版本(几乎全部如此),就可以挂载到Klustron的计算节点正常工作,但是需要使用Klustron的头文件编译该插件。

二、与 PostgreSQL 有差异的功能特性

  1. 加列 ALTER TABLE ADD COLUMN

    对已有的表新加的列,如果有缺省值的话,缺省值不可以是MySQL无法执行的表达式,只能是常量或者MySQL可以执行的表达式。例如,表达式中的函数和运算符必须在MySQL中存在和支持。 另外,如果这个新增列是sequence类型,那么这个表只能新增一列这样的sequence列,因为Klustron会在存储节点中将该列定义为MySQL的自增列,以便为已有的行的该列新字段自动赋值。而MySQL的每个表只允许一个自增列。

  2. 索引的 'nulls first' / 'nulls last' 选项

    无论指定哪个选项,总是使用MySQL的默认方式(nulls first),与PostgreSQL的默认方式(nulls last) 刚好相反。

  3. 数据类型支持

    • 时间戳的有效范围缩小到了 [ '0000-01-01 00:00:00.000000' , '9999-12-31 23:59:59.999999' ].
    • 日期类型的有效范围缩小到了 [ '0000-01-01' , '9999-12-31' ].
  4. json查询中的问号(?)运算符 Klustron中不支持在json查询中使用问号(?)运算符,例如

    SELECT jsonb '{"a":null, "b":"qq"}' ? 'a';
    

    因为问号(?) 用于MySQL 语法的prepare statement 查询语句中做参数占位符了。用户可以使用json_exists() 来做等价的检查。

    从Klustron-1.3版本开始,这个运算符在MySQL连接中仍然作为prepared statemenet的参数占位符,但是在PostgreSQL连接中可以作为普通的运算符使用,包括可以作为JSON数据查找运算符。

END