Klustron 不支持的PostgreSQL语法和功能汇总
Klustron 不支持的PostgreSQL语法和功能汇总
Klustron(原KunlunBase) 支持大多数 PostgreSQL DDL SQL 语法和几乎全部 DML SQL 语法,下文列出的功能点除外。 对于Klustron 支持的SQL语法和功能用法,可以 参考PostgreSQL文档
一、不支持的功能特性
外键
创建外键的DDL语句会被忽略,返回客户端警告消息而不是错误消息。这样,数据导入可以正常运行,只是在KlustronDB中,不存在外键约束。
数组类型 和 Range 类型
从Klustron-1.3版本开始,支持了元素类型为数值类型的任意维度的数组类型。
数据流式复制,包括基于 WAL 的物理复制以及逻辑复制
执行这些功能对应的DDL语句,KlustronDB均会报错。KlustronDB 在存储shard中有独特的Fullsync高可用机制,基于MySQL的binlog replication.
数据表和索引的存储相关选项
- create table 语句的所有
storage params(存储参数),以及表空间(TABLESPACE)选项。这些选项会被忽略并返回警告消息给客户端。新增了适应于Klustron的存储选项。 exclude约束:不支持,如果使用了则报错。- 索引的
include字段:忽略。Include字段用于实现覆盖索引的效果,忽略后索引功能可以正常工作。 - 系统列(OID, CTID 等)。注意,tableOID系统列仍然有效,可以正常使用。
这些操作不可以针对用户数据表执行操作,可以针对计算节点本地存储的元数据表执行操作。
- create table 语句的所有
针对数据表的存储管理命令
包括
cluster,vacuum,reindex。这些命令自1.3.3 版本开始支持,在此之前的版本会报错。支持的方式:
- CLUSTER命令:直接忽略,因为KlustronDB的数据存储方式是b+tree 而不是heap, 不需要此操作。
- VACUUM 和 REINDEX 命令:发送OPTIMIZE TABLE 命令给目标表。
原本PostgreSQL的后台进程自动定期执行的 autovacuum 仍然会后台定期自动运行。由于在计算节点中仅存储元数据表,占用空间极小(通常几个MB),因此与PostgreSQL不同,KlustronDB中定期自动运行的VACUUM不会消耗大量IO带宽,不会影响系统性能。
'create table as select from'语句该语句自Klustron-1.2 版本开始支持。
CREATE/ALTER/DROP TABLESPACE语句以及表空间管理功能Klustron不使用PostgreSQL的存储引擎存储用户数据,因此不支持PostgreSQL的表空间管理功能。
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+treertree索引类型:不支持;但是Klustron支持使用空间索引类型,配合PostGIS扩展组件。exclude子句:不支持,如果使用了就会报错。
从Klustron-1.3和Klustron-1.2.2版本开始,可以成功创建partial索引,partial 选项被忽略,也就是所有数据行都会有索引行,这样并不会影响查询结果的正确性,仅在理论上对查询性能可能有一些影响。
create / alter database的TABLESPACE 选项, 这些选项会被忽略。CREATE/ALTER TABLE不支持的功能 Klustron自动忽略这些选项:SET { WITH | WITHOUT } OIDSSET { LOGGED | UNLOGGED }- 列和表级别的外键约束
- CLUSTER 选项:CLUSTER ON index_name ; SET WITHOUT CLUSTER
- 表空间(TABLESPACE )选项
- 存储参数
- 流复制设置(含有
REPLICA关键字的子句)
不可以在显式事务中执行DDL语句
这个要求与MySQL一致,对于PostgreSQL用户来说,如果有此情形,则需要修改一下SQL代码:每一个DDL 都不能放在显式启动的事务中执行。
Klustron 1.1 不支持但是 从 Klustron 1.2 版本起,支持的功能 存储过程,触发器,物化视图,policy(即row level security),domain, json数据管理
从Klustron-1.3版本开始,支持PostGIS和PGVector插件
必须使用Klustron自带的PostGIS和PGVector插件,不可以使用PostgreSQL社区的版本。PostgreSQL社区的其他extension插件,只要支持PostgreSQL-11 版本(几乎全部如此),就可以挂载到Klustron的计算节点正常工作,但是需要使用Klustron的头文件编译该插件。
二、与 PostgreSQL 有差异的功能特性
加列 ALTER TABLE ADD COLUMN
对已有的表新加的列,如果有缺省值的话,缺省值不可以是MySQL无法执行的表达式,只能是常量或者MySQL可以执行的表达式。例如,表达式中的函数和运算符必须在MySQL中存在和支持。 另外,如果这个新增列是sequence类型,那么这个表只能新增一列这样的sequence列,因为Klustron会在存储节点中将该列定义为MySQL的自增列,以便为已有的行的该列新字段自动赋值。而MySQL的每个表只允许一个自增列。
索引的
'nulls first' / 'nulls last'选项无论指定哪个选项,总是使用MySQL的默认方式(nulls first),与PostgreSQL的默认方式(nulls last) 刚好相反。
数据类型支持
- 时间戳的有效范围缩小到了
[ '0000-01-01 00:00:00.000000' , '9999-12-31 23:59:59.999999' ]. - 日期类型的有效范围缩小到了
[ '0000-01-01' , '9999-12-31' ].
- 时间戳的有效范围缩小到了
json查询中的问号(?)运算符 Klustron中不支持在json查询中使用问号(?)运算符,例如
SELECT jsonb '{"a":null, "b":"qq"}' ? 'a';因为问号(?) 用于MySQL 语法的prepare statement 查询语句中做参数占位符了。用户可以使用json_exists() 来做等价的检查。
从Klustron-1.3版本开始,这个运算符在MySQL连接中仍然作为prepared statemenet的参数占位符,但是在PostgreSQL连接中可以作为普通的运算符使用,包括可以作为JSON数据查找运算符。
