YMatrix 文档
关于 YMatrix
标准集群部署
数据写入
数据迁移
数据查询
运维监控
参考指南
- MPP 架构
- 镜像分布策略
- 持续聚集
- 滑动窗口
- Grafana 监控指标解读
- Prometheus 监控指标解读
- 术语表
-
工具指南
- mxaddmirrors
- mxbackup
- mxbench
- mxdeletesystem
- mxgate
- mxinitstandby
- mxmoveseg
- mxpacklogs
- mxrecover
- mxrestore
- mxshift
- mxstart
- mxstate
- mxstop
- gpconfig
-
数据类型
-
存储引擎
-
执行引擎
-
系统配置参数
SQL 参考
- ABORT
- ALTER_DATABASE
- ALTER_EXTENSION
- ALTER_EXTERNAL_TABLE
- ALTER_FOREIGN_DATA_WRAPPER
- ALTER_FOREIGN_TABLE
- ALTER_FUNCTION
- ALTER_INDEX
- ALTER_RESOURCE_GROUP
- ALTER_RESOURCE_QUEUE
- ALTER_ROLE
- ALTER_RULE
- ALTER_SCHEMA
- ALTER_SEQUENCE
- ALTER_SERVER
- ALTER_TABLE
- ALTER_TABLESPACE
- ALTER_TYPE
- ALTER_USER_MAPPING
- ALTER_VIEW
- ANALYZE
- BEGIN
- CHECKPOINT
- COMMIT
- COPY
- CREATE_DATABASE
- CREATE_EXTENSION
- CREATE_EXTERNAL_TABLE
- CREATE_FOREIGN_DATA_WRAPPER
- CREATE_FOREIGN_TABLE
- CREATE_FUNCTION
- CREATE_INDEX
- CREATE_RESOURCE_GROUP
- CREATE_RESOURCE_QUEUE
- CREATE_ROLE
- CREATE_RULE
- CREATE_SCHEMA
- CREATE_SEGMENT_SET
- CREATE_SEQUENCE
- CREATE_SERVER
- CREATE_TABLE
- CREATE_TABLE_AS
- CREATE_TABLESPACE
- CREATE_TYPE
- CREATE_USER_MAPPING
- CREATE_VIEW
- DELETE
- DROP_DATABASE
- DROP_EXTENSION
- DROP_EXTERNAL_TABLE
- DROP_FOREIGN_DATA_WRAPPER
- DROP_FOREIGN_TABLE
- DROP_FUNCTION
- DROP_INDEX
- DROP_RESOURCE_GROUP
- DROP_RESOURCE_QUEUE
- DROP_ROLE
- DROP_RULE
- DROP_SCHEMA
- DROP_SEGMENT_SET
- DROP_SEQUENCE
- DROP_SERVER
- DROP_TABLE
- DROP_TABLESPACE
- DROP_TYPE
- DROP_USER_MAPPING
- DROP_VIEW
- END
- EXPLAIN
- GRANT
- INSERT
- LOAD
- LOCK
- REINDEX
- RELEASE_SAVEPOINT
- RESET
- REVOKE
- ROLLBACK_TO_SAVEPOINT
- ROLLBACK
- SAVEPOINT
- SELECT INTO
- SET ROLE
- SET TRANSACTION
- SET
- SHOW
- START TRANSACTION
- TRUNCATE
- UPDATE
- VACUUM
常见问题(FAQ)
-
新架构 FAQ
- 听说 5.x 下不能随便重启 Supervisor 了,为什么,如果重启了会发生什么?
- 为什么每个服务器上都有 Shard / Cluster 服务进程,但只有一个是活跃(active)状态?
- etcd 是部署在每台主机上吗?
- 日常我们需要针对 etcd 做哪些运维操作?
- etcd 的数据量有多大?是否需要特别的运维工作?
- 引入 etcd 后,图形化界面部署数据库集群操作有哪些变化?
- 5.0 现版本如何在线扩容?
- 5.0 beta 号称实现了 Master Auto-failover,为什么 Master 关机并切换后,再开机 Master 不会自动恢复?
- 当故障自动转移(Auto-failover)发生在不同组件,会分别产生什么影响?我要如何进一步操作?
- YMatrix 5 单个组件启动
- 我不想安装 etcd,可以选择在 YMatrix 5.X 上安装无 etcd(非高可用)的集群吗?
- Master 发生自动切换的延迟是多久?
- Segment 是否可以被 supervisor 自动恢复?
- 当半数以上的 etcd 进程异常(被杀死或无法启动)后,集群出现宕机,是正常现象吗?
-
集群部署 FAQ
- error: could not access directory /data/mxdata_20221104084534/master/mxseg-1: Permission denied
- yum 安装 matrixdb 包后报错 cpio read error
- could not connect to server: No route to host
- setuptools 报告不支持参数:unknown distribution option:long_description_content_type
- ssh 默认端口不是 22
- 图形化界面初始化报错:ping <主机名1> error:lookup multiple ip:<IP 地址1>,<IP 地址1> ping <主机名2> error:lookup multiple ip:<IP 地址2>,<IP 地址2>
- 使用图形化界面部署 YMatrix 报错 failed to connect to host=mdw user=mxadmin database=postgres: dial error (dial tcp 192.168.247.132:5432: connect: connection refused)
- 添加主机失败 collect: do collect: unmarshal remote: json: cannot unmarshal string into Go struct field Disk.hardware.disk.ineligibleDesc of type mxi18n.Message
- 集群启动报错
- 图形化部署 YMatrix 报错:优化操作系统配置 ... 已撤销...
- 安装 YMatrix 安装包报错,缺少依赖
- 由于服务器内核参数配置异常导致 Supervisor 启动异常 panic: timeout to start gRPC service
- 安装 YMatrix 收集信息失败
- 初始化失败,报 failed: initialize_database: error execute /opt/ymatrix/matrixdb-5.0.0+enterprise/bin/initdb
- 可以使用 Nginx 为图形化界面配置域名吗?
- Interconnect error writing an outgoing packet: operation not permitted
- 由于环境限制,我没办法使用图形化部署 YMatrix,可以使用命令行部署的方式吗?
- /etc/hosts 文件缺少 localhost 配置选项导致 Supervisor 服务启动异常
- YMatrix 至少需要多少服务器才能实现新架构中 etcd 集群的高可用?
- 安装数据库时报错 LOG: gp_role forced to 'utility' in single-user mode Y.sh: line 1: 11865 Illegal instruction
-
SQL 查询 FAQ
- ERROR: EvalPlanQual can not handle subPlan with Motion node
- ERROR: Too many unresolved insertion xids, please do a vacuum
- ERROR: modification of distribution columns in OnConflictUpdate is not supported
- 图形化客户端收到 log:server closed the connection unexpectedly
- PARTITION 表简单 Filter 操作的 UNION ALL 查询比 IN 查询慢
- 插入 int 类型数据,单独查询跑很快,但放到 Plpgsql Function 里很慢
- PARTITION 分区裁剪更新操作,两个会话(Session)独立更新会导致互锁
- 自定义 type 使用及单表字段扩展
- ERROR,XX000,Right sibling's left-link doesn't match : block 817 links to 45366 instead of expected 70930 in index tab_idx
- 更新删除时报错 cannot delete from table &tablename because it does not have a replica identity and publishes deletes
- ERROR: could not read block 0 in file base/1588803/269422
- 行转列示例
- 列转行示例
- pg_hba.conf 文件内容配置的顺序导致的远程访问权限异常
- idle in transaction timeout 报错
- insufficient memory reserved for statement 报错
- evalplanqual can not hanlde subplan with motion node 报错
- 在客户端创建表在 Linux 上查询不到,但是客户端上可以查询到
- UUID 分布键插入数据出现数据丢失、数据重复问题
- 数据库对应的操作系统版本从 CentOS7 升级到 CentOS8,查询语句性能下降
- 执行 SQL 语句时显示 insufficient memory reserved for statement 错误
- 创建 matrixts 扩展时报错 ERROR: type mxkv_text already exist
-
MatrixGate FAQ
- 数据加载性能低
- failed to acquire resources on on or more segments ,fatal out of memory
- mxgate 发生锁等待卡住
- mxgate 排除某一列
- mxgate 流式加载增加列不停服的办法
- mxgate socket 文件缺失?
- data format error: invalid input syntax for type integer: 1970-01-01 00:00:01
- mxgate 入库时间字段默认值相差 8 小时
- Aborting operation regardless of REJECT LIMIT value, last error was: invalid input syntax for type timestamp: 22:31:01, column batch_num
- ERROR c.s.o.matrixdb.MatrixdbSource 77 -MatrixdbSource sendingPostRequest errorCode: 400, errorMsg: target table name is empty
- responseCode:500 errorMsg: ERROR: invalid byte sequence for encoding UTF8: 0x81
- body size exceeds the given limit
- you license is expired 2022-11-02
- 使用 MatrixGate 迁移数据报错:Cannot start source: --local-ip localhost is not a valid IP address
- 使用 MatrixGate 数据加载表数据存在双引号
- MatrixGate 升级
- MatrixGate 需要加载包含 unix 时间数据的数据文件,但数据文件中 unix 数据所在的字段不是第一个字段
- MatrixGate 加载数据文件中有 \N 字符
- MatrixGate 通过迁移模式写入时出现 Handshaking was terminated on port XXX
- MatrixGate 可以实现任意列时间戳转换吗?
- MatrixGate JAVA SDK JAR 包可以下载到本地导入吗?
- Kafka 消费 key 字段包含 @ 符号,数据解析找不到 value
- mxgate 迁移模式非 mxadmin 用户提示没有权限
-
运维 FAQ
- 忘记密码
- ssh_exchange_identification: Connection closed by remote host
- psql: WARNING: database testdb must be vacuumed within 529926866 transactions (seg35 192.168.247.129:6005 pid=448116)
- could not read block 3684552 of temporary file
- YMatrix 可以修改服务器主机名(Hostname)吗?
- 数据库启动报错 FATAL: database postgres does not exist
- rpc error: code = Unknown desc = primary not found in shard state
- mxaddmirrors 执行部署添加 Mirror 报错
- ERROR: replication slot internal_wal_replication_slot already exists
- ERROR: interconnect Error: Could not set up tcp listener socket
- 使用 mxshift 工具进行迁移之前,如何增加白名单?
- 如果我在内网环境使用 mxshift 工具,需要开通哪些端口?
- index ron requires 19160 bvtes, maximum size is 8191
-
监控告警 FAQ
- 可以离线安装 Grafana 监控吗?
- Grafana 报错 Annotation Query Failed No message available
- Grafana 发送邮件报错 smtp; 554 Reject by behaviour spam at Rcpt State(Connection IP address:***) ANTISPAM_BAT[01201311R106a,ay29a033002195086]: spfcheck failedCONTINUE
-
PXF FAQ
- remote component error,Failed connect to localhost:5888; Connection refused (libchurl.c:950)
- 文件入库时,某一个字段包含换行符,将一行数据切分成两行,再以分隔符切分,就会导致数据与字段数不一致,也就是说一行数据里有两个 \n 一个在中间一个在尾部 但是中间那个不能被当做换行符处理
- PXF 访问 S3 可以递归当前目录,或者所有子目录下的所有文件吗?
- PXF 可以读取 S3 存储上的文件吗?如何读取?
-
PLPython FAQ
- PLPython 和 Python 连接数据库操作的区别与优劣是什么?
- 如何在数据库中使用 PLPython
- PLPython 中如果需要第三方的库怎么安装?
- Python 访问 YMatrix 数据库示例
- Python 批量插入数据示例
- PLPython 中使用 Python 代码
- PLPython 标准异常处理
- 使用 traceback 处理 PLPython 异常
-
性能 FAQ
CREATE INDEX
定义一个新索引。
概要
CREATE [UNIQUE] INDEX [ CONCURRENTLY ] [name] ON table_name [USING method]
( {column_name | (expression)} [COLLATE parameter] [opclass] [ ASC | DESC ] [ NULLS { FIRST | LAST } ] [, ...] )
[ WITH ( storage_parameter = value [, ... ] ) ]
[ TABLESPACE tablespace ]
[ WHERE predicate ]
描述
CREATE INDEX在指定表的指定列上构造索引。 索引主要用于增强数据库性能(尽管使用不当会导致性能降低)。
索引的键字段指定为列名,或者指定为用括号括起来的表达式。 如果index方法支持多列索引,则可以指定多个字段。
索引字段可以是根据表行的一个或多个列的值计算的表达式。 该功能可用于基于基本数据的某种转换来快速访问数据。 例如,在upper(col)上计算的索引将允许子句WHERE upper(col) = 'JIM'使用索引。
YMatrix 数据库提供了索引方法B树,位图,GiST,SP-GiST和GIN。 用户还可以定义自己的索引方法,但这相当复杂。
存在WHERE子句时,将创建部分索引。 部分索引是仅包含表一部分的条目的索引,通常索引的部分比表的其余部分更有用。 例如,如果您有一个既包含开票订单又包含未开票订单的表, 其中未开票订单仅占总表的一小部分,但最常被选择,则可以通过仅在该部分上创建索引来提高性能。
WHERE子句中使用的表达式可能仅引用基础表的列,但它可以使用所有列,而不仅仅是被索引的列。 WHERE中也禁止子查询和聚合表达式。 相同的限制适用于作为表达式的索引字段。
索引定义中使用的所有函数和运算符必须是不可变的。 它们的结果必须仅取决于其参数,而不得取决于任何外部影响(例如另一个表的内容或参数值)。 此限制可确保索引的行为得到良好定义。 要在索引表达式或WHERE子句中使用用户定义的函数, 请记住在创建函数时将其标记为IMMUTABLE。
参数
UNIQUE
- 创建索引并每次添加数据时,检查表中是否有重复值。 重复的条目将产生错误。 唯一索引仅适用于B树索引。 在 YMatrix 数据库中,仅当索引键的列与 YMatrix 分布键相同(或超集)时,才允许唯一索引。 在分区表上,唯一索引仅在单个分区中受支持 - 不可以跨所有分区。
CONCURRENTLY
- 创建索引时不启用任何防止插入、更新及删除操作的锁。一个标准索引的创建过程会对写操作上锁(但读操作不会受到影响)直到创建完成,但当 CONCURRENTLY 选项被打开,YMatrix 将不用启用所有对写操作的锁。对于临时表,CREATE INDEX 语句通常是非并发的,因为没有其他会话可以进入。非并发的索引创建过程开销也较小。
name
- 要创建的索引的名称。 索引始终与其父表在相同的模式中创建。 如果省略该名称,则 YMatrix 数据库将基于父表的名称和索引列的名称选择一个合适的名称。
table_name
- 要建立索引的表的名称(可以由模式指定)。
method
- 要使用的索引方法的名称。 选择为btree,bitmap, gist,spgist和gin。 默认方法是btree。
当前,仅B树,GiST和GIN索引方法支持多列索引。 默认情况下,最多可以指定32个字段。 当前只有B树支持唯一索引。
column_name
- 在其上创建索引的表的列的名称。 仅B树,位图,GiST和GIN索引方法支持多列索引。
expression
- 一种基于表的一个或多个列的表达式。 表达式通常必须用括号括起来,如语法所示。 但是,如果表达式具有函数调用的形式,则可以省略括号。
collation
- 索引使用的归类名称。 默认情况下,索引使用为要建立索引的列声明的归类或要建立索引的表达式的结果归类。 具有非默认归类的索引对于涉及使用非默认归类的表达式的查询很有用。
opclass
- 运算符类的名称。 operator类标识该列的索引要使用的运算符。 例如,在四字节整数上的B树索引将使用int4_ops类(此运算符类包含四字节整数的比较函数)。 实际上,列数据类型的默认运算符类通常就足够了。 拥有运算符类的要点是,对于某些数据类型,可能会有不止一种有意义的排序。 例如,复数数据类型可以按绝对值或实数进行排序。 为此,我们可以为数据类型定义两个运算符类,然后在创建索引时选择适当的类。
ASC
- 指定升序排序(默认)。
DESC
- 指定降序排序。
NULLS FIRST
- 指定null排在非null之前。当指定DESC时,这是默认设置。
NULLS LAST
- 指定空值在非空值之后排序。如果未指定DESC,这是默认设置。
storage_parameter
- 特定于索引方法的存储参数的名称。 每个索引方法都有其自己的一组允许的存储参数。
FILLFACTOR-B树,位图,GiST和SP-GiST索引方法都接受此参数。 索引的FILLFACTOR是一个百分比,它确定索引方法将尝试打包索引页面的程度。 对于B树,在初始索引构建期间以及在向右扩展索引时(添加新的最大键值),叶子页将填充到该百分比。 如果页面随后完全填满,它们将被拆分,从而导致索引效率逐渐下降。 B树使用默认填充因子90,但可以选择10到100之间的任何整数值。 如果表是静态的,则fillfactor 100最好最大程度地减小索引的物理大小, 但是对于大量更新的表,较小的fillfactor更好地最小化对页面拆分的需求。 其他索引方法以不同但大致相似的方式使用fillfactor;默认的填充因子因方法而异。
BUFFERING - 除FILLFACTOR之外,GiST索引还接受BUFFERING参数。 BUFFERING确定 YMatrix 数据库是否使用PostgreSQL文档中GiST缓冲构建中描述的缓冲构建技术构建索引。 如果设置为OFF,则禁用它; 如果设置为ON,则启用; 将其设置为AUTO时,最初将其禁用;但是,一旦索引大小达到有效缓存大小,它就会即时打开。 默认为AUTO。
FASTUPDATE - GIN索引方法接受FASTUPDATE存储参数。 FASTUPDATE是一个布尔参数,用于禁用或启用GIN索引快速更新技术。 值ON启用快速更新(默认值),而值OFF禁用它。 有关更多信息,请参见PostgreSQL文档中的GIN快速更新技术。
tablespace_name
- 在其中创建索引的表空间。如果未指定,则使用默认表空间。
predicate
- 部分索引的约束表达式。
注解
可以为索引的每一列指定一个运算符类。 operator类标识该列的索引要使用的运算符。 例如,在四字节整数上的B树索引将使用int4_ops类。 此运算符类包含用于四字节整数的比较函数。 实际上,列数据类型的默认运算符类通常就足够了。 拥有运算符类的要点是,对于某些数据类型,可能会有不止一种有意义的排序。 例如,我们可能想按绝对值或实数对复数数据类型进行排序。 为此,我们可以为数据类型定义两个运算符类,然后在创建索引时选择适当的类。
对于支持排序扫描的索引方法(当前仅支持B树), 可以指定可选的子句ASC,DESC, NULLS FIRST和/或NULLS LAST来修改索引的排序顺序。 由于可以向前或向后扫描有序索引,因此创建单列DESC索引通常没有用 - 常规索引已经可以使用排序顺序。 这些选项的值在于可以创建与混合排序查询所请求的排序顺序匹配的多列索引, 例如SELECT ... ORDER BY x ASC, y DESC。 如果您需要在依赖索引以避免排序步骤的查询中支持“nulls sort low”行为, 而不是默认的“nulls sort high”行为,则NULLS选项很有用。
对于大多数索引方法,创建索引的速度取决于maintenance_work_mem的设置。 较大的值将减少索引创建所需的时间,只要您不使其大于实际可用的内存量即可,这会促使计算机进行交换。
在分区表上创建索引后,该索引将传播到 Matrix 数据库创建的所有子表。 不支持在由 YMatrix 数据库创建的表上创建索引以供分区表使用。
仅当索引列与 YMatrix 分布键列相同(或超集)时,才允许使用UNIQUE索引。
附加优化表上不允许使用UNIQUE索引。
可以在分区表上创建UNIQUE索引。 但是,唯一性仅在分区内有效。 分区之间不强制唯一性。 例如,对于具有基于年份的分区和基于季度的子分区的分区表,仅在每个单独的季度分区上实施唯一性。 季度分区之间不强制唯一性。
默认情况下,索引不用于IS NULL子句。 在这种情况下,使用索引的最佳方法是使用IS NULL谓词创建部分索引。
对于具有100到100,000个不同值的列,位图索引的性能最佳。 对于具有超过100,000个不同值的列,位图索引的性能和空间效率会下降。 位图索引的大小与表中的行数乘以索引列中不同值的数量成正比。
少于100个不同值的列通常不会从任何类型的索引中受益太多。 例如,对于男性和女性仅具有两个不同值的性别列将不是索引的理想选择。
YMatrix 数据库的先前版本也具有R树索引方法。 该方法已被删除,因为它与GiST方法相比没有明显的优势。 如果指定了USING rtree,则CREATE INDEX会将其解释为USING gist。
哈希索引的使用已在 YMatrix 数据库中禁用。
示例
要在films表的title列上创建B树索引:
CREATE UNIQUE INDEX title_idx ON films (title);
要在表employee中的gender列上创建位图索引:
CREATE INDEX gender_bmp_idx ON employee USING bitmap
(gender);
要在表达式lower(title)上创建索引,以允许有效的不区分大小写的搜索:
CREATE INDEX ON films ((lower(title)));
(在此示例中,我们选择省略索引名称,因此系统将选择一个名称,通常为films_lower_idx。)
要使用非默认排序规则创建索引:
CREATE INDEX title_idx_german ON films (title COLLATE "de_DE");
要创建具有非默认填充因子的索引:
CREATE UNIQUE INDEX title_idx ON films (title) WITH
(fillfactor = 70);
要创建禁用了快速更新的GIN索引:
CREATE INDEX gin_idx ON documents_table USING gin (locations) WITH (fastupdate = off);
要在表films的列code上创建索引并使索引驻留在表空间indexspace中:
CREATE INDEX code_idx ON films(code) TABLESPACE indexspace;
要在point属性上创建GiST索引,以便我们可以对转换函数的结果有效地使用box运算符:
CREATE INDEX pointloc ON points USING gist (box(location,location));
SELECT * FROM points WHERE box(location,location) && '(0,0),(1,1)'::box;
不启用对写操作的锁创建索引:
CREATE INDEX CONCURRENTLY sales_quantity_index ON sales_table (quantity);
兼容性
CREATE INDEX是 YMatrix 数据库语言的扩展。 SQL标准中没有索引的规定。