diff --git a/product/zh/docs-mogdb/v1.1.0/reference-guide/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md b/product/zh/docs-mogdb/v1.1.0/reference-guide/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md index 96991973aeeca02a018bd7c345d450bdd89b20ad..0583bf018711b49d64dfa11cf62a542e9f0e5936 100644 --- a/product/zh/docs-mogdb/v1.1.0/reference-guide/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md +++ b/product/zh/docs-mogdb/v1.1.0/reference-guide/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md @@ -18,5 +18,6 @@ LOCAL_THREADPOOL_STATUS视图显示线程池下工作线程及会话的状态信 | bind_numa_id | integer | 该线程池组绑定的NUMA ID。 | | bind_cpu_number | integer | 该线程池组绑定的CPU信息。如果未绑定CPU,该值为NULL。 | | listener | integer | 该线程池组的Listener线程数量。 | -| worker_info | text | 线程池中线程相关信息,包括以下信息:
- default: 该线程池组中的初始线程数量。
- new: 该线程池组中新增线程的数量。
- expect: 该线程池组中预期线程的数量。
- actual: 该线程池组中实际线程的数量。
- idle: 该线程池组中空闲线程的数量。
- pending: 该线程池组中等待线程的数量。 | +| worker_info | text | 线程池中worker线程相关信息,包括以下信息:
- default: 该线程池组中的初始线程数量。
- new: 该线程池组中新增线程的数量。
- expect: 该线程池组中预期线程的数量。
- actual: 该线程池组中实际线程的数量。
- idle: 该线程池组中空闲线程的数量。
- pending: 该线程池组中等待线程的数量。 | | session_info | text | 线程池中会话相关信息,包括以下信息:
- total: 该线程池组中所有的会话数量。
- waiting: 该线程池组中等待调度的会话数量。
- running: 该线程池中正在执行的会话数量。
- idle: 该线程池组中空闲的会话数量。 | +| stream_info | text | 线程池中stream线程相关信息,包括以下信息:
- total: 该线程池组中所有的stream线程数量。
- running: 该线程池中正在执行的stream线程数量。
- idle: 该线程池组中空闲的stream线程数量 | \ No newline at end of file diff --git a/product/zh/docs-mogdb/v2.0.0/reference-guide/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md b/product/zh/docs-mogdb/v2.0.0/reference-guide/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md index 96991973aeeca02a018bd7c345d450bdd89b20ad..0583bf018711b49d64dfa11cf62a542e9f0e5936 100644 --- a/product/zh/docs-mogdb/v2.0.0/reference-guide/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md +++ b/product/zh/docs-mogdb/v2.0.0/reference-guide/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md @@ -18,5 +18,6 @@ LOCAL_THREADPOOL_STATUS视图显示线程池下工作线程及会话的状态信 | bind_numa_id | integer | 该线程池组绑定的NUMA ID。 | | bind_cpu_number | integer | 该线程池组绑定的CPU信息。如果未绑定CPU,该值为NULL。 | | listener | integer | 该线程池组的Listener线程数量。 | -| worker_info | text | 线程池中线程相关信息,包括以下信息:
- default: 该线程池组中的初始线程数量。
- new: 该线程池组中新增线程的数量。
- expect: 该线程池组中预期线程的数量。
- actual: 该线程池组中实际线程的数量。
- idle: 该线程池组中空闲线程的数量。
- pending: 该线程池组中等待线程的数量。 | +| worker_info | text | 线程池中worker线程相关信息,包括以下信息:
- default: 该线程池组中的初始线程数量。
- new: 该线程池组中新增线程的数量。
- expect: 该线程池组中预期线程的数量。
- actual: 该线程池组中实际线程的数量。
- idle: 该线程池组中空闲线程的数量。
- pending: 该线程池组中等待线程的数量。 | | session_info | text | 线程池中会话相关信息,包括以下信息:
- total: 该线程池组中所有的会话数量。
- waiting: 该线程池组中等待调度的会话数量。
- running: 该线程池中正在执行的会话数量。
- idle: 该线程池组中空闲的会话数量。 | +| stream_info | text | 线程池中stream线程相关信息,包括以下信息:
- total: 该线程池组中所有的stream线程数量。
- running: 该线程池中正在执行的stream线程数量。
- idle: 该线程池组中空闲的stream线程数量 | \ No newline at end of file diff --git a/product/zh/docs-mogdb/v2.0.1/reference-guide/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md b/product/zh/docs-mogdb/v2.0.1/reference-guide/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md index 96991973aeeca02a018bd7c345d450bdd89b20ad..0583bf018711b49d64dfa11cf62a542e9f0e5936 100644 --- a/product/zh/docs-mogdb/v2.0.1/reference-guide/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md +++ b/product/zh/docs-mogdb/v2.0.1/reference-guide/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md @@ -18,5 +18,6 @@ LOCAL_THREADPOOL_STATUS视图显示线程池下工作线程及会话的状态信 | bind_numa_id | integer | 该线程池组绑定的NUMA ID。 | | bind_cpu_number | integer | 该线程池组绑定的CPU信息。如果未绑定CPU,该值为NULL。 | | listener | integer | 该线程池组的Listener线程数量。 | -| worker_info | text | 线程池中线程相关信息,包括以下信息:
- default: 该线程池组中的初始线程数量。
- new: 该线程池组中新增线程的数量。
- expect: 该线程池组中预期线程的数量。
- actual: 该线程池组中实际线程的数量。
- idle: 该线程池组中空闲线程的数量。
- pending: 该线程池组中等待线程的数量。 | +| worker_info | text | 线程池中worker线程相关信息,包括以下信息:
- default: 该线程池组中的初始线程数量。
- new: 该线程池组中新增线程的数量。
- expect: 该线程池组中预期线程的数量。
- actual: 该线程池组中实际线程的数量。
- idle: 该线程池组中空闲线程的数量。
- pending: 该线程池组中等待线程的数量。 | | session_info | text | 线程池中会话相关信息,包括以下信息:
- total: 该线程池组中所有的会话数量。
- waiting: 该线程池组中等待调度的会话数量。
- running: 该线程池中正在执行的会话数量。
- idle: 该线程池组中空闲的会话数量。 | +| stream_info | text | 线程池中stream线程相关信息,包括以下信息:
- total: 该线程池组中所有的stream线程数量。
- running: 该线程池中正在执行的stream线程数量。
- idle: 该线程池组中空闲的stream线程数量 | \ No newline at end of file diff --git a/product/zh/docs-mogdb/v2.1/reference-guide/schema/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md b/product/zh/docs-mogdb/v2.1/reference-guide/schema/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md index 96991973aeeca02a018bd7c345d450bdd89b20ad..0583bf018711b49d64dfa11cf62a542e9f0e5936 100644 --- a/product/zh/docs-mogdb/v2.1/reference-guide/schema/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md +++ b/product/zh/docs-mogdb/v2.1/reference-guide/schema/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md @@ -18,5 +18,6 @@ LOCAL_THREADPOOL_STATUS视图显示线程池下工作线程及会话的状态信 | bind_numa_id | integer | 该线程池组绑定的NUMA ID。 | | bind_cpu_number | integer | 该线程池组绑定的CPU信息。如果未绑定CPU,该值为NULL。 | | listener | integer | 该线程池组的Listener线程数量。 | -| worker_info | text | 线程池中线程相关信息,包括以下信息:
- default: 该线程池组中的初始线程数量。
- new: 该线程池组中新增线程的数量。
- expect: 该线程池组中预期线程的数量。
- actual: 该线程池组中实际线程的数量。
- idle: 该线程池组中空闲线程的数量。
- pending: 该线程池组中等待线程的数量。 | +| worker_info | text | 线程池中worker线程相关信息,包括以下信息:
- default: 该线程池组中的初始线程数量。
- new: 该线程池组中新增线程的数量。
- expect: 该线程池组中预期线程的数量。
- actual: 该线程池组中实际线程的数量。
- idle: 该线程池组中空闲线程的数量。
- pending: 该线程池组中等待线程的数量。 | | session_info | text | 线程池中会话相关信息,包括以下信息:
- total: 该线程池组中所有的会话数量。
- waiting: 该线程池组中等待调度的会话数量。
- running: 该线程池中正在执行的会话数量。
- idle: 该线程池组中空闲的会话数量。 | +| stream_info | text | 线程池中stream线程相关信息,包括以下信息:
- total: 该线程池组中所有的stream线程数量。
- running: 该线程池中正在执行的stream线程数量。
- idle: 该线程池组中空闲的stream线程数量 | \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/about-mogdb/mogdb-new-feature/3.0.0.md b/product/zh/docs-mogdb/v3.0/about-mogdb/mogdb-new-feature/3.0.0.md index bd611e597675e7fe1a0c298db3e093d9049eb714..07d0f346ed8c36056c6f6f399d2b965d335a5575 100644 --- a/product/zh/docs-mogdb/v3.0/about-mogdb/mogdb-new-feature/3.0.0.md +++ b/product/zh/docs-mogdb/v3.0/about-mogdb/mogdb-new-feature/3.0.0.md @@ -17,21 +17,21 @@ MogDB 3.0.0版本于2022年6月30日发布。3.0.0版本基于2.1版本进一步 ### 2.1 集成openGauss 3.0.0版本新增特性 -- 行存转向量化 -- 延迟进入最大可用模式 -- 并行逻辑解码 -- CM(Cluster Manager) -- global syscache -- 发布订阅 -- 外键锁增强 -- 行存表压缩 -- Data Studio工具开源 -- MySQL到openGauss的迁移工具chameleon -- 支持使用中间件shardingSphere构建分布式数据库 -- 支持kubernetes部署分布式数据库 -- 支持ANY权限管理 -- DBMind组件化 -- 库内AI算法支持XGBoost、multiclass和PCA +- [行存转向量化](12-row-store-execution-to-vectorized-execution) +- [延迟进入最大可用模式](11-delaying-entering-the-maximum-availability-mode) +- [并行逻辑解码](12-parallel-logical-decoding) +- [CM(Cluster Manager)](unified-database-management-tool) +- [global syscache](15-global-syscache) +- [发布订阅](16-publication-subscription) +- [外键锁增强](17-foreign-key-lock-enhancement) +- [行存表压缩](CREATE-TABLE) +- [Data Studio工具开源](mogdb-client-tool-datastudio) +- [MySQL到openGauss的迁移工具chameleon](mysql-to-mogdb-migration-tool-chameleon) +- [支持使用中间件shardingSphere构建分布式数据库](distributed-database-capability) +- [支持kubernetes部署分布式数据库](deploying-a-distributed-database-using-kubernetes) +- [支持ANY权限管理](GRANT) +- [DBMind组件化](ai4db-autonomous-database-o&m) +- [库内AI算法支持XGBoost、multiclass和PCA](native-db4ai-engine) ### 2.2 Cluster Manager (CM) @@ -41,6 +41,8 @@ MogDB 3.0.0版本于2022年6月30日发布。3.0.0版本基于2.1版本进一步 - 要求至少有三台服务器安装CM组件; - 数据库服务器可以是一主一备两台机器。 +**相关页面**:[CM](14-cm) + ### 2.3 性能增强 #### 2.3.1 事务异步提交 @@ -48,28 +50,50 @@ MogDB 3.0.0版本于2022年6月30日发布。3.0.0版本基于2.1版本进一步 - 将事务执行和事务日志落盘拆分为CPU bound和IO bound两个阶段,分别由不同线程执行,避免执行IO操作时,CPU资源闲置,进而提升CPU资源利用率; - 事务异步提交的优化,可以让事务吞吐量提升20%-50%,TPCC整体性能提升10%~20%; -#### 2.3.2 日志持久化优化 - -- 提高高数据更新负载下执行性能,降低执行延迟。 +**相关页面**:[事务异步提交](19-transaction-async-submit) -#### 2.3.3 索引并行创建并行度定义 +#### 2.3.2 索引并行创建并行度定义 - MogDB额外提供了参数控制并行度,可以手动制定并行度,更加灵活 -#### 2.3.4 COPY导入SIMD加速 +**相关页面**:[索引创建并行控制](23-index-creation-parallel-control) + +#### 2.3.3 COPY导入SIMD加速 - 利用CPU的指令集,对COPY命令中的数据解析阶段进行加速,进而提升COPY导入性能;(目前仅限x86 CPU) -#### 2.3.5 动态分区裁剪 +**相关页面**:[COPY导入优化](20-copy-import-optimization) + +#### 2.3.4 动态分区裁剪 - 新增支持了动态分区裁减。在prepare-execute执行方式,以及分区约束表达式中包含子查询的场景下,在执行阶段根据参数或子查询结果对分区进行裁减,提升分区表查询性能; +**相关页面**:[动态分区裁剪](21-dynamic-partition-pruning) + +#### 2.3.5 后台压缩 + +- 在Astore行存场景下支持数据压缩功能,减少存储成本。 + +**相关页面**:[后台压缩](26-backend-compression) + +#### 2.3.6 内置PostGIS支持地理数据处理 + +PostGIS提供空间对象、空间索引、空间操作函数和空间操作符等空间信息服务功能,可用于: + +- 大气科学、海洋科学、地质学、环境科学、交通管理等,处理和分析复杂的空间数据,并进行制图; +- 移动通信、移动定位、移动互联网; +- 城市管理、灾害响应、资源开发等方面; + +**相关页面**:[PostGIS](PostGIS) + ### 2.4 故障诊断 #### 2.4.1 监控Session级别SQL运行状态 - 对Session级别SQL运行状态进行收集执行计划树并动态采样执行算子 +**相关页面**:[SQL运行状态观测](22-sql-running-status-observation) + #### 2.4.2 OM故障诊断能力增强 - gstrace增强:通过增加模块切换(component switch)来获得更有针对性的执行路径,用于提升debug效率。 @@ -77,6 +101,8 @@ MogDB 3.0.0版本于2022年6月30日发布。3.0.0版本基于2.1版本进一步 - gs_watch:当MogDB发生故障时,使用此工具收集OS信息、日志信息以及配置文件等信息,来定位问题。 - gs_gucquery:实现MogDB GUC值自动收集整理导出和差异比较。 +**相关页面**:[故障诊断](fault-diagnosis) + ### 2.5 兼容性增强 #### 2.5.1 Oracle兼容增强 @@ -85,11 +111,15 @@ MogDB 3.0.0版本于2022年6月30日发布。3.0.0版本基于2.1版本进一步 - 支持connect by语法 - 降低Oracle应用迁移到MogDB的代码修改量。 +**相关页面**:[Oracle兼容增强](MogDB-Oracle-compatibility) + #### 2.5.2 MySQL兼容增强 - 更多语法支持:timestamp on update等;更多数据类型兼容;更多函数兼容 - 降低迁移MySQL应用到MogDB的代码修改量。 +**相关页面**:[MySQL兼容增强](MogDB-MySQL-compatibility) + #### 2.5.3 PostgreSQL兼容增强 ##### 2.5.3.1 新增BRIN INDEX(PostgreSQL 9.5开始支持) @@ -97,6 +127,8 @@ MogDB 3.0.0版本于2022年6月30日发布。3.0.0版本基于2.1版本进一步 - 数据块范围的索引,相比于精准的BTREE索引,BRIN INDEX提供了一个以较小空间消耗获得一个相对较快查询速度的平衡 - 1GB的表,无索引,查询单条4s;BTREE索引200MB空间,查询4ms;BRIN索引800K,查询58ms; +**相关页面**:[BRIN索引](24-brin-index) + ##### 2.5.3.2 新增BLOOM INDEX(PostgreSQL 9.6开始支持) - 布隆过滤:真的不一定为真,假的一定为假;存在误算率,需要recheck(算法实现,不是要用户recheck) @@ -104,6 +136,8 @@ MogDB 3.0.0版本于2022年6月30日发布。3.0.0版本基于2.1版本进一步 - 普通索引应对此类场景,需要创建多个索引,对于空间占用和插入更新速度都会有较大影响 - 此时可以在所有这些可能用于查询的字段上统一创建一个BLOOM索引,获得空间和查询速度的平衡,10GB表的扫描可以1s左右完成 +**相关页面**:[BLOOM索引](25-bloom-index) +
## 3. 修复缺陷 diff --git a/product/zh/docs-mogdb/v3.0/about-mogdb/open-source-components/PostGIS.md b/product/zh/docs-mogdb/v3.0/about-mogdb/open-source-components/PostGIS.md new file mode 100644 index 0000000000000000000000000000000000000000..f2e46e0299a8611535f369826e04a1c06314bddc --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/about-mogdb/open-source-components/PostGIS.md @@ -0,0 +1,306 @@ +--- +title: PostGIS +summary: PostGIS +author: Zhang Cuiping +date: 2022-06-17 +--- + +# PostGIS + +## 背景 + +PostGIS 是一个空间数据库,在 PostgreSQL 上以插件的形式提供,为 PostgreSQL 提供了存储空间地理数据的支持,PostGIS 提供的功能包括:空间对象、空间索引、空间操作函数和空间操作符等。PostGIS 遵循 OpenGIS 规范,遵循 GNU General Public License(GPLv2 or later)。 + +随着信息技术及GIS应用的不断发展,大气科学、海洋科学、地质学、环境科学、交通管理等逐步应用 GIS 作为一种技术手段,处理和分析复杂的空间数据,并进行制图。同时,随着移动通信、移动定位、移动互联网的不断发展,一切事物都联系在了一起。空间数据库在城市管理、灾害响应、资源开发等方面都有非常大的应用前景。 + +PostGIS 多年的发展为 PostgreSQL 提供了强大空间数据处理能力。MogDB内核发源于 PostgreSQL,因此MogDB将首选PostGIS提供空间数据处理。 + +## 功能特性 + +在MogDB 3.0版本中,PostGIS将支持postgis、postgis_raster 和 postgis_topology 三个模块的主要功能。PostGIS只支持行存表,不支持BRIN索引。 + +| 编号 | 功能 | 目的及参考 | +| ---- | ------------------------------------- | ------------------------------------------------------------ | +| 1 | 支持PostGIS中的geometry类型及关联函数 | 支持 PostGIS 中的geometry类型及关联函数
具体类型和关联函数参考:
[http://postgis.net/workshops/postgis-intro/geometries.html](http://postgis.net/workshops/postgis-intro/geometries.html)
[http://postgis.net/workshops/postgis-intro/geography.html](http://postgis.net/workshops/postgis-intro/geography.html)
[https://livebook.manning.com/book/postgis-in-action/chapter-2/167](https://livebook.manning.com/book/postgis-in-action/chapter-2/167)
[https://gitee.com/opengauss/openGauss-third_party/tree/master/gpl_dependency/postgis](https://gitee.com/opengauss/openGauss-third_party/tree/master/gpl_dependency/postgis) | +| 2 | 支持 Raster及关联函数 | 支持 PostGIS 中的 raster 类型及关联函数。Raster 是 PostGIS 中的一种类型,用于存储和处理栅格数据。
具体类型和关联函数参考:
[https://postgis.net/docs/RT_reference.html](https://postgis.net/docs/RT_reference.html) | +| 3 | 支持 Topology 类型及其关联函数 | 支持 PostGIS 中的 topology 类型及关联函数。Topology 用于管理拓扑对象,如 faces、edges、nodes等。
具体类型和关联函数参考:
[https://postgis.net/docs/Topology.html#Topology_Types](https://postgis.net/docs/Topology.html#Topology_Types)
[https://trac.osgeo.org/postgis/wiki/UsersWikiPostgisTopology](https://trac.osgeo.org/postgis/wiki/UsersWikiPostgisTopology) | + +## 安装PostGIS + +### 安装准备 + +PostGIS依赖下列工具 (最低版本要求): + +- GCC-7.3. zlib.autoconf.automake +- Geos 3.6.2 +- Proj 4.9.2 +- Json 0.12.1 +- Libxml2 2.7.1 +- Gdal 1.11.0 + +> 注意:本文档仅提供*Geos.Proj.Json.Libxml.Gdal 1.11.0*安装脚本,您可以在之后选择通过脚本安装 *GCC-7.3.zlib.autoconf.automake*。 + +### 获取安装包 + +访问[该网站](https://opengauss.obs.cn-south-1.myhuaweicloud.com/dependency/postgis-xc-master-2020-09-17.tar.gz)下载postgis-xc-master-2020-09-17.tar.gz压缩包执行安装。 + +### 安装步骤 + +1. 将下载的压缩包拷贝到 *$GAUSSHOME* 路径下,解压缩,将目录重命名为 postgis-xc。 + +2. 设置必要的环境变量。 + + ``` + export CODE_BASE=________ # Path of the MogDB-server file + export PostGIS=________ # Path of the MogDB/PostGIS file + export BINARYLIBS=________ # Path of the binarylibs file + export GAUSSHOME=________ # Path of MogDB installation + export LD_LIBRARY_PATH=$GAUSSHOME/lib:$GAUSSHOME/install/geos/lib:$GAUSSHOME/install/proj4/lib:$GAUSSHOME/install/gdal/lib:$GAUSSHOME/install/libxml2/lib/:$LD_LIBRARY_PATH + ``` + +3. 编译安装 PostGIS。 + + 执行以下命令进行安装,编译安装过程中,生成的文件会放在 *$GAUSSHOME/install* 路径下。 + + - 如果使用openeuler_aarch64操作系统,在以下执行 ./configure 的地方需要加上 "*--build=aarch64-unknown-linux-gnu*" 选项。 + - 编译安装过程中依赖第三方工具,如automake、autoconf 等。如果有编译环境,理论上已经安装过。如果未安装,请按照提示安装。 + + ``` + cd $GAUSSHOME/postgis-xc + + #apply patch + cd postgis-xc + patch -p1 < $PostGIS/postgis_2.4.2-1.patch + + #copy the dependent file: + cp $PostGIS/extension_dependency.h $GAUSSHOME/include/postgresql/server/ + + 此处需要替换为本机的PostGIS路径 + 编译 MogDB 3.0.0 和 openGauss 3.0.0 使用的 extension_dependency.h 文件不一样,主要是 MogDB 和 openGauss 内核在一些接口上有差异 + + 主要有以下接口: + SPI_execute + SPI_exec + SPI_cursor_open_with_args + + #install geos + cd $GAUSSHOME/postgis-xc/geos-3.6.2 + chmod +x ./configure + ./configure --prefix=$GAUSSHOME/install/geos + make -sj + make install -sj + + #install proj + cd $GAUSSHOME/postgis-xc/proj-4.9.2 + chmod +x ./configure + ./configure --prefix=$GAUSSHOME/install/proj + make -sj + make install -sj + + #install json + cd $GAUSSHOME/postgis-xc/json-c-json-c-0.12.1-20160607 + chmod +x ./configure + ./configure --prefix=$GAUSSHOME/install/json + + 执行make前需要在Makefile文件中将CFLAGS = CFLAGS = -g -O2 修改为CFLAGS = CFLAGS = -g -O2 -w + + make -sj + make install -sj + + #install libxml2 + cd $GAUSSHOME/postgis-xc/libxml2-2.7.1 + chmod +x ./configure + ./configure --prefix=$GAUSSHOME/install/libxml2 + make -sj + make install -sj + + #install gdal + cd $GAUSSHOME/postgis-xc/gdal-1.11.0 + chmod +x ./configure + chmod +x ./install-sh + ./configure --prefix=$GAUSSHOME/install/gdal --with-xml2=$GAUSSHOME/install/libxml2/bin/xml2-config --with-geos=$GAUSSHOME/install/geos/bin/geos-config --with-static_proj4=$GAUSSHOME/install/proj CFLAGS='-O2 -fpermissive -pthread' + make -sj + make install -sj + + #install postgis + cd $GAUSSHOME/postgis-xc/postgis-2.4.2 + sed -i -e 's/-Werror//g' $GAUSSHOME/lib/postgresql/pgxs/src/Makefile.global + ./configure --prefix=$GAUSSHOME/install/pggis2.4.2 --with-pgconfig=$GAUSSHOME/bin/pg_config --with-projdir=$GAUSSHOME/install/proj --with-geosconfig=$GAUSSHOME/install/geos/bin/geos-config --with-jsondir=$GAUSSHOME/install/json --with-xml2config=$GAUSSHOME/install/libxml2/bin/xml2-config --with-raster --with-gdalconfig=$GAUSSHOME/install/gdal/bin/gdal-config --with-topology --without-address-standardizer CFLAGS='-O2 -fpermissive -DPGXC -pthread -D_THREAD_SAFE -D__STDC_FORMAT_MACROS -DMEMORY_CONTEXT_CHECKING -w' CC=g++ + make -sj + make install -sj + + # copy the essential files to opengauss install folders: + cp $GAUSSHOME/install/json/lib/libjson-c.so.2 $GAUSSHOME/lib/libjson-c.so.2 + cp $GAUSSHOME/install/geos/lib/libgeos_c.so.1 $GAUSSHOME/lib/libgeos_c.so.1 + cp $GAUSSHOME/install/proj/lib/libproj.so.9 $GAUSSHOME/lib/libproj.so.9 + cp $GAUSSHOME/install/geos/lib/libgeos-3.6.2.so $GAUSSHOME/lib/libgeos-3.6.2.so + cp $GAUSSHOME/install/gdal/lib/libgdal.so.1.18.0 $GAUSSHOME/lib/libgdal.so.1 + cp $GAUSSHOME/install/pggis2.4.2/lib/liblwgeom-2.4.so.0 $GAUSSHOME/lib/liblwgeom-2.4.so.0 + cp $GAUSSHOME/postgis-xc/postgis-2.4.2/postgis.control $GAUSSHOME/share/postgresql/extension/ + cp $GAUSSHOME/postgis-xc/postgis-2.4.2/postgis--2.4.2.sql $GAUSSHOME/share/postgresql/extension/ + rm -f $GAUSSHOME/share/postgresql/extension/postgis_raster--2.*.sql + cp $GAUSSHOME/postgis-xc/postgis-2.4.2/postgis_raster--2.4.2.sql $GAUSSHOME/share/postgresql/extension/postgis_raster--2.4.2.sql + cp $GAUSSHOME/postgis-xc/postgis-2.4.2/postgis_raster.control $GAUSSHOME/share/postgresql/extension/postgis_raster.control + rm -f $GAUSSHOME/share/postgresql/extension/postgis_topology--2.*.sql + cp $GAUSSHOME/postgis-xc/postgis-2.4.2/extensions/postgis_topology/sql/postgis_topology--2.4.2.sql $GAUSSHOME/share/postgresql/extension/postgis_topology--2.4.2.sql + cp $GAUSSHOME/postgis-xc/postgis-2.4.2/extensions/postgis_topology/postgis_topology.control $GAUSSHOME/share/postgresql/extension/postgis_topology.control + ``` + +4. 执行安装插件的命令 + + ``` + CREATE EXTENSION postgis; // 执行时间可能较长 + CREATE EXTENSION postgis_raster; + set behavior_compat_options='bind_procedure_searchpath'; + CREATE EXTENSION postgis_topology; + ``` + +## 使用PostGIS + +### 创建Extension + +- 使能PostGIS中的postgis功能 + + ``` + CREATE EXTENSION postgis; + ``` + +- 使能PostGIS中的栅格功能 + + ``` + CREATE EXTENSION postgis_raster; + ``` + +- 使能PostGIS中的拓扑功能 + + ``` + set behavior_compat_options='bind_procedure_searchpath'; + CREATE EXTENSION postgis_topology; + ``` + +### 使用Extension + +调用PostGIS Extension函数 + +```sql +SELECT GisFunction (Param1, Param2,......); +``` + +> 注意:GisFunction为函数名,Param1、Param2等为函数参数名。有关其他函数的具体使用,请参考[postgis-2.4.2](https://download.osgeo.org/postgis/docs/postgis-2.4.2.pdf)。 + +### 删除Extension + +删除PostGIS Extension。 + +``` +DROP EXTENSION postgis [CASCADE]; +``` + +> 注意: +> +> - 如果Extension被其它对象依赖(如创建的几何表),需要加入CASCADE(级联)关键字,删除所有依赖对象。 +> +> - 如果要完全删除PostGIS Extension,则需由omm用户使用gs_om工具移除PostGIS及其依赖的动态链接库,格式如下: +> +> ``` +> gs_om -t postgis -m rmlib +> ``` + +## PostGIS使用限制 + +### 支持的操作符和函数列表 + +| 函数分类 | 包含函数 | +| -------------------------------------- | ------------------------------------------------------------ | +| Management Functions | AddGeometryColumn、DropGeometryColumn、DropGeometryTable、PostGIS_Full_Version、PostGIS_GEOS_Version、PostGIS_Liblwgeom_Version、PostGIS_Lib_Build_Date、PostGIS_Lib_Version、PostGIS_PROJ_Version、PostGIS_Scripts_Build_Date、PostGIS_Scripts_Installed、PostGIS_Version、PostGIS_LibXML_Version、PostGIS_Scripts_Released、Populate_Geometry_Columns 、UpdateGeometrySRID | +| Geometry Constructors | ST_BdPolyFromText 、ST_BdMPolyFromText 、ST_Box2dFromGeoHash、ST_GeogFromText、ST_GeographyFromText、ST_GeogFromWKB、ST_GeomCollFromText、ST_GeomFromEWKB、ST_GeomFromEWKT、ST_GeometryFromText、ST_GeomFromGeoHash、ST_GeomFromGML、ST_GeomFromGeoJSON、ST_GeomFromKML、ST_GMLToSQL、ST_GeomFromText 、ST_GeomFromWKB、ST_LineFromMultiPoint、ST_LineFromText、ST_LineFromWKB、ST_LinestringFromWKB、ST_MakeBox2D、ST_3DMakeBox、ST_MakeEnvelope、ST_MakePolygon、ST_MakePoint、ST_MakePointM、ST_MLineFromText、ST_MPointFromText、ST_MPolyFromText、ST_Point、ST_PointFromGeoHash、ST_PointFromText、ST_PointFromWKB、ST_Polygon、ST_PolygonFromText、ST_WKBToSQL、ST_WKTToSQL | +| Geometry Accessors | GeometryType、ST_Boundary、ST_CoordDim、ST_Dimension、ST_EndPoint、ST_Envelope、ST_ExteriorRing、ST_GeometryN、ST_GeometryType、ST_InteriorRingN、ST_IsClosed、ST_IsCollection、ST_IsEmpty、ST_IsRing、ST_IsSimple、ST_IsValid、ST_IsValidReason、ST_IsValidDetail、ST_M、ST_NDims、ST_NPoints、ST_NRings、ST_NumGeometries、ST_NumInteriorRings、ST_NumInteriorRing、ST_NumPatches、ST_NumPoints、ST_PatchN、ST_PointN、ST_SRID、ST_StartPoint、ST_Summary、ST_X、ST_XMax、ST_XMin、ST_Y、ST_YMax、ST_YMin、ST_Z、ST_ZMax、ST_Zmflag、ST_ZMin | +| Geometry Editors | ST_AddPoint、ST_Affine、ST_Force2D、ST_Force3D、ST_Force3DZ、ST_Force3DM、ST_Force4D、ST_ForceCollection、ST_ForceSFS、ST_ForceRHR、ST_LineMerge、ST_CollectionExtract、ST_CollectionHomogenize、ST_Multi、ST_RemovePoint、ST_Reverse、ST_Rotate、ST_RotateX、ST_RotateY、ST_RotateZ、ST_Scale、ST_Segmentize、ST_SetPoint、ST_SetSRID、ST_SnapToGrid、ST_Snap、ST_Transform、ST_Translate、ST_TransScale | +| Geometry Outputs | ST_AsBinary、ST_AsEWKB、ST_AsEWKT、ST_AsGeoJSON、ST_AsGML、ST_AsHEXEWKB、ST_AsKML、ST_AsLatLonText 、ST_AsSVG、ST_AsText、ST_AsX3D、ST_GeoHash | +| Operators | &&、&&&、&<、&<\|>\|、=、>>、@ 、\|&> 、\|>>、~、~=、<->、<#> | +| Spatial Relationships and Measurements | ST_3DClosestPoint、ST_3DDistance、ST_3DDWithin、ST_3DDFullyWithin、ST_3DIntersects、ST_3DLongestLine、ST_3DMaxDistance、ST_3DShortestLine、ST_Area、ST_Azimuth、ST_Centroid、ST_ClosestPoint、ST_Contains、ST_ContainsProperly、ST_Covers、ST_CoveredBy、ST_Crosses、ST_LineCrossingDirection、ST_Disjoint、ST_Distance、ST_HausdorffDistance、ST_MaxDistance、ST_DistanceSphere、ST_DistanceSpheroid、ST_DFullyWithin、ST_DWithin、ST_Equals、ST_HasArc、ST_Intersects、ST_Length、ST_Length2D、ST_3DLength、ST_Length_Spheroid、ST_Length2D_Spheroid、ST_3DLength_Spheroid、ST_LongestLine、ST_OrderingEquals、ST_Overlaps、ST_Perimeter、ST_Perimeter2D、ST_3DPerimeter、ST_PointOnSurface、ST_Project、ST_Relate、ST_RelateMatch、ST_ShortestLine、ST_Touches、ST_Within | +| Geometry Processing | ST_Buffer、ST_BuildArea、ST_Collect、ST_ConcaveHull、ST_ConvexHull、ST_CurveToLine、ST_DelaunayTriangles、ST_Difference、ST_Dump、ST_DumpPoints、ST_DumpRings、ST_FlipCoordinates、ST_Intersection、ST_LineToCurve、ST_MakeValid、ST_MemUnion、ST_MinimumBoundingCircle、ST_Polygonize、ST_Node、ST_OffsetCurve、ST_RemoveRepeatedPoints、ST_SharedPaths、ST_Shift_Longitude、ST_Simplify、ST_SimplifyPreserveTopology、ST_Split、ST_SymDifference、ST_Union、ST_UnaryUnion | +| Linear Referencing | ST_LineInterpolatePoint、ST_LineLocatePoint、ST_LineSubstring、ST_LocateAlong、ST_LocateBetween、ST_LocateBetweenElevations、ST_InterpolatePoint、ST_AddMeasure | +| Miscellaneous Functions | ST_Accum、Box2D、Box3D、ST_Expand、ST_Extent、ST_3Dextent、Find_SRID、ST_MemSize | +| Exceptional Functions | PostGIS_AddBBox、PostGIS_DropBBox、PostGIS_HasBBox | +| Raster Management Functions | AddRasterConstraints、DropRasterConstraints、AddOverviewConstraints、DropOverviewConstraints、PostGIS_GDAL_Version、PostGIS_Raster_Lib_Build_Date、PostGIS_Raster_Lib_Version、ST_GDALDrivers、UpdateRasterSRID | +| Raster Constructors | ST_AddBand、ST_AsRaster、ST_Band、ST_MakeEmptyRaster、ST_Tile、ST_FromGDALRaster | +| Raster Accessors | ST_GeoReference、ST_Height、ST_IsEmpty、ST_MetaData、ST_NumBands、ST_PixelHeight、ST_PixelWidth、ST_ScaleX、ST_ScaleY、ST_RasterToWorldCoord、ST_RasterToWorldCoordX、ST_RasterToWorldCoordY、ST_Rotation、ST_SkewX、ST_SkewY、ST_SRID、ST_Summary、ST_UpperLeftX、ST_UpperLeftY、ST_Width、ST_WorldToRasterCoord、ST_WorldToRasterCoordX、ST_WorldToRasterCoordY | +| Raster Band Accessors | ST_BandMetaData、ST_BandNoDataValue、ST_BandIsNoData、ST_BandPath、ST_BandPixelType、ST_HasNoBand | +| Raster Pixel Accessors and Setters | ST_PixelAsPolygon、ST_PixelAsPolygons、ST_PixelAsPoint、ST_PixelAsPoints、ST_PixelAsCentroid、ST_PixelAsCentroids、ST_Value、ST_NearestValue、ST_Neighborhood、ST_SetValue、ST_SetValues、ST_DumpValues、ST_PixelOfValue | +| Raster Editors | ST_SetGeoReference、ST_SetRotation、ST_SetScale、ST_SetSkew、ST_SetSRID、ST_SetUpperLeft、ST_Resample、ST_Rescale、ST_Reskew、ST_SnapToGrid、ST_Resize、ST_Transform | +| Raster Band Editors | ST_SetBandNoDataValue、ST_SetBandIsNoData | +| Raster Band Statistics and Analytics | ST_Count、ST_CountAgg、ST_Histogram、ST_Quantile、ST_SummaryStats、ST_SummaryStatsAgg、ST_ValueCount | +| Raster Outputs | ST_AsBinary、ST_AsGDALRaster、ST_AsJPEG、ST_AsPNG、ST_AsTIFF | +| Raster Processing | ST_Clip、ST_ColorMap、ST_Intersection、ST_MapAlgebra、ST_Reclass、ST_Union、ST_Distinct4ma、ST_InvDistWeight4ma、ST_Max4ma、ST_Mean4ma、ST_Min4ma、ST_MinDist4ma、ST_Range4ma、ST_StdDev4ma、ST_Sum4ma、ST_Aspect、ST_HillShade、ST_Roughness、ST_Slope、ST_TPI、ST_TRI、Box3D、ST_ConvexHull、ST_DumpAsPolygons、ST_Envelope、ST_MinConvexHull、ST_Polygon、ST_Contains、ST_ContainsProperly、ST_Covers、ST_CoveredBy、ST_Disjoint、ST_Intersects、ST_Overlaps、ST_Touches、ST_SameAlignment、ST_NotSameAlignmentReason、ST_Within、ST_DWithin、ST_DFullyWithin | +| Raster Operators | &&、&<、&>、=、@、~=、~ | + +### 空间索引 + +GaussDB A数据库的PostGIS Extension支持GIST (Generalized Search Tree) 空间索引(分区表除外)。相比于B-tree索引,GIST索引适用于任意类型的非常规数据结构,可有效提高几何和地理数据信息的检索效率。 + +使用如下命令创建GIST索引: + +```sql +MogDB=# CREATE INDEX indexname ON tablename USING GIST ( geometryfield ); +``` + +### 扩展限制 + +- 只支持行存表; + +- spatial_ref_sys表在扩容期间只支持查询操作; + +- 目前不支持 window 函数; + +- long_xact 不支持; + +- 不支持 Interrupt 操作; + +## 示例 + +- geometry类型 + + ```sql + MogDB=# CREATE TABLE testgeomobj (id serial, geom geometry NOT NULL); + MogDB=# INSERT INTO testgeomobj (geom) VALUES ('SRID=4326;POINT(-95.363151 29.763374)'); + ``` + +- raster类型 + + ```sql + MogDB=# CREATE TABLE dummy_rast(rid integer, rast raster); + MogDB=# INSERT INTO dummy_rast(rid, rast) + VALUES (1, + ('01' -- little endian (uint8 ndr) + || + '0000' -- version (uint16 0) + || + '0000' -- nBands (uint16 0) + || + '0000000000000040' -- scaleX (float64 2) + || + '0000000000000840' -- scaleY (float64 3) + || + '000000000000E03F' -- ipX (float64 0.5) + || + '000000000000E03F' -- ipY (float64 0.5) + || + '0000000000000000' -- skewX (float64 0) + || + '0000000000000000' -- skewY (float64 0) + || + '00000000' -- SRID (int32 0) + || + '0A00' -- width (uint16 10) + || + '1400' -- height (uint16 20) + )::raster + ); + ``` + +- topology类型 + + ```sql + MogDB=# SELECT topology.CreateTopology(name, [srid], [tolerance]); + ``` diff --git a/product/zh/docs-mogdb/v3.0/administrator-guide/upgrade-guide.md b/product/zh/docs-mogdb/v3.0/administrator-guide/upgrade-guide.md index 1425a50610015555dab46b155e847e01c81edd72..cb9da768a5bf538d1f26a41612b314c3536342df 100644 --- a/product/zh/docs-mogdb/v3.0/administrator-guide/upgrade-guide.md +++ b/product/zh/docs-mogdb/v3.0/administrator-guide/upgrade-guide.md @@ -1,364 +1,350 @@ ---- -title: 升级指南 -summary: 升级指南 -author: Zhang Cuiping -date: 2021-09-27 ---- - -# 升级指南 - -## 概述 - -本文档详细的描述了版本升级、回滚流程、以及具体的操作指导,同时提供了常见的问题解答及故障处理方法。 - -## 读者对象 - -本文档主要适用于升级的操作人员。操作人员必须具备以下经验和技能: - -- 熟悉当前网络的组网和相关网元的版本信息。 -- 有该设备维护经验,熟悉设备的操作维护方式。 - -## 升级方案 - -本节为指导用户选择升级方式。 - -用户根据MogDB提供的新特性和数据库现状,确定是否对现有系统进行升级。 - -当前支持的升级模式为就地升级和灰度升级。升级方式的策略又分为大版本升级和小版本升级。 - -用户挑选升级方式后,系统会自动判断并选择合适的升级策略。 - -* 就地升级: 升级期间需停止业务进行,一次性升级所有节点。 - -* 灰度升级: 灰度升级支持全业务操作,也是一次性升级所有节点(目前仅支持从1.1.0版本到2.0及以上版本进行灰度升级)。 - -## 升级前的版本要求(升级路径) - -MogDB升级版本要求如[表1](#biaoyi)所示。 - -**表 1** 升级前的版本要求(升级路径) - -| 版本 | 升级说明 | -| ------------------------- | ----------------------------------- | -| MogDB 1.1.0版本之后的版本 | 可以升级到MogDB 1.1.0之后的任意版本 | - -> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** 升级前版本,可以通过执行如下工具查看。 -> -> ```bash -> gsql -V | --version -> ``` - -## 升级影响和升级约束 - -升级过程需要注意以下事项。 - -- 升级操作不能和扩容、缩容同时执行。 -- 不支持虚拟IP。 -- 升级过程中,不允许对wal_level,max_connections,max_prepared_transactions,max_locks_per_transaction这四个GUC参数的值进行修改。如果修改,会导致回滚后实例启动异常。 -- 建议在数据库系统空闲情况下进行升级,尽量避开业务繁忙的时间段(可按照经验判断,如节假日等)。 -- 升级前尽可能保证数据库正常。可以通过gs_om -t status查询,查询结果的cluster_state为Normal代表数据库正常。 -- 升级前保证数据库互信正常,可以在任意节点上,通过ssh hostname命令,连接另外一个节点进行验证。如果各机器间互连不用输入密码,说明互信正常(通常数据库状态正常时,互信一般都是正常的)。 -- 升级前后,数据库的部署方式(配置文件)不能发生变化。升级前会对部署方式进行校验,如果改变,会报错。 -- 升级前要保证操作系统处于健康状态,通过gs_checkos工具可以完成操作系统状态检查。 -- 就地升级需要停止业务,灰度升级支持全业务操作。 -- 数据库运行正常且主DN的数据完全同步到备DN。 -- 升级过程中不允许打开kerberos开关。 -- 请不要修改安装包中解压出来的version.cfg文件。 -- 如果升级过程中出现异常导致升级失败,需用户手动回滚,并且必须回滚成功后才能进行下一次升级。 -- 如果升级回滚成功后,再次升级成功,未提交阶段设置的GUC参数将失效。 -- 执行升级的过程中请不要手动设置GUC参数。 -- 灰度升级中,升级的时候都会产生不超过10s的业务中断 -- 升级过程中,必须保持内核版本与om版本一致才可执行om操作。这里的一致是指,内核代码和om代码都来自同一个软件包。如果执行了升级包的前置脚本却没有升级,或者升级回滚后没有执行基线包的前置脚本,就会造成内核代码和om代码的不一致。 -- 升级过程中如果系统表新增了字段,升级后通过`\d`命令将查看不到这些新增的字段。此时通过`select`命令可以查到这些新增的字段。 -- 升级需要guc参数enable_stream_replication=on,该参数为off时不允许升级。 -- 灰度升级中,业务并发要小于200并发读加200并发写的情况。 -- 若在MogDB 2.0之前的版本中使用了MOT表,则不支持升级到MogDB 2.0版本。 - -## 升级流程 - -本章介绍升级到该版本的主要升级过程。 - -**图 1** 升级流程图 - -![12](https://cdn-mogdb.enmotech.com/docs-media/mogdb/administrator-guide/upgrade-guide-1.png) - -> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif)**说明:** 本文档中描述的时间仅供参考,实际操作时间以现场情况为准。 - -**表 2** 升级流程执行效率估计 - -
步骤 建议起始时间 耗时(天/小时/分钟) 业务中断时长 备注
升级前准备与检查 升级操作前一天 约2~3小时。 对业务无影响。 升级前检查和备份数据、校验软件包等操作。
升级操作 业务空闲期 耗时主要集中在数据库的启动和停止以及每个database的系统表修改处。升级操作耗时一般不会超过30分钟。 与操作时长一致,一般不会超过30分钟。 依据指导书开始升级。
升级验证 业务空闲期 约30分钟。 与操作时长一致,约30分钟。 -
提交升级 业务空闲期 提交升级耗时一般不超过10分钟。 与操作时长一致,一般不超过10分钟。 -
升级版本回滚 业务空闲期 版本回滚耗时一般不会超过30分钟。 与操作时长一致,一般不会超过30分钟。 -
- -## 升级前准备与检查 - -### 升级前准备与检查清单 - -**表 3** 升级前准备清单 - -
序号 升级准备项目项目 准备内容 建议起始时间 耗时(天/小时/分钟)
1 收集节点信息 收集到数据库涉及节点的名称、IP地址,root、omm用户密码等环境信息。 升级前一天 1小时
2 设置root用户远程登录 设置配置文件,允许root用户远程登录。 升级前一天 2小时
3 备份数据 参考《管理指南》中的“备份与恢复”章节进行。 升级前一天 备份数据量和方案不同,耗时也不同
4 获取并校验升级包 获取升级软件包,进行完整性校验。 升级前一天 0.5小时
5 健康检查 使用gs_checkos工具完成操作系统状态检查。 升级前一天 0.5小时
6 检查数据库节点磁盘使用率 使用df命令查看磁盘使用率。 升级前一天 0.5小时
7 检查数据库状态 使用gs_om工具完成数据库状态检查。 升级前一天 0.5小时
- -> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif)**说明:** “耗时”依不同环境(包括现场数据量、服务器性能等原因)会存在一定差异。 - -### 收集节点信息 - -联系数据库系统管理员,获取数据库涉及节点的节点名称、节点IP地址。节点的root、omm用户密码等环境信息。 - -**表 4** 节点信息 - - - - - - - - - - - - - - - - - - -
序号 节点名称 节点IP -root用户密码 omm用户密码 备注
1 -- -- - - -
- -### 备份数据 - -升级一旦失败,有可能会影响到业务的正常开展。提前备份数据,就可以在风险发生后,尽快的恢复业务。 - -请参考《管理指南》中的“备份与恢复”章节,完成数据的备份。 - -### 获取升级包 - -访问[此页面](https://www.mogdb.io/downloads/mogdb)获取想要升级的升级包。 - -### 健康检查 - -通过gs_checkos工具可以完成操作系统状态检查。 - -**前提条件** - -- 当前的硬件和网络环境正常。 -- 各主机间root互信状态正常。 -- 只能使用root用户执行gs_checkos命令。 - -**操作步骤** - -1. 以root用户身份登录服务器。 - -2. 执行如下命令对服务器的OS参数进行检查。 - - ``` - # gs_checkos -i A - ``` - - 检查服务器的OS参数的目的是为了保证数据库正常通过预安装,并且在安装成功后可以安全高效的运行。 - -#### 检查数据库节点磁盘使用率 - -建议数据库节点磁盘使用率低于80%时再执行升级操作。 - -#### 检查数据库状态 - -本节介绍数据库状态查询的具体操作。 - -**验证步骤** - -1. 以数据库用户(如omm)登录节点,source环境变量。 - - ``` - # su - omm - $ source /home/omm/.bashrc - ``` - -2. 执行如下命令查看数据库状态。 - - ```bash - gs_om -t status - ``` - -3. 保证数据库状态正常。 - -## 升级操作 - -介绍就地升级和灰度升级的详细操作。 - -**操作步骤** - -1. 以root身份登录节点。 - -2. 创建新包目录。 - - ``` - # mkdir -p /opt/software/mogdb_upgrade - ``` - -3. 将需要更新的新包上传至目录"/opt/software/mogdb_upgrade"并解压。 - -4. 进入安装包解压出的script目录下: - - ``` - # cd /opt/software/mogdb_upgrade/script - ``` - -5. 在就地升级或灰度升级前执行前置脚本gs_preinstall。 - - ``` - # ./gs_preinstall -U omm -G dbgrp -X /opt/software/mogdb/clusterconfig.xml - ``` - -6. 切换至omm用户。 - - ``` - # su - omm - ``` - -7. 数据库状态正常时,使用如下命令进行就地升级或者灰度升级。 - - 示例一: 使用gs_upgradectl脚本执行就地升级。 - - ```bash - gs_upgradectl -t auto-upgrade -X /opt/software/mogdb/clusterconfig.xml - ``` - - 示例二: 使用gs_upgradectl脚本执行灰度升级。 - - ```bash - gs_upgradectl -t auto-upgrade -X /opt/software/mogdb/clusterconfig.xml --grey - ``` - -## 升级验证 - -本章介绍升级完成后的验证操作。给出验证的用例和详细操作步骤。 - -### 验证项目的检查表 - -**表 5** 验证项目的检查表 - -
序号 验证项目 检查标准 检查结果
1 版本查询 查询升级后版本是否正确 -
2 健康检查 使用gs_checkos工具完成操作系统状态检查。 -
3 数据库状态 使用gs_om工具完成数据库状态检查。 -
- -### 升级版本查询 - -本节介绍版本查询的具体操作。 - -**验证步骤** - -1. 以数据库用户(如omm)登录节点,source环境变量。 - - ``` - # su - omm - $ source /home/omm/.bashrc - ``` - -2. 执行如下命令查看所有节点的版本信息。 - - ```bash - gs_ssh -c "gsql -V" - ``` - -### 检查升级数据库状态 - -本节介绍数据库状态查询的具体操作。 - -**验证步骤** - -1. 以数据库用户(如omm)登录节点。 - - ``` - # su - omm - ``` - -2. 执行如下命令查看数据库状态。 - - ```bash - gs_om -t status - ``` - - 查询结果的cluster_state为Normal代表数据库正常。 - -## 提交升级 - -升级完成后,如果验证也没问题。接下来就可以提交升级。 - -> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**:一旦提交操作完成,则不能再执行回滚操作。 - -**操作步骤** - -1. 以数据库用户(如omm)登录节点。 - - ``` - # su - omm - ``` - -2. 执行如下命令完成升级提交。 - - ```bash - gs_upgradectl -t commit-upgrade -X /opt/software/mogdb/clusterconfig.xml - ``` - -3. 重置控制文件格式以兼容2.1.0版本中新增的ustore存储引擎(仅限于2.0.1升级到2.1)。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-caution.gif)**警告**: - > - > - 此操作不可回退,执行后无法再降级回2.0.1版本。 - > - 执行此操作前,建议参考[逻辑备份恢复](1-3-br)做一次数据全备份。 - - ``` - pg_resetxlog -f $PGDATA - ``` - - 回显为: - - ``` - Transaction log reset - ``` - -## 升级版本回滚 - -本章介绍版本回滚方法。 - -**操作步骤** - -1. 以数据库用户(如omm)登录节点。 - - ``` - # su - omm - ``` - -2. 执行如下命令完成版本回滚(回滚内核代码)。回滚完成,如果需要保持内核和om代码的版本一致,可以执行一下旧包的前置命令(参见[执行前置脚本gs_preinstall](#qianzhijiaoben))。 - - ```bash - gs_upgradectl -t auto-rollback -X /opt/software/mogdb/clusterconfig.xml - ``` - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif)**说明:** 如果数据库异常,需要强制回滚,可以使用如下命令。 - > - > ```bash - > gs_upgradectl -t auto-rollback -X /opt/software/mogdb/clusterconfig.xml --force - > ``` - -3. 查看回滚之后的版本号。 - - ```bash - gs_om -V | --version - ``` - - 如果升级失败,请按照如下方式进行处理: - - a. 排查是否有环境问题。 - - 如磁盘满、网络故障等,或者升级包、升级版本号是否正确。排除问题后,可以尝试重入升级。 - - b. 如果没有发现环境问题,或者重入升级失败,需要收集相关日志,找技术支持工程师定位。 - - 收集日志命令: - - ```bash - gs_collector -begin-time='20200724 00:00' -end-time='20200725 00:00' - ``` - - 如果条件允许,建议保留环境。 +--- +title: 升级指南 +summary: 升级指南 +author: Zhang Cuiping +date: 2021-09-27 +--- + +# 升级指南 + +## 概述 + +本文档详细的描述了版本升级、回滚流程、以及具体的操作指导,同时提供了常见的问题解答及故障处理方法。 + +## 读者对象 + +本文档主要适用于升级的操作人员。操作人员必须具备以下经验和技能: + +- 熟悉当前网络的组网和相关网元的版本信息。 +- 有该设备维护经验,熟悉设备的操作维护方式。 + +## 升级方案 + +本节为指导用户选择升级方式。 + +用户根据MogDB提供的新特性和数据库现状,确定是否对现有系统进行升级。 + +当前支持的升级模式为就地升级和灰度升级。升级方式的策略又分为大版本升级和小版本升级。 + +用户挑选升级方式后,系统会自动判断并选择合适的升级策略。 + +* 就地升级: 升级期间需停止业务进行,一次性升级所有节点。 + +* 灰度升级: 灰度升级支持全业务操作,也是一次性升级所有节点。(MogDB1.1.0之后的版本支持该功能) + +## 升级前的版本要求(升级路径) + +MogDB升级版本要求如[表1](#biaoyi)所示。 + +**表 1** 升级前的版本要求(升级路径) + +| 版本 | 升级说明 | +| --------- | ---------------------------------------- | +| MogDB 2.0 | 需要先升级到MogDB 2.1,再升级到MogDB 3.0 | +| MogDB 2.1 | 可以升级到MogDB 3.0 | + +> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**:升级前版本,可以通过执行如下工具查看。 +> +> ```bash +> gsql -V | --version +> ``` + +## 升级影响和升级约束 + +升级过程需要注意以下事项。 + +- 升级操作不能和扩容、缩容同时执行。 +- 不支持虚拟IP。 +- 升级过程中,不允许对wal_level,max_connections,max_prepared_transactions,max_locks_per_transaction这四个GUC参数的值进行修改。如果修改,会导致回滚后实例启动异常。 +- 建议在数据库系统空闲情况下进行升级,尽量避开业务繁忙的时间段(可按照经验判断,如节假日等)。 +- 升级前尽可能保证数据库正常。可以通过gs_om -t status查询,查询结果的cluster_state为Normal代表数据库正常。 +- 升级前保证数据库互信正常,可以在任意节点上,通过ssh hostname命令,连接另外一个节点进行验证。如果各机器间互连不用输入密码,说明互信正常(通常数据库状态正常时,互信一般都是正常的)。 +- 升级前后,数据库的部署方式(配置文件)不能发生变化。升级前会对部署方式进行校验,如果改变,会报错。 +- 升级前要保证操作系统处于健康状态,通过gs_checkos工具可以完成操作系统状态检查。 +- 就地升级需要停止业务,灰度升级支持全业务操作。 +- 数据库运行正常且主DN的数据完全同步到备DN。 +- 升级过程中不允许打开kerberos开关。 +- 请不要修改安装包中解压出来的version.cfg文件。 +- 如果升级过程中出现异常导致升级失败,需用户手动回滚,并且必须回滚成功后才能进行下一次升级。 +- 如果升级回滚成功后,再次升级成功,未提交阶段设置的GUC参数将失效。 +- 执行升级的过程中请不要手动设置GUC参数。 +- 灰度升级中,升级的时候都会产生不超过10s的业务中断 +- 升级过程中,必须保持内核版本与om版本一致才可执行om操作。这里的一致是指,内核代码和om代码都来自同一个软件包。如果执行了升级包的前置脚本却没有升级,或者升级回滚后没有执行基线包的前置脚本,就会造成内核代码和om代码的不一致。 +- 升级过程中如果系统表新增了字段,升级后通过`\d`命令将查看不到这些新增的字段。此时通过`select`命令可以查到这些新增的字段。 +- 升级需要guc参数enable_stream_replication=on,该参数为off时不允许升级。 +- 灰度升级中,业务并发要小于200并发读加200并发写的情况。 +- 若在MogDB 2.0之前的版本中使用了MOT表,则不支持升级到MogDB 2.0版本。 + +## 升级流程 + +本章介绍升级到该版本的主要升级过程。 + +**图 1** 升级流程图 + +![12](https://cdn-mogdb.enmotech.com/docs-media/mogdb/administrator-guide/upgrade-guide-1.png) + +> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif)**说明**:本文档中描述的时间仅供参考,实际操作时间以现场情况为准。 + +**表 2** 升级流程执行效率估计 + +
步骤 建议起始时间 耗时(天/小时/分钟) 业务中断时长 备注
升级前准备与检查 升级操作前一天 约2~3小时。 对业务无影响。 升级前检查和备份数据、校验软件包等操作。
升级操作 业务空闲期 耗时主要集中在数据库的启动和停止以及每个database的系统表修改处。升级操作耗时一般不会超过30分钟。 与操作时长一致,一般不会超过30分钟。 依据指导书开始升级。
升级验证 业务空闲期 约30分钟。 与操作时长一致,约30分钟。 -
提交升级 业务空闲期 提交升级耗时一般不超过10分钟。 与操作时长一致,一般不超过10分钟。 -
升级版本回滚 业务空闲期 版本回滚耗时一般不会超过30分钟。 与操作时长一致,一般不会超过30分钟。 -
+ +## 升级前准备与检查 + +### 升级前准备与检查清单 + +**表 3** 升级前准备清单 + +
序号 升级准备项目项目 准备内容 建议起始时间 耗时(天/小时/分钟)
1 收集节点信息 收集到数据库涉及节点的名称、IP地址,root、omm用户密码等环境信息。 升级前一天 1小时
2 设置root用户远程登录 设置配置文件,允许root用户远程登录。 升级前一天 2小时
3 备份数据 参考《管理指南》中的“备份与恢复”章节进行。 升级前一天 备份数据量和方案不同,耗时也不同
4 获取并校验升级包 获取升级软件包,进行完整性校验。 升级前一天 0.5小时
5 健康检查 使用gs_checkos工具完成操作系统状态检查。 升级前一天 0.5小时
6 检查数据库节点磁盘使用率 使用df命令查看磁盘使用率。 升级前一天 0.5小时
7 检查数据库状态 使用gs_om工具完成数据库状态检查。 升级前一天 0.5小时
+ +> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif)**说明**:“耗时”依不同环境(包括现场数据量、服务器性能等原因)会存在一定差异。 + +### 收集节点信息 + +联系数据库系统管理员,获取数据库涉及节点的节点名称、节点IP地址。节点的root、omm用户密码等环境信息。 + +**表 4** 节点信息 + + + + + + + + + + + + + + + + + + +
序号 节点名称 节点IP +root用户密码 omm用户密码 备注
1 +- +- - - -
+ +### 备份数据 + +升级一旦失败,有可能会影响到业务的正常开展。提前备份数据,就可以在风险发生后,尽快的恢复业务。 + +请参考《管理指南》中的[备份与恢复](1-1-br)章节,完成数据的备份。 + +### 获取升级包 + +访问[MogDB官网下载页面](https://www.mogdb.io/downloads/mogdb)获取想要升级的升级包。 + +### 健康检查 + +通过gs_checkos工具可以完成操作系统状态检查。 + +**前提条件** + +- 当前的硬件和网络环境正常。 +- 各主机间root互信状态正常。 +- 只能使用root用户执行gs_checkos命令。 + +> **说明:** 该工具不支持独立调用,出于安全考虑,前置安装完成后会自动删除。 + +**操作步骤** + +1. 以root用户身份登录服务器。 + +2. 执行如下命令对服务器的OS参数进行检查。 + + ```shell + gs_checkos -i A + ``` + + 检查服务器的OS参数的目的是为了保证数据库正常通过预安装,并且在安装成功后可以安全高效的运行。 + +#### 检查数据库节点磁盘使用率 + +建议数据库节点磁盘使用率低于80%时再执行升级操作。 + +#### 检查数据库状态 + +本节介绍数据库状态查询的具体操作。 + +**验证步骤** + +1. 以数据库用户(如omm)登录节点,source环境变量。 + + ```shell + su - omm + source /home/omm/.bashrc + ``` + +2. 执行如下命令查看数据库状态。 + + ```shell + gs_om -t status + ``` + +3. 保证数据库状态正常。 + +## 升级操作 + +介绍就地升级和灰度升级的详细操作。 + +**操作步骤** + +1. 以root身份登录节点。 + +2. 创建新包目录。 + + ```shell + mkdir -p /opt/software/mogdb_upgrade + ``` + +3. 将需要更新的新包上传至目录"/opt/software/mogdb_upgrade"并解压。 + +4. 进入安装包解压出的script目录下: + + ```shell + cd /opt/software/mogdb_upgrade/script + ``` + +5. 在就地升级或灰度升级前执行前置脚本gs_preinstall。 + + ```shell + ./gs_preinstall -U omm -G dbgrp -X /opt/software/mogdb/clusterconfig.xml + ``` + +6. 切换至omm用户。 + + ```shell + su - omm + ``` + +7. 数据库状态正常时,使用如下命令进行就地升级或者灰度升级。 + + 示例一: 使用gs_upgradectl脚本执行就地升级。 + + ```shell + gs_upgradectl -t auto-upgrade -X /opt/software/mogdb/clusterconfig.xml + ``` + + 示例二: 使用gs_upgradectl脚本执行灰度升级。 + + ```shell + gs_upgradectl -t auto-upgrade -X /opt/software/mogdb/clusterconfig.xml --grey + ``` + +## 升级验证 + +本章介绍升级完成后的验证操作。给出验证的用例和详细操作步骤。 + +### 验证项目的检查表 + +**表 5** 验证项目的检查表 + +
序号 验证项目 检查标准 检查结果
1 版本查询 查询升级后版本是否正确 -
2 健康检查 使用gs_checkos工具完成操作系统状态检查。 -
3 数据库状态 使用gs_om工具完成数据库状态检查。 -
+ +### 升级版本查询 + +本节介绍版本查询的具体操作。 + +**验证步骤** + +1. 以数据库用户(如omm)登录节点,source环境变量。 + + ```shell + su - omm + source /home/omm/.bashrc + ``` + +2. 执行如下命令查看所有节点的版本信息。 + + ```shell + gs_ssh -c "gsql -V" + ``` + +### 检查升级数据库状态 + +本节介绍数据库状态查询的具体操作。 + +**验证步骤** + +1. 以数据库用户(如omm)登录节点。 + + ```shell + su - omm + ``` + +2. 执行如下命令查看数据库状态。 + + ```shell + gs_om -t status + ``` + + 查询结果的cluster_state为Normal代表数据库正常。 + +## 提交升级 + +升级完成后,如果验证也没问题。接下来就可以提交升级。 + +> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**:一旦提交操作完成,则不能再执行回滚操作。 + +**操作步骤** + +1. 以数据库用户(如omm)登录节点。 + + ```shell + su - omm + ``` + +2. 执行如下命令完成升级提交。 + + ```shell + gs_upgradectl -t commit-upgrade -X /opt/software/mogdb/clusterconfig.xml + ``` + +## 升级版本回滚 + +本章介绍版本回滚方法。 + +**操作步骤** + +1. 以数据库用户(如omm)登录节点。 + + ```shell + su - omm + ``` + +2. 执行如下命令完成版本回滚(回滚内核代码)。回滚完成,如果需要保持内核和om代码的版本一致,可以执行一下旧包的前置命令(参见[执行前置脚本gs_preinstall](#qianzhijiaoben))。 + + ```shell + gs_upgradectl -t auto-rollback -X /opt/software/mogdb/clusterconfig.xml + ``` + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif)**说明:** 如果数据库异常,需要强制回滚,可以使用如下命令。 + > + > ```shell + > gs_upgradectl -t auto-rollback -X /opt/software/mogdb/clusterconfig.xml --force + > ``` + +3. 查看回滚之后的版本号。 + + ```shell + gs_om -V | --version + ``` + + 如果升级失败,请按照如下方式进行处理: + + a. 排查是否有环境问题。 + + 如磁盘满、网络故障等,或者升级包、升级版本号是否正确。排除问题后,可以尝试重入升级。 + + b. 如果没有发现环境问题,或者重入升级失败,需要收集相关日志,找技术支持工程师定位。 + + 收集日志命令: + + ```shell + gs_collector -begin-time='20200724 00:00' -end-time='20200725 00:00' + ``` + + 如果条件允许,建议保留环境。 diff --git a/product/zh/docs-mogdb/v3.0/characteristic-description/application-development-interfaces/MogDB-MySQL-compatibility.md b/product/zh/docs-mogdb/v3.0/characteristic-description/application-development-interfaces/MogDB-MySQL-compatibility.md new file mode 100644 index 0000000000000000000000000000000000000000..0d15a60edf58d3e86adfd67d19e92b1ad49e7335 --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/characteristic-description/application-development-interfaces/MogDB-MySQL-compatibility.md @@ -0,0 +1,24 @@ +--- +title: MySQL兼容增强 +summary: MySQL兼容增强 +author: Zhang Cuiping +date: 2022-06-21 +--- + +# MySQL兼容增强 + +## 可获得性 + +本特性自MogDB 3.0.0版本开始引入。 + +## 特性简介 + +本特性主要从三方面增强MogDB与MySQL的兼容性。首先是用户锁,允许用户通过sql加自定义的锁,可以让多个程序之间完成加锁相关的交互过程,使得客户端从任何位置访问都可以得到一致性的锁视图。其次,支持建表插入数据时默认记录插入当前时间;更新数据时,如果未指定更新时间,默认显示数据变更的当前时间。最后是支持设置会话级SQL模式,允许运行时变更、全局变更以及会话内变更。同时,支持兼容Insert语法,Insert into可以简写为insert。 + +## 客户价值 + +通过设置用户锁,对数据、数据结构或者某些字符串进行保护,避免会话之间相互干扰,保证了信息的一致性和安全性。解决了用户业务数据写入与修改时,记录其操作时间戳的问题。通过设置sql模式,可以解决早期版本遗留问题与后期版本的兼容性。 + +## 相关页面 + +[CREATE TABLE](CREATE-TABLE), [ALTER TABLE](ALTER-TABLE), [INSERT](INSERT) \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/characteristic-description/application-development-interfaces/MogDB-Oracle-compatibility.md b/product/zh/docs-mogdb/v3.0/characteristic-description/application-development-interfaces/MogDB-Oracle-compatibility.md new file mode 100644 index 0000000000000000000000000000000000000000..b372134a130a076dbe60b68cced480ee89b3a10f --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/characteristic-description/application-development-interfaces/MogDB-Oracle-compatibility.md @@ -0,0 +1,24 @@ +--- +title: Oracle兼容增强 +summary: Oracle兼容增强 +author: Zhang Cuiping +date: 2022-06-17 +--- + +# Oracle兼容增强 + +## 可获得性 + +本特性自MogDB 3.0.0版本开始引入。 + +## 特性简介 + +本特性的目标是使用MogDB去替换Oracle的过程中,做到不修改业务代码或尽量减少修改业务代码。所有SQL使用方法以oracle数据库为参考,结果不同则视为有缺陷,结果顺序不同不视为缺陷(除非语句中明确指定排序),扩展功能不视为缺陷。 + +## 客户价值 + +本特性通过减少业务代码的修改,增强MogDB与Oracle的兼容性。 + +## 相关页面 + +[compat-tools仓库页面](https://gitee.com/enmotech/compat-tools) diff --git a/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/19-transaction-async-submit.md b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/19-transaction-async-submit.md new file mode 100644 index 0000000000000000000000000000000000000000..8db3ec60bcc6cb06e9ea87ac9733e12bc764091f --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/19-transaction-async-submit.md @@ -0,0 +1,30 @@ +--- +title: 事务异步提交 +summary: 事务异步提交 +author: Guo Huan +date: 2022-06-13 +--- + +# 事务异步提交 + +## 可获得性 + +本特性自MogDB 3.0.0版本开始引入。 + +## 特性简介 + +在MogDB的线程池模式下为每个线程组增加了committer线程,当事务提交过程中等待日志刷盘的时候将session挂起,交由committer线程在日志刷盘完成之后继续提交事务,而原worker线程在该session挂起之后可以去处理其他待处理的session。 + +## 客户价值 + +在TP场景中,对高并发下事务处理的性能有较高的需求。然而MogDB中事务提交的过程中需要同步等待日志落盘,这一期间的worker线程处于空闲状态,并不能被利用去处理其他的事务。虽然在MogDB中有“synchronous_commit=off”的实现,但该实现并不能保证数据库中途崩溃之后数据的完整性。 + +本特性能够实现真正意义上的事务异步提交,在保证数据库可靠性的前提下更加充分利用CPU,提升高并发场景下事务处理处理能力,尤其在小查询的增删改操作上会有明显的体现。 + +## 特性约束 + +- 该功能仅在线程池模式下打开有效,非线程池模式下不支持事务异步提交。即设置enable_threadpool = on”和“synchronous_commit=on”。 + +## 相关页面 + +[GS_ASYNC_SUBMIT_SESSIONS_STATUS](GS_ASYNC_SUBMIT_SESSIONS_STATUS)、[async_submit](20-MogDB-transaction#async_submit)、[LOCAL_THREADPOOL_STATUS](LOCAL_THREADPOOL_STATUS) \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/20-copy-import-optimization.md b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/20-copy-import-optimization.md new file mode 100644 index 0000000000000000000000000000000000000000..660fda6aae9b7cca324826ce72130896fa5021f0 --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/20-copy-import-optimization.md @@ -0,0 +1,95 @@ +--- +title: COPY导入优化 +summary: COPY导入优化 +author: Guo Huan +date: 2022-06-16 +--- + +# COPY导入优化 + +## 可获得性 + +本特性自MogDB 3.0.0版本开始引入。 + +## 特性简介 + +COPY是使用较多的导入用户表数据的方式,本特性通过利用现代CPU的SIMD特性来提升COPY在解析阶段的性能,从而提升COPY的性能,提升导入的速度。 + +COPY从文件中导入数据的时候在解析阶段查找分隔符以及在判断CSV/TEXT解析出的数据是否合法的时候,理论上都是字符串比较操作,可以利用SIMD特性将现有一次一个字符比较转换成一次比较多个字符,从而减少分支判断次数提升性能。 + +## 客户价值 + +利用SIMD指令针对COPY解析过程中的行列分隔符查找做优化。本特性的最终用户为普通客户群体,如数据库DBA,软件开发人员等。COPY性能提升为10%-30%。 + +| 数据总条数 | **100000000**(1亿) | +| ---------------- | -------------------- | +| **数据总大小** | **24GB** | +| **平均性能提升** | **12.29%** | + +测试结果如下: + +| 测试次序 | 未使用SIMD特性耗时(秒) | 使用SIMD特性耗时(秒) | +| ---------- | ------------------------ | ---------------------- | +| 第一次测试 | 761.01 | 671.05 | +| 第二次测试 | 747.06 | 662.60 | +| 第三次测试 | 770.22 | 663.03 | +| 第四次测试 | 747.940 | 674.03 | +| 第五次测试 | 787.22 | 674.13 | +| 平均耗时 | 762.69 | 668.97 | + +## 特性约束 + +- 只支持X86架构的机器,只支持text和csv文件,且如下情况不支持:转义字符、escape以及quote,null值替换以及自定义列分隔符; + +- 因为该字符串比较指令值是SSE4.2才开始支持,所以只有支持SSE4.2的X86才可以使用该优化。 + +可以使用如下命令来判断机器是否支持SSE4.2指令集(以root或者omm用户登录都可以): + +```shell +--显示为SSE 4.2 supported表示支持 +[omm3@mogdb-kernel-0004 ~]$ grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported" +SSE 4.2 supported + +--显示为SSE 4.2 supported表示不支持 +[xxxx@node158 ~]$ grep -q sse4_2 /proc/cpuinfo && echo "SSE 4.2 supported" || echo "SSE 4.2 not supported" +SSE 4.2 not supported +``` + +可以使用以下命令开启或关闭enable_sse42特性 + +登录数据库 + +```shell +[omm3@mogdb-kernel-0004 ~]$ gsql -d postgres -p18000 +gsql ((MogDB 3.0.0 build 945141ad) compiled at 2022-05-28 16:14:02 commit 0 last mr ) +Non-SSL connection (SSL connection is recommended when requiring high-security) +Type "help" for help. +``` + +开启enable_sse42特性 + +```sql +MogDB=# set enable_sse42 to on; +SET +MogDB=# show enable_sse42; +enable_sse42 +-------------- + on +(1 row) +``` + +关闭enable_sse42特性 + +```sql +MogDB=# set enable_sse42 to off; +SET +MogDB=# show enable_sse42; +enable_sse42 +-------------- +off +(1 row) +``` + +## 相关页面 + +[COPY](COPY) \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/21-dynamic-partition-pruning.md b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/21-dynamic-partition-pruning.md new file mode 100644 index 0000000000000000000000000000000000000000..452c0144b968861bff73bf588ea9221e29f32e1c --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/21-dynamic-partition-pruning.md @@ -0,0 +1,32 @@ +--- +title: 动态分区裁剪 +summary: 动态分区裁剪 +author: Guo Huan +date: 2022-06-17 +--- + +# 动态分区裁剪 + +## 可获得性 + +本特性自MogDB 3.0.0版本开始引入。 + +## 特性简介 + +本特性主要实现如下4个功能: + +1. 支持NEST LOOP进行分区裁剪。 + +2. 支持绑定变量进行分区裁剪。 + +3. 支持子查询进行分区裁剪。 + +4. 支持通过EXPLAIN ANALYZE查看动态分区裁剪结果。 + +## 客户价值 + +本特性主要对分区裁剪特性进行优化,引入动态分区裁剪,同时支持通过EXPLAIN ANALYZE查看分区裁剪结果。在SQL执行阶段裁剪掉不需要的分区,再扫描分区表,从而提升分区表的查询性能。 + +## 相关页面 + +[静态分区裁剪](static-partition-pruning)、[动态分区裁剪](dynamic-partition-pruning) diff --git a/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/22-sql-running-status-observation.md b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/22-sql-running-status-observation.md new file mode 100644 index 0000000000000000000000000000000000000000..3059ec345aad1ad808eca8e4ee329bb326c60d5f --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/22-sql-running-status-observation.md @@ -0,0 +1,107 @@ +--- +title: SQL运行状态观测 +summary: SQL运行状态观测 +author: Guo Huan +date: 2022-06-17 +--- + +# SQL运行状态观测 + +## 可获得性 + +本特性自MogDB 3.0.0版本开始引入。 + +## 特性简介 + +采样线程默认1s采样一次,可通过guc参数asp_sample_interval控制,内存中最多采样100000行数据,通过asp_sample_num控制,到达上限就会刷新到磁盘上。 + +## 客户价值 + +当发现某条SQL语句存在性能瓶颈,且无法在采样视图中查询到该SQL每个算子的执行情况时,可以通过plan_node_id定位性能问题。 + +算子:SQL语句执行过程中各个步骤的具体动作(例如:SELECT、SUM、WHERE、Group By、Having、Order By、Limit等) + +## 特性描述 + +在[dbe_perf.local_active_session](LOCAL_ACTIVE_SESSION)和[GS_ASP](GS_ASP)中新增一列plan_node_id来记录SQL语句每个算子操作的执行情况。 + +现有的监控级别由guc参数[resource_track_level](13-load-management#resource_track_level)控制,该参数按照级别存在三个值,分别是: + +- none:不开启资源记录功能; + +- query:开启query级别资源记录功能; + +- operator:开启query级别和算子级别资源记录功能, + +所以只有当将resource_track_level设成operator的时候才会对SQL语句每个算子操作进行采样。 + +MogDB启动后会启动一个后台worker采样线程,为避免浪费资源,该采样线程不会时刻采样,而是每隔一个采样周期对MogDB进行采样,收集MogDB当时的运行快照保存到内存中,查询视图dbe_perf.local_active_session可以查询到实时的采样信息,该采样周期由guc参数[asp_sample_interval](27-system-performance-snapshot#asp_sample_interval)控制,默认采样周期为1s,MogDB每在内存中采样100000行(由guc参数[asp_sample_num](27-system-performance-snapshot#asp_sample_num)控制)会将内存中的采样数据刷新到GS_ASP表中以供历史查询,只有语句执行时间大于采样时间,才会被采样线程收集到运行信息。 + +## 使用场景 + +1. 首先在session1中创建表test,并执行插入操作: + + ```sql + MogDB=# create table test(c1 int); + CREATE TABLE + MogDB=# insert into test select generate_series(1, 1000000000); + ``` + +2. 在session2中,从活跃会话视图中查询出该SQL的query_id + + ```sql + MogDB=# select query,query_id from pg_stat_activity where query like 'insert into test select%'; + query | query_id + -----------------------------------------------------------+----------------- + insert into test select generate_series(1, 100000000000); | 562949953421368 + (1 row) + ``` + +3. 在session2中,根据该query_id从活跃作业管理视图中查询出该语句的带plan_node_id的执行计划(该语句执行cost需要大于guc值**resource_track_cost**才会被记录到该视图中,该guc参数默认值为100000,session级别可更新,所以为了方便测试,可在测试中将该值改成10) + + Set resource_track_cost=10; + + ```sql + MogDB=# select query_plan from dbe_perf.statement_complex_runtime where queryid = 562949953421368; + query_plan + ---------------------------------------------------------------------------- + Coordinator Name: datanode1 + + 1 | Insert on test (cost=0.00..17.51 rows=1000 width=8) + + 2 | -> Subquery Scan on "*SELECT*" (cost=0.00..17.51 rows=1000 width=8) + + 3 | -> Result (cost=0.00..5.01 rows=1000 width=0) + + + + (1 row) + ``` + +4. 在session2中,根据query_id从采样视图dbe_perf.local_active_session中查询出该语句的采样情况,结合上面查询的执行计划做性能分析。 + + ```sql + MogDB=# select plan_node_id, count(plan_node_id) from dbe_perf.local_active_session where query_id = 562949953421368 group by plan_node_id; + plan_node_id | count + --------------+------- + 3 | 12 + 1 | 366 + 2 | 2 + (3 rows) + ``` + +5. 在session2中执行,当内存数据到达上限值(由guc参数**asp_sample_num**控制)的时候,则会将现有内存的采样数据刷新到gs_asp表中,刷盘后查询gs_asp表也会查到该语句的算子采样的数据。 + + ```sql + MogDB=# select plan_node_id, count(plan_node_id) from gs_asp where query_id = 562949953421368 group by plan_node_id; + plan_node_id | count + --------------+------- + 3 | 19 + 1 | 582 + 2 | 3 + + (3 rows) + ``` + +## 结论 + +当发现`insert into test select generate_series(1, 1000000000)`存在性能瓶颈,通过以上的步骤定位发现,insert操作在整个SQL语句执行过程中被采样的数值最高( plan_node_id =1 ,count=366),可以对其进行优化。 + +## 相关页面 + +[GS_ASP](GS_ASP)、[LOCAL_ACTIVE_SESSION](LOCAL_ACTIVE_SESSION) \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/23-index-creation-parallel-control.md b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/23-index-creation-parallel-control.md new file mode 100644 index 0000000000000000000000000000000000000000..47395c23e33e21dcb722f68691b6bb07c809f97e --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/23-index-creation-parallel-control.md @@ -0,0 +1,28 @@ +--- +title: 索引创建并行控制 +summary: 索引创建并行控制 +author: Guo Huan +date: 2022-06-17 +--- + +# 索引创建并行控制 + +## 可获得性 + +本特性自MogDB 3.0.0版本开始引入。 + +## 特性简介 + +本特性支持直接在索引创建语句中指定并行度,更加有效地利用资源,同时提高使用灵活性。 + +## 客户价值 + +本特性在创建索引的语法中增加指定并行度的选项,便于DBA及交付测试人员从语法层面实现对索引创建并发度的控制,达到最优执行效果。 + +## 特性描述 + +在进行索引创建的时候增加parallel语法,来控制索引创建的并行度。 + +## 相关页面 + +[CREATE INDEX](CREATE-INDEX) \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/24-brin-index.md b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/24-brin-index.md new file mode 100644 index 0000000000000000000000000000000000000000..55283940e40c571cfbd889a4f6f093faf3d5a703 --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/24-brin-index.md @@ -0,0 +1,274 @@ +--- +title: BRIN索引 +summary: BRIN索引 +author: Guo Huan +date: 2022-06-20 +--- + +# BRIN索引 + +## 可获得性 + +本特性自MogDB 3.0.0版本开始引入。 + +## 特性简介 + +MogDB 3.0.0版本新增BRIN索引特性。 + +brin索引即block range index块范围索引。和其他索引不同,brin索引可以实现快速排除不满足查询条件的行。 + +## 客户价值 + +- 顺序扫描会很快,则针对大表的统计型SQL性能会大幅提升。 +- 创建索引的速度非常快。 +- 索引占用的空间很小。 + +## 特性描述 + +BRIN索引即block range index块范围索引。和其他索引不同,BRIN索引的思想是快速排除不满足查询条件的行,而不是快速找到匹配的行。 + +BRIN索引的工作方式:表的块被划分成一些区间,索引存储了每个区间内的摘要信息(一般是min和max信息,对于空间数据还有一些其他信息)。如果要查询的列的值,不会落入这个区间的摘要信息中,那么就可以跳过这个区间,如果不能跳过,就需要扫描这个区间的所有行。 + +BRIN索引适合数据与物理位置有相关性的列。优化器使用这个值来从索引扫描和位图扫描中做选择。我们也可以使用它估计BRIN索引的适合程度。列的位置相关性越接近1,则列数据的相关性越强,越适合建BRIN索引。另外BRIN索引主要是为大表而设计的,相比于btree等索引,BRIN索引的数据量较小。 + +BRIN索引支持的数据类型如下: + +| bytea | char | name | integer | numeric | text | +| ------------ | ----------- | --------------------- | ---------- | ----------- | ------------ | +| **datetime** | **tid** | **box_inclusion** | **float** | **abstime** | **reltime** | +| **macaddr** | **network** | **network_inclusion** | **bpchar** | **time** | **interval** | +| **bit** | **varbit** | **range_inclusion** | **uuid** | **oid** | **timetz** | + +## 使用场景 + +### 新建BRIN索引 + +语法与创建B-树、哈希、GiST、SP-GiST、GIN的方式一致。 + +创建BRIN索引时需要指定参数pages_per_range,指定BRIN索引中每个range中包含多少个page。 + +```sql +CREATE INDEX brinidx ON tbbrin USING brin(i1,i2,i3) WITH (pages_per_range=64, autosummarize=off); +--在线CONCURRENTLY新建 +CREATE INDEX CONCURRENTLY brinidx ON tbbrin USING brin(i1,i2,i3) WITH (pages_per_range=64); +``` + +对于在线(CONCURRENTLY)新建索引,关注dml操作是否阻塞和新插入的数据是否会更新到索引中。新插入的索引数据可能需要手动更新索引数据,通过函数brin_summarize_new_values。示例: + +```sql +SELECT brin_summarize_new_values((select oid from pg_class where relname='brinidx')::oid); +``` + +目前不支持自动更新索引数据。 + +### 重建BRIN索引 + +语法和重建创建B-树、哈希、GiST、SP-GiST、GIN的方式一致。 + +```sql +REINDEX INDEX brinidx ; +--在线CONCURRENTLY重建索引 +REINDEX INDEX CONCURRENTLY brinidx ; +``` + +对于在线(CONCURRENTLY)重建,需关注建索引过程中下发的数据,最终是否有索引,索引数据是否正确,是否阻塞dml操作。 + +### 通过执行计划查看是否已使用到BRIN索引 + +示例: + +```sql +MogDB=# explain select * from example where id = 100; + QUERY PLAN +--------------------------------------------------------- + Bitmap Heap Scan on example (cost=15.88..486.21 rows=500 width=4) + Recheck Cond:(id = 100) + -> Bitmap Index Scan on idx (cost=0.00..15.75 rows=500 width=0) + Index Cond:(id =100) +(4 rows) +``` + +### 对BRIN索引的更新和插入 + +BRIN目前不支持自动更新新插入数据的索引,但可以通过以下两种方式来更新BRIN索引。 + +- 对表执行vaccum操作,vacuum后索引已经更新; + +- 执行brin_summarize_new_values(oid)函数。入参为BRIN索引的oid,如果返回值为0则没有更新索引,返回1则索引已被更新。 + +示例: + +```sql +SELECT brin_summarize_new_values((select oid from pg_class where relname='brinidx')::oid); +``` + +目前没有函数可以观测是否需要更新索引,但可以通过以下操作来检查: + +- 从pg_classs查看表的总块大小; + +- 根据brin_revmap_data查看已经建立索引的页号; + +- 计算前面2项的差值是否大于pages_per_range,若大于则说明索引需要更新。 + +### 对BRIN索引的alter/drop/vacuum/vacuum full + +在测试表上创建索引用于测试alter/drop/vacuum/vacuum full索引命令。 + +对BRIN索引执行alter/drop/vacuum/vacuum full操作的语法与alter/drop/vacuum B-树、哈希、GiST、SP-GiST、GIN的方式一致。 + +BRIN只支持设置pages_per_range和autosummarize参数,并且alter之后,只是更新了元数据,需要reindex才会生效。索引alter和reindex之后,索引的配置项会改变。 + +vacuum index操作会自动调用brin_summarize_new_values函数来更新索引数据。索引vacuum后,没有汇总的数据会自动汇总,产生新的索引数据。索引被vacuum full之后,会重新创建索引,在pg_class可以看到oid不变但是relfilenode已经变化。 + +示例: + +```sql +alter index idx set(pages_per_range=64); +``` + +### pageinspect支持BRIN + +对于表的BRIN索引,可以通过pageinspect查询页面数据。 + +pageinspect模块提供了允许查看数据库数据页面或索引页面内容的函数,这功能调试或问题定位很有帮助。pageinspect工具安装方式不变,安装时执行以下命令: + +````sql +create extension pageinspect; +```` + +pageinspect暂时只支持非分区表。 + +BRIN索引提供三个函数分别用于查询meta page、revmap_page和regular page中的数据: + +- brin_metapage_info(page bytea) returns record + + 返回有关BRIN 索引元页的分类信息,其中第二个参数固定为 0。例如: + + ```sql + MogDB=# SELECT * FROM brin_metapage_info(get_raw_page('brinidx', 0)); + magic | version | pagesperrange | lastrevmappage + ------------+---------+---------------+---------------- + 0xA8109CFA | 1 | 4 | 2 + ``` + +- brin_revmap_data(page bytea) returns setof tid + + 返回BRIN 索引范围映射页面中的元组标识符列表。例如: + + ```sql + MogDB=# SELECT * FROM brin_revmap_data(get_raw_page('brinidx', 2)) limit 5; + pages + --------- + (6,137) + (6,138) + (6,139) + (6,140) + (6,141) + ``` + +- brin_page_items(page bytea, index oid) returns setof record + + 返回存储在BRIN 数据页面中的数据。例如: + + ```sql + MogDB=# SELECT * FROM brin_page_items(get_raw_page('brinidx', 5), + 'brinidx') + ORDER BY blknum, attnum LIMIT 6; + itemoffset | blknum | attnum | allnulls | hasnulls | placeholder | value + ------------+--------+--------+----------+----------+-------------+-------------- + 137 | 0 | 1 | t | f | f | + 137 | 0 | 2 | f | f | f | {1 .. 88} + 138 | 4 | 1 | t | f | f | + 138 | 4 | 2 | f | f | f | {89 .. 176} + 139 | 8 | 1 | t | f | f | + 139 | 8 | 2 | f | f | f | {177 .. 264} + ``` + +### BRIN索引的auto summarize + +表的BRIN索引,会自动summarize,对未见索引的数据新建索引数据。 + +1. 更新表数据; + +2. 通过pg_stat_user_table查询表的last_autovacuum字段更新,例如: + + `````sql + MogDB=# select relname,last_vacuum,last_autovacuum from pg_stat_user_tables where relname = 'person'; + relname | last_vacuum | last_autovacuum + ---------+-------------------------------+----------------- + person | 2022-06-20 19:21:58.201214+08 | + (1 row) | + ````` + + 可以执行以下两条命令,来加快表的autovacuum频率: + + ```sql + ALTER TABLE example SET (autovacuum_vacuum_scale_factor = 0.0); + ALTER TABLE example SET (autovacuum_vacuum_threshold = 100); + ``` + +3. pg_stat_user_table表更新后,可以观察到索引数据的自动更新。 + + ```sql + MogDB=# select relname,last_vacuum,last_autovacuum from pg_stat_user_tables where relname = 'person'; + relname | last_vacuum | last_autovacuum + ---------+-------------------------------+----------------- + person | 2022-06-20 19:23:58.201214+08 | 2022-06-20 19:24:59.201214+08 + (1 row) + ``` + +## 使用示例 + +```sql +#创建一张测试表 +MogDB=# CREATE TABLE testtab (id int NOT NULL PRIMARY KEY,date TIMESTAMP NOT NULL, level INTEGER, msg TEXT); +NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "testtab_pkey" for table "testtab" +CREATE TABLE +#插入测试数据 +MogDB=# INSERT INTO testtab (id, date, level, msg) SELECT g, CURRENT_TIMESTAMP + ( g || 'minute' ) :: interval, random() * 6, md5(g::text) FROM generate_series(1,8000000) as g; +INSERT 0 8000000 +#不创建索引的情况下查看一条查询语句的执行计划,可以看到执行计划用的是 seq scan +MogDB=# explain analyze select * from public.testtab where date between '2019-08-08 14:40:47.974791' and '2019-08-08 14:50:47.974791'; + QUERY PLAN +--------------------------------------------------------------------------------------------------------------------------------------------- + Seq Scan on testtab (cost=0.00..212024.20 rows=43183 width=48) (actual time=46620.314..46620.314 rows=0 loops=1) + Filter: (("date" >= '2019-08-08 14:40:47.974791'::timestamp without time zone) AND ("date" <= '2019-08-08 14:50:47.974791'::timestamp without time zone)) + Rows Removed by Filter: 8000000 + Total runtime: 46620.580 ms +(4 rows) +#在表上创建 brin 索引 +MogDB=# create index testtab_date_brin_idx on testtab using brin (date); +CREATE INDEX +#查看 brin 索引的索引信息,可以看到 brin 索引的大小大约为 64 kB +MogDB=# \di+ testtab_date_brin_idx  + List of relations + Schema | Name | Type | Owner | Table | Size | Storage | Description +--------+------------------------+-------+--------+---------+-------+---------+------------- + public | testtab_date_brin_idx  | index | wusong | testtab | 64 kB | | +(1 row) +#查看相同查询语句的执行计划,可以看到查询使用 brin 索引 +MogDB=# explain analyze select * from public.testtab where date between '2019-08-08 14:40:47.974791' and '2019-08-08 14:50:47.974791'; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------------------------------------------------------- + Bitmap Heap Scan on testtab (cost=20.00..24.02 rows=1 width=49) (actual time=1.121..1.121 rows=0 loops=1) + Recheck Cond: (("date" >= '2019-08-08 14:40:47.974791'::timestamp without time zone) AND ("date" <= '2019-08-08 14:50:47.974791'::timestamp without time zone)) + -> Bitmap Index Scan on "testtab_date_brin_idx " (cost=0.00..20.00 rows=1 width=0) (actual time=1.119..1.119 rows=0 loops=1) + Index Cond: (("date" >= '2019-08-08 14:40:47.974791'::timestamp without time zone) AND ("date" <= '2019-08-08 14:50:47.974791'::timestamp without time zone)) + Total runtime: 1.281 ms +(5 rows) +#在表的 date 列上创建 btree 索引 +MogDB=# create index testtab_date_idx  on testtab(date); +CREATE INDEX +#查看 btree 索引的大小,可以看到 btree 索引大小约为 172 MB,远大于 brin 索引的 64 KB +MogDB=# \di+ testtab_date_idx  + List of relations + Schema | Name | Type | Owner | Table | Size | Storage | Description +--------+-------------------+-------+--------+---------+--------+---------+------------- + public | testtab_date_idx  | index | wusong | testtab | 172 MB | | +(1 row) + +``` + +## 相关页面 + +[CREATE INDEX](CREATE-INDEX)、[DROP INDEX](DROP-INDEX)、[ALTER INDEX](ALTER-INDEX)、[VACUUM](VACUUM) \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/25-bloom-index.md b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/25-bloom-index.md new file mode 100644 index 0000000000000000000000000000000000000000..4d919e209085884eb254e9f6a6220339e90db68c --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/25-bloom-index.md @@ -0,0 +1,211 @@ +--- +title: BLOOM索引 +summary: BLOOM索引 +author: Guo Huan +date: 2022-06-21 +--- + +# BLOOM索引 + +## 可获得性 + +本特性自MogDB 3.0.0版本开始引入。 + +## 特性简介 + +Bloom提供了一种基于布鲁姆过滤器的索引访问方法。布鲁姆过滤器是一种空间高效的数据结构,它被用来测试一个元素是否为一个集合的成员。在索引访问方法的情况下,它可以通过尺寸在索引创建时决定的签名来快速地排除不匹配的元祖。 + +## 客户价值 + +Bloom索引适用于表中有很多列,并且查询可以使用任意列组合的场景。对于传统的索引,如Btree在这种场景下可能需要建很多个索引来覆盖可能的查询条件,可能导致索引占用空间很大,且影响插入和更新的性能,而Bloom索引只需要建一个就可以应对。 + +## 特性描述 + +用户在Bloom索引的适用场景下可以通过Bloom索引进行查询,同时相对于Btree索引还可以减少索引占用空间大小。 + +## 使用场景 + +当表具有很多属性并且查询可能会测试其中任意组合时,Blooms类型的索引最有用,传统的btree索引会比Bloom索引更快,但需要很多btree索引来支持所有可能的查询,而对于Bloom只需要一个即可。 + +### 创建Bloom索引 + +#### 约束 + +- Bloom 索引只支持在行存表上创建 + +- 创建索引的列类型只能是4字节长度的int类型或变长字符串类型,在MogDB中4字节长度的int类型可以是int、int4和integer,变长字符串类型可以是varchar、text和clob。 + +- Bloom不支持创建唯一索引 + +- 不支持索引null值,null值跳过 +- 只支持等值查询 +- 不支持分区表Global索引 + +#### 示例 + +```sql +CREATE INDEX ON USING bloom(col1,col2...) with (length=80,col1=2,col2=4); +``` + +#### 参数说明 + +**length** + +指定一条索引中生成的签名使用多少bit表示。默认值是80,内部会将用户指定的值会向上取整为16的整数倍(对用户透明),最小值是1,最大值是4096。如果设置值不在限定范围内,命令执行报错,并提示数值的正确范围。 + +**col1-col32** + +指定每一个索引列使用多少bit表示。默认值是2,最小值是1,最大值是4095。如果设置值不在限定范围内,命令执行报错,并提示数值的正确范围。 + +如果对非行存表创建Bloom索引,报错,提示不能对非行存表创建。 + +如果创建Bloom的唯一索引,报错,提示不能创建唯一索引。 + +如果创建分区表的Global索引,且索引类型是Bloom,报错,提示分区表Global索引只能是Btree类型。 + +### 删除Bloom索引 + +示例: + +```sql +MogDB=# DROP INDEX bloom_idx; +DROP INDEX +``` + +### 重建Bloom索引 + +本特性支持重建一个已存在的Bloom索引。用户通过客户端或者数据库驱动下发重建Bloom索引的命令,索引最终重建成功,索引元数据正确,索引可以正常使用(如,原来执行计划走 Bloom 索引的,在索引重建后,执行计划仍能使用重建后的 Bloom 索引)。 + +示例: + +```sql +MogDB=# REINDEX INDEX bloom_idx; +REINDEX +``` + +### 修改Bloom索引 + +本特性支持修改一个已存在的Bloom索引的属性。索引属性相关约束与创建索引时的约束保持一致,如Bloom索引的length修改后需要在[1,4096]的范围内。 + +关注点: + +- 修改的索引属性需要符合索引规则和约束,如果不符合需要报错,返回对应的提示信息; +- 重命名索引,在pg_class中校验索引元数据是否正确; +- 修改Bloom索引的length或col属性,如果要验证属性是否生效可以简单通过pg_class中relpages字段的值的变化判断,或者通过SELECT pg_size_pretty(pg_relation_size(‘blidx’))等命令查看索引大小的变化; +- 修改tablespace,可以通过在磁盘上查看数据文件的方式,确认是否生效。 + +示例: + +```sql +MogDB=# ALTER INDEX IF EXISTS bloom_idx RENAME TO newbloom_idx; +ALTER INDEX +MogDB=# SELECT oid,relname,relfilenode,relpages FROM pg_class WHERE relname = 'newbloom_idx'; + oid | relname | relfilenode | relpages +-------+--------------+-------------+---------- + 41159 | newbloom_idx | 41160 | 30 +(1 row) +MogDB=# ALTER INDEX IF EXISTS newbloom_idx SET (length=160); +ALTER INDEX +MogDB=# REINDEX INDEX newbloom_idx; +REINDEX +MogDB=# SELECT oid,relname,relfilenode,relpages FROM pg_class WHERE relname = 'newbloom_idx'; + oid | relname | relfilenode | relpages +-------+--------------+-------------+---------- + 41159 | newbloom_idx | 41162 | 49 +(1 row) +``` + +### 使用Bloom索引查询 + +当表上存在Bloom索引,且查询条件符合Bloom索引的适用条件时,执行计划会显示已使用Bloom索引。 + +示例: + +```sql +CREATE TABLE tbloom AS + SELECT + (random() * 1000000)::int as i1, + (random() * 1000000)::int as i2, + (random() * 1000000)::int as i3, + (random() * 1000000)::int as i4, + (random() * 1000000)::int as i5, + (random() * 1000000)::int as i6 + FROM + generate_series(1,10000000); + +CREATE INDEX btreeidx ON tbloom (i1, i2, i3, i4, i5, i6); +CREATE INDEX bloomidx ON tbloom USING bloom (i1, i2, i3, i4, i5, i6); + +MogDB=# EXPLAIN ANALYZE SELECT * FROM tbloom where i3 = 100 AND i5 = 1000; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------ + Bitmap Heap Scan on tbloom (cost=178436.31..179393.23 rows=250 width=24) (actual time=138.209..138.209 rows=0 loops=1) + Recheck Cond: ((i3 = 100) AND (i5 = 1000)) + Rows Removed by Index Recheck: 21936 + Heap Blocks: exact=18673 + -> Bitmap Index Scan on bloomidx (cost=0.00..178436.25 rows=250 width=0) (actual time=85.681..85.681 rows=21936 loops=1) + Index Cond: ((i3 = 100) AND (i5 = 1000)) + Total runtime: 138.412 ms +(7 rows) + +MogDB=# EXPLAIN ANALYZE SELECT * FROM tbloom where i1 = 100 AND i2 = 1000; + QUERY PLAN +----------------------------------------------------------------------------------------------------------------------- + [Bypass] + Index Only Scan using btreeidx on tbloom (cost=0.00..8.27 rows=1 width=24) (actual time=0.084..0.084 rows=0 loops=1) + Index Cond: ((i1 = 100) AND (i2 = 1000)) + Heap Fetches: 0 + Total runtime: 0.134 ms +(5 rows) +``` + +### 更新Bloom索引 + +示例: + +```sql +MogDB=# select i2,i3,i4 from tbloom where rownum <=5; + i2 | i3 | i4 +--------+--------+-------- + 778090 | 624067 | 948170 + 927435 | 800792 | 904419 + 325217 | 726778 | 834407 + 925272 | 221411 | 826500 + 93906 | 992575 | 997677 + +UPDATE tbloom SET i1 = 10 + WHERE i2 = 325217 AND + i3 = 726778 AND + i4 = 834407; + +MogDB=# select * from tbloom where i2 = 325217 and i3 = 726778; + i1 | i2 | i3 | i4 | i5 | i6 +----+--------+--------+--------+--------+-------- + 10 | 325217 | 726778 | 834407 | 702579 | 525581 +(1 row) + +MogDB=# explain select * from tbloom where i2 = 325217 and i3 = 726778; + QUERY PLAN +---------------------------------------------------------------------------- + Bitmap Heap Scan on tbloom (cost=178439.48..178443.50 rows=1 width=24) + Recheck Cond: ((i2 = 325217) AND (i3 = 726778)) + -> Bitmap Index Scan on bloomidx (cost=0.00..178439.48 rows=1 width=0) + Index Cond: ((i2 = 325217) AND (i3 = 726778)) +(4 rows) + +DELETE FROM tbloom WHERE i2 = 1000 AND i3 = 789678 AND i4 = 311551; +select * from tbloom where i2 = 1000 and i3 = 789678; + i1 | i2 | i3 | i4 | i5 | i6 +----+----+----+----+----+---- +(0 rows) +explain select * from tbloom where i2 = 1000 and i3 = 789678; + Bitmap Heap Scan on tbloom (cost=178440.26..178444.28 rows=1 width=24) + Recheck Cond: ((i2 = 1000) AND (i3 = 789678)) + -> Bitmap Index Scan on tbloomidx (cost=0.00..178440.26 rows=1 width=0) + Index Cond: ((i2 = 1000) AND (i3 = 789678)) +(4 rows) +``` + +## 相关页面 + +[CREATE INDEX](CREATE-INDEX)、[DROP INDEX](DROP-INDEX)、[ALTER INDEX](ALTER-INDEX) \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/26-backend-compression.md b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/26-backend-compression.md new file mode 100644 index 0000000000000000000000000000000000000000..71bddc05e8c9eec1c2550005f2673c90723846f2 --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/characteristic-description/enterprise-level-features/26-backend-compression.md @@ -0,0 +1,28 @@ +--- +title: 后台压缩 +summary: 后台压缩 +author: Guo Huan +date: 2022-06-22 +--- + +# 后台压缩 + +## 可获得性 + +本特性自MogDB 3.0.0版本开始引入。 + +## 特性简介 + +MogDB 3.0.0版本在Astore行存场景下支持数据压缩功能。前台业务线程执行DML语句对一个table中数据进行新增或修改,数据的操作只会在buffer缓存中执行,前台业务不参与实际压缩逻辑。 + +## 客户价值 + +减少客户存储成本,采用数据压缩的形式存储数据到持久化介质上,同时在开启压缩功能的情况下不会对前台业务造成性能影响,同时消除前台压缩长对性能的影响。 + +## 特性约束 + +如何支持压缩功能通过在创建表时指明压缩属性来实现,下面列出基本的SQL语法: + +```sql +create table (......) with (compression=yes); +``` \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/characteristic-description/high-availability/14-cm.md b/product/zh/docs-mogdb/v3.0/characteristic-description/high-availability/14-cm.md index 693c61c02eec957b3414dc1bcdbc532126038590..c0f7e75eb81302f47468ced90891e6f417f02610 100644 --- a/product/zh/docs-mogdb/v3.0/characteristic-description/high-availability/14-cm.md +++ b/product/zh/docs-mogdb/v3.0/characteristic-description/high-availability/14-cm.md @@ -13,14 +13,35 @@ date: 2022-05-10 ## 特性简介 -CM(Cluster Manager)是一款数据库管理软件,由cm_server和cm_agent组成。 +CM(Cluster Manager)是一款数据库管理软件,可分为四大模块:cm_server, cm_agent, om_monitor, cm_ctl。其核心功能如下: -- cm_agent是部署在数据库每个主机上,用来启停和监控各个数据库实例进程的数据库管理组件。 -- cm_server是用来进行数据库实例管理和实例仲裁的组件。 +- cm_server + + 向各个节点上cm_agent发送指令(如数据库实例的启动、停止、状态查询、switchover和failover),并接收响应 + + 接收各个节点上cm_agent上报的数据库实例状态信息 + + 各个节点上cm_server自身高可用仲裁 + + 各个节点上数据库实例的高可用仲裁 + +- cm_agent + + 接收并执行cm_server下发的指令,如数据库实例的启动、停止、状态查询、switchover和failover + + 监控本节点上运行的数据库实例的状态并上报给cm_server + +- cm_monitor + + 监控本节点上运行的cm_agent服务,确保其可用性 + +- cm_ctl + + CM集群管理软件的客户端工具 ## 客户价值 -管理和监控数据库系统中各个功能单元和物理资源的运行情况,确保整个系统的稳定运行。 +管理和监控数据库系统中各个功能单元和物理资源的运行情况,确保整个系统的可用性、稳定性。 ## 特性描述 @@ -28,7 +49,9 @@ CM(Cluster Manager)是一款数据库管理软件,由cm_server和cm_agent ## 特性增强 -无。 +- CM高可用自仲裁,内嵌仲裁算法和逻辑,不依赖于第三方组件即可实现仲裁 + +- 自定义资源监控 ## 特性约束 @@ -36,4 +59,4 @@ CM(Cluster Manager)是一款数据库管理软件,由cm_server和cm_agent ## 依赖关系 -无。 \ No newline at end of file +高可用仲裁依赖DCF、DCC、CBB组件。 \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/characteristic-description/maintainability/fault-diagnosis.md b/product/zh/docs-mogdb/v3.0/characteristic-description/maintainability/fault-diagnosis.md new file mode 100644 index 0000000000000000000000000000000000000000..8cdd64c9d6650475373ccf3c55f5c1ccd758909e --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/characteristic-description/maintainability/fault-diagnosis.md @@ -0,0 +1,34 @@ +--- +title: 故障诊断 +summary: 故障诊断 +author: Zhang Cuiping +date: 2022-06-17 +--- + +# 故障诊断 + +## 可获得性 + +本特性自MogDB 3.0.0版本开始引入。 + +## 特性简介 + +为了快速定位故障、收集系统故障信息、导出故障数据,进而修复故障,MogDB 3.0增强了OM功能以及gstrace诊断能力。 + +## 客户价值 + +故障诊断能力的增强,可以方便研发人员及时修复故障,保证系统的正常运行。 + +## 特性描述 + +gs_check工具可以对场景检查结果进行差异比较,并输出差异分析报告,帮助用户快速定位问题。 + +gs_watch工具可监测MogDB进程,当发现进程崩溃时,自动触发调用gs_collector对系统状态进行收集,以便后期分析。 + +gs_gucquery工具可自动收集整理并导出GUC值,比较不同时刻GUC值的变化。 + +gstrace诊断能力增强。支持按模块名和方法名打开一个或多个component(模块)和function(方法)的trace项;提升代码中gstrace点数量,增强gstrace输出信息表达能力;支持新的对关键数据结构PGPROC和user session数据的导出;支持gstrace点暂定并继续或崩溃功能,增强与测试框架整合实现精确控制注错;实现故障注入,包括系统调用报错模拟和变量内容攒写。 + +## 相关页面 + +[gs_check](1-gs_check),[gs_gucquery](gs_gucquery),[gstrace](16-gstrace),[gs_watch](gs_watch) diff --git a/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/benefits-of-partition-pruning.md b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/benefits-of-partition-pruning.md new file mode 100644 index 0000000000000000000000000000000000000000..35012a91c1bee86080f3f68de83abcabe4c4fbdd --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/benefits-of-partition-pruning.md @@ -0,0 +1,66 @@ +--- +title: 分区裁剪的好处 +summary: 分区裁剪的好处 +author: Guo Huan +date: 2022-06-14 +--- + +# 分区裁剪的好处 + +分区裁剪是分区表中常用的性能优化手段。在扫描分区表前,如果能通过检查分区约束条件与每个分区的定义,提前排除不需要扫描的分区,可以极大地提升扫描性能。在查询规划阶段,如果分区约束为确定的表达式,在查询规划阶段就可以根据分区约束表达式裁掉不需要扫描的分区,这种分区裁剪方式一般称为**静态分区裁剪**。静态裁剪从EXPLAIN VERBOSE输出就可以看出裁剪结果,如下所示。 + +explain verbose select * from prune_tt01 where a<8 ; + +```sql +MogDB=# drop table if exists prune_tt01; +DROP TABLE +MogDB=# CREATE TABLE prune_tt01(a int, b int) +PARTITION BY RANGE(a) +( + PARTITION prune_tt01_p1 VALUES LESS THAN(5), + PARTITION prune_tt01_p2 VALUES LESS THAN(10), + PARTITION prune_tt01_p3 VALUES LESS THAN(15), + PARTITION prune_tt01_p4 VALUES LESS THAN(MAXVALUE) +); +CREATE TABLE +MogDB=# INSERT INTO prune_tt01 VALUES (generate_series(1, 20), generate_series(1,20)); +INSERT 0 20 +MogDB=# CREATE INDEX index_prune_tt01 ON prune_tt01 USING btree(a) LOCAL; +CREATE INDEX +MogDB=# explain verbose select * from prune_tt01 where a<8 ; + QUERY PLAN +---------------------------------------------------------------------------------------------------- + Partition Iterator (cost=13.80..27.75 rows=716 width=8) + Output: a, b + Iterations: 2 + Selected Partitions: 1..2 + -> Partitioned Bitmap Heap Scan on public.prune_tt01 (cost=13.80..27.75 rows=716 width=8) + Output: a, b + Recheck Cond: (prune_tt01.a < 8) + -> Partitioned Bitmap Index Scan on index_prune_tt01 (cost=0.00..13.62 rows=716 width=0) + Index Cond: (prune_tt01.a < 8) +(9 rows) +``` + +但是在很多场景下,例如PREPARE-EXECUTE执行方式和分区约束表达式中包含子查询的场景在查询规划阶段,分区约束表达式是不确定的或包含未知的参数,查询规划阶段是不能裁剪的,只能在执行阶段,通过外部参数和子查询的结果确定分区表达式后进行裁剪,通常将在执行阶段做的裁剪称为**动态分区裁剪**。动态裁剪可以通过explain verbose从执行看到裁剪信息(Selected Partitions: PART)如下所示。 + +explain verbose select * from prune_tt01 where a < (select 8); + +```sql +MogDB=# explain verbose select * from prune_tt01 where a < (select 8); + QUERY PLAN +-------------------------------------------------------------------------------------- + Partition Iterator (cost=0.01..36.87 rows=716 width=8) + Output: prune_tt01.a, prune_tt01.b + Iterations: PART + Selected Partitions: PART + InitPlan 1 (returns $0) + -> Result (cost=0.00..0.01 rows=1 width=0) + Output: 8 + -> Partitioned Seq Scan on public.prune_tt01 (cost=0.00..36.86 rows=716 width=8) + Output: prune_tt01.a, prune_tt01.b + Filter: (prune_tt01.a < $0) +(10 rows) +``` + +MogDB自3.0版本后引入了分区表的动态裁剪,大大减少了从磁盘检索的数据量并缩短了处理时间,从而提高查询性能并优化资源利用率。 diff --git a/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/dynamic-partition-pruning.md b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/dynamic-partition-pruning.md new file mode 100644 index 0000000000000000000000000000000000000000..d902ecb30d920b67e91c4f7d43b3c6389fa30e36 --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/dynamic-partition-pruning.md @@ -0,0 +1,260 @@ +--- +title: 动态分区裁剪 +summary: 动态分区裁剪 +author: Guo Huan +date: 2022-06-14 +--- + +# 动态分区裁剪 + +动态分区裁剪主要支持以下三种类型: + +1. Prepare-Execute(绑定变量)执行方式,分区裁剪表达式和静态裁剪类似,唯一区别是静态表达式一侧为Const,动态分区裁剪表达式一侧为外部参数或外部参数组成的表达式。例如: + + ```sql + prepare ps(int) as select * from prune_tt01 where a > $1; + explain verbose execute ps(12); + ``` + +2. 查询语句中包含子查询,主要分为对主查询中的分区表进行裁剪和子查询中的分区表进行裁剪两种方式: + + - 对主查询中的分区表进行裁剪,子查询一般为非相关子查询,子查询作为主查询分区裁剪表达式的一侧,另一侧为分区键,例如 + + ```sql + select * from prune_tt01 where a > (select a from t2 limit 1); + ``` + + - 对子查询中的分区表进行裁剪,子查询一般为相关子查询,且该子查询不支持提升。注意:相关子查询中涉及到对分区表多次裁剪,explain analyze显示的最后一次的裁剪结果。例如: + any子查询: + + ```sql + explain analyze select * from t2 where a > any(select a from prune_tt01 where prune_tt01.a = t2.a); + ``` + + exists子查询: + + ```sql + explain analyze select * from t2 where exists (select a from prune_tt01 where prune_tt01.a = t2.a limit 1); + ``` + +3. NestLoop参数化查询,即查询计划为NestLoop+indexscan查询方式,要求分区表的分区键为两个表的连接键,同时分区键上创建有索引。 + +以下为动态分区裁剪的案例。 + +```sql +drop table if exists prune_tt01; +CREATE TABLE prune_tt01(a int, b int) +PARTITION BY RANGE(a) +( + PARTITION prune_tt01_p1 VALUES LESS THAN(5), + PARTITION prune_tt01_p2 VALUES LESS THAN(10), + PARTITION prune_tt01_p3 VALUES LESS THAN(15), + PARTITION prune_tt01_p4 VALUES LESS THAN(MAXVALUE) +); +INSERT INTO prune_tt01 VALUES (generate_series(1, 20), generate_series(1,20)); +CREATE INDEX index_prune_tt01 ON prune_tt01 USING btree(a) LOCAL; + +drop table if exists tt02; +create table tt02(a int, b int); +INSERT INTO tt02 VALUES (generate_series(1, 20), generate_series(1,20)); +``` + +**prepare-execute(绑定变量)场景:** + +```sql +MogDB=# prepare ps(int) as select * from prune_tt01 where a > $1; +PREPARE +MogDB=# explain verbose execute ps(12); + QUERY PLAN +-------------------------------------------------------------------------------------- + Partition Iterator (cost=0.00..36.86 rows=716 width=8) + Output: a, b + Iterations: PART + Selected Partitions: PART + -> Partitioned Seq Scan on public.prune_tt01 (cost=0.00..36.86 rows=716 width=8) + Output: a, b + Filter: (prune_tt01.a > $1) +(7 rows) + +MogDB=# explain analyze execute ps(12); + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------- + Partition Iterator (cost=0.00..36.86 rows=716 width=8) (actual time=0.099..0.110 rows=8 loops=1) + Iterations: 2 + Selected Partitions: 3..4 + -> Partitioned Seq Scan on prune_tt01 (cost=0.00..36.86 rows=716 width=8) (actual time=0.031..0.034 rows=8 loops=2) + Filter: (a > $1) + Rows Removed by Filter: 3 + Total runtime: 0.218 ms +(7 rows) +``` + +**子查询场景:** + +- 对主查询中的分区表进行裁剪: + +```sql +MogDB=# explain verbose select * from prune_tt01 where a > (select a from t2 where a > 12 limit 1); + QUERY PLAN +-------------------------------------------------------------------------------------- + Partition Iterator (cost=0.04..36.90 rows=716 width=8) + Output: prune_tt01.a, prune_tt01.b + Iterations: PART + Selected Partitions: PART + InitPlan 1 (returns $0) + -> Limit (cost=0.00..0.04 rows=1 width=4) + Output: t2.a + -> Seq Scan on public.t2 (cost=0.00..1.75 rows=49 width=4) + Output: t2.a + Filter: (t2.a > 12) + -> Partitioned Seq Scan on public.prune_tt01 (cost=0.00..36.86 rows=716 width=8) + Output: prune_tt01.a, prune_tt01.b + Filter: (prune_tt01.a > $0) +(13 rows) + +MogDB=# explain analyze select * from prune_tt01 where a > (select a from t2 where a > 12 limit 1); + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------- + Partition Iterator (cost=0.04..36.90 rows=716 width=8) (actual time=0.172..0.180 rows=7 loops=1) + Iterations: 2 + Selected Partitions: 3..4 + InitPlan 1 (returns $0) + -> Limit (cost=0.00..0.04 rows=1 width=4) (actual time=0.093..0.093 rows=1 loops=1) + -> Seq Scan on t2 (cost=0.00..1.75 rows=49 width=4) (actual time=0.091..0.091 rows=1 loops=1) + Filter: (a > 12) + Rows Removed by Filter: 12 + -> Partitioned Seq Scan on prune_tt01 (cost=0.00..36.86 rows=716 width=8) (actual time=0.020..0.020 rows=7 loops=2) + Filter: (a > $0) + Rows Removed by Filter: 4 + Total runtime: 0.301 ms +(12 rows) +``` + +- 对子查询中的分区表进行裁剪: + + any子查询: + +```sql +MogDB=# explain verbose select * from t2 where a > any(select a from prune_tt01 where prune_tt01.a = t2.a); + QUERY PLAN +---------------------------------------------------------------------------------------------------------- + Seq Scan on public.t2 (cost=0.00..582.83 rows=30 width=8) + Output: t2.a, t2.b + Filter: (SubPlan 1) + SubPlan 1 + -> Partition Iterator (cost=4.34..15.01 rows=11 width=4) + Output: prune_tt01.a + Iterations: PART + Selected Partitions: PART + -> Partitioned Bitmap Heap Scan on public.prune_tt01 (cost=4.34..15.01 rows=11 width=4) + Output: prune_tt01.a + Recheck Cond: (prune_tt01.a = t2.a) + -> Partitioned Bitmap Index Scan on index_prune_tt01 (cost=0.00..4.33 rows=11 width=0) + Index Cond: (prune_tt01.a = t2.a) +(13 rows) + +MogDB=# explain analyze select * from t2 where a > any(select a from prune_tt01 where prune_tt01.a = t2.a); + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------ + Seq Scan on t2 (cost=0.00..582.83 rows=30 width=8) (actual time=2.130..2.130 rows=0 loops=1) + Filter: (SubPlan 1) + Rows Removed by Filter: 60 + SubPlan 1 + -> Partition Iterator (cost=4.34..15.01 rows=11 width=4) (actual time=1.860..1.877 rows=20 loops=60) + Iterations: 1 + Selected Partitions: 4 + -> Partitioned Bitmap Heap Scan on prune_tt01 (cost=4.34..15.01 rows=11 width=4) (actual time=0.566..0.576 rows=20 loops=60) + Recheck Cond: (a = t2.a) + Heap Blocks: exact=20 + -> Partitioned Bitmap Index Scan on index_prune_tt01 (cost=0.00..4.33 rows=11 width=0) (actual time=0.482..0.482 rows=20 loops=60) + Index Cond: (a = t2.a) + Total runtime: 2.600 ms +(13 rows) +``` + + exists子查询: + +```sql +MogDB=# explain verbose select * from t2 where exists (select a from prune_tt01 where prune_tt01.a = t2.a limit 1); + QUERY PLAN +---------------------------------------------------------------------------------------------------------------- + Seq Scan on public.t2 (cost=0.00..319.92 rows=30 width=8) + Output: t2.a, t2.b + Filter: (SubPlan 1) + SubPlan 1 + -> Limit (cost=4.34..5.31 rows=1 width=4) + Output: prune_tt01.a + -> Partition Iterator (cost=4.34..15.01 rows=11 width=4) + Output: prune_tt01.a + Iterations: PART + Selected Partitions: PART + -> Partitioned Bitmap Heap Scan on public.prune_tt01 (cost=4.34..15.01 rows=11 width=4) + Output: prune_tt01.a + Recheck Cond: (prune_tt01.a = t2.a) + -> Partitioned Bitmap Index Scan on index_prune_tt01 (cost=0.00..4.33 rows=11 width=0) + Index Cond: (prune_tt01.a = t2.a) +(15 rows) + +MogDB=# explain analyze select * from t2 where exists (select a from prune_tt01 where prune_tt01.a = t2.a limit 1); + QUERY PLAN +------------------------------------------------------------------------------------------------------------------------------------------------------------ + Seq Scan on t2 (cost=0.00..319.92 rows=30 width=8) (actual time=0.058..0.875 rows=20 loops=1) + Filter: (SubPlan 1) + Rows Removed by Filter: 40 + SubPlan 1 + -> Limit (cost=4.34..5.31 rows=1 width=4) (actual time=0.826..0.826 rows=20 loops=60) + -> Partition Iterator (cost=4.34..15.01 rows=11 width=4) (actual time=0.789..0.789 rows=20 loops=60) + Iterations: 1 + Selected Partitions: 4 + -> Partitioned Bitmap Heap Scan on prune_tt01 (cost=4.34..15.01 rows=11 width=4) (actual time=0.162..0.162 rows=20 loops=60) + Recheck Cond: (a = t2.a) + Heap Blocks: exact=20 + -> Partitioned Bitmap Index Scan on index_prune_tt01 (cost=0.00..4.33 rows=11 width=0) (actual time=0.123..0.123 rows=20 loops=60) + Index Cond: (a = t2.a) + Total runtime: 1.151 ms +(14 rows) +``` + +**nestloop场景:** + +以下参数设置仅为了模拟SQL语句使用nestloop(通常情况下优化器会根据表的数据量选择最优的访问路径) + +```sql +MogDB=# SET enable_material = OFF; +SET +MogDB=# SET enable_mergejoin = OFF; +SET +MogDB=# SET enable_hashjoin = OFF; +SET +``` + +```sql +MogDB=# explain verbose select * from prune_tt01 inner join tt02 on prune_tt01.a = tt02.a; + QUERY PLAN +------------------------------------------------------------------------------------------------------------------- + Nested Loop (cost=0.00..1501.91 rows=23091 width=16) + Output: prune_tt01.a, prune_tt01.b, tt02.a, tt02.b + -> Seq Scan on public.tt02 (cost=0.00..31.49 rows=2149 width=8) + Output: tt02.a, tt02.b + -> Partition Iterator (cost=0.00..0.57 rows=11 width=8) + Output: prune_tt01.a, prune_tt01.b + Iterations: PART + Selected Partitions: PART + -> Partitioned Index Scan using index_prune_tt01 on public.prune_tt01 (cost=0.00..0.57 rows=11 width=8) + Output: prune_tt01.a, prune_tt01.b + Index Cond: (prune_tt01.a = tt02.a) +(11 rows) + +MogDB=# explain analyze select * from prune_tt01 inner join tt02 on prune_tt01.a = tt02.a; + QUERY PLAN +-------------------------------------------------------------------------------------------------------------------------------------------------------- + Nested Loop (cost=0.00..1501.91 rows=23091 width=16) (actual time=0.078..0.535 rows=20 loops=1) + -> Seq Scan on tt02 (cost=0.00..31.49 rows=2149 width=8) (actual time=0.023..0.030 rows=20 loops=1) + -> Partition Iterator (cost=0.00..0.57 rows=11 width=8) (actual time=0.441..0.462 rows=20 loops=20) + Iterations: 1 + Selected Partitions: 4 + -> Partitioned Index Scan using index_prune_tt01 on prune_tt01 (cost=0.00..0.57 rows=11 width=8) (actual time=0.146..0.158 rows=20 loops=20) + Index Cond: (a = tt02.a) + Total runtime: 0.770 ms +(8 rows) +``` \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/how-to-identify-whether-partition-pruning-has-been-used.md b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/how-to-identify-whether-partition-pruning-has-been-used.md new file mode 100644 index 0000000000000000000000000000000000000000..8fc571ed99129f13bc5695d3f1dd8135ca147a0f --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/how-to-identify-whether-partition-pruning-has-been-used.md @@ -0,0 +1,12 @@ +--- +title: 如何确定是否使用了分区裁剪 +summary: 如何确定是否使用了分区裁剪 +author: Guo Huan +date: 2022-06-22 +--- + +### 如何确定是否使用了分区裁剪 + +MogDB是否使用分区裁剪会反映在语句的执行计划中,可以通过EXPLAIN VERBOSE或EXPLAIN ANALYZE语句查看。 + +分区裁剪信息反映在执行计划列Iterations和Selected Partitions中。 diff --git a/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/information-that-can-be-used-for-partition-pruning.md b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/information-that-can-be-used-for-partition-pruning.md new file mode 100644 index 0000000000000000000000000000000000000000..1457f47c8c89a81b73f01d2831ae1be93090ebd2 --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/information-that-can-be-used-for-partition-pruning.md @@ -0,0 +1,33 @@ +--- +title: 可用于分区裁剪的信息 +summary: 可用于分区裁剪的信息 +author: Guo Huan +date: 2022-06-14 +--- + +# 可用于分区裁剪的信息 + +可以对分区列执行分区裁剪。 + +当您在范围或列表分区列上使用范围、`LIKE`、等式和`IN`列表谓词,以及在哈希分区列上使用等式和`IN`列表谓词时,MogDB会裁剪分区。 + +例如示例1中,表prune_tt01在列a上按范围分区。 + +MogDB使用分区列上的谓词来执行分区裁剪,如下所示。 + +**示例1 创建带有分区裁剪的表** + +```sql +CREATE TABLE prune_tt01(a int, b int) +PARTITION BY RANGE(a) +( + PARTITION prune_tt01_p1 VALUES LESS THAN(5), + PARTITION prune_tt01_p2 VALUES LESS THAN(10), + PARTITION prune_tt01_p3 VALUES LESS THAN(15), + PARTITION prune_tt01_p4 VALUES LESS THAN(MAXVALUE) +); +INSERT INTO prune_tt01 VALUES (generate_series(1, 20), generate_series(1,20)); +CREATE INDEX index_prune_tt01 ON prune_tt01 USING btree(a) LOCAL; + +select * from prune_tt01 where a > 8 ; +``` \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/static-partition-pruning.md b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/static-partition-pruning.md new file mode 100644 index 0000000000000000000000000000000000000000..a1c09ec7a8473a7835275fb2d3b199ac4379db0c --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/partition-pruning/static-partition-pruning.md @@ -0,0 +1,60 @@ +--- +title: 静态分区裁剪 +summary: 静态分区裁剪 +author: Guo Huan +date: 2022-06-14 +--- + +# 静态分区裁剪 + +MogDB主要根据静态谓词确定何时使用静态裁剪。 + +如果在解析时MogDB可以识别访问了哪个连续的分区集合,则执行计划中的**Selected Partitions:**列显示正在访问的分区的开始值和结束值。对于任何其他分区裁剪情况(包括动态裁剪),MogDB都会显示**Selected Partitions:**。 + +静态分区裁剪可通过[EXPLAIN VERBOSE](EXPLAIN)语句查看执行计划。如下示例查询中,prune_tt01表有四个分区,查询计划中显示SeqScan支持扫描的分区为3和4,从而确定分区1和2已经在查询计划中裁剪掉。 + +```sql +MogDB=# \d+ prune_tt01 + Table "public.prune_tt01" + Column | Type | Modifiers | Storage | Stats target | Description +--------+---------+-----------+---------+--------------+------------- + a | integer | | plain | | + b | integer | | plain | | +Indexes: + "index_prune_tt01" btree (a) LOCAL TABLESPACE pg_default +Partition By RANGE(a) +Number of partitions: 4 (View pg_partition to check each partition range.) +Has OIDs: no +Options: orientation=row, compression=no +``` + +```sql +MogDB=# explain verbose select * from prune_tt01 where a>12; + QUERY PLAN +---------------------------------------------------------------------------------------------------- + Partition Iterator (cost=13.80..27.75 rows=716 width=8) + Output: a, b + Iterations: 2 + Selected Partitions: 3..4 + -> Partitioned Bitmap Heap Scan on public.prune_tt01 (cost=13.80..27.75 rows=716 width=8) + Output: a, b + Recheck Cond: (prune_tt01.a > 12) + -> Partitioned Bitmap Index Scan on index_prune_tt01 (cost=0.00..13.62 rows=716 width=0) + Index Cond: (prune_tt01.a > 12) +(9 rows) +``` + +
+ +静态分区裁剪的详细支持范围如下表所示。 + +**表1** 静态分区裁剪的详细支持范围 + +| 序号 | 约束名称 | 约束范围 | +| ---- | ---------------- | ------------------------------------------------------------ | +| 1 | 分区表类型 | Range分区、List分区、Hash分区 | +| 2 | 分区表达式类型 | - 分区约束为单个表达式,如`a >12;`
- 分区约束为BOOL表达式,如`a > 2 and a < 12;`
- 分区约束为数组,如`a in (2, 3);`
- 分区约束为常量表达式,如`1 = 1;`
- 分区约束为`Is (NOT)NULL`表达式,如`a IS NULL` | +| 3 | 分区表达式操作符 | - Range分区表支持:`=`、`>`、`>=`、`<`、`<=`五种操作符
- List分区和Hash分区只支持`=`操作符 | +| 4 | 分区表达式参数 | 一侧为分区键,另一侧为常量,例如:`a > 12` | +| 5 | 二级分区 | Range、List和Hash三种分区表的组合,例如:Range-List等等 | +| 6 | 分区裁剪结果显示 | Explain verbose显示裁剪分区链表 | diff --git a/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-hash-partitioning.md b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-hash-partitioning.md new file mode 100644 index 0000000000000000000000000000000000000000..5455d8301da8f4d371325200208f333f87626c42 --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-hash-partitioning.md @@ -0,0 +1,41 @@ +--- +title: 何时使用哈希分区 +summary: 何时使用哈希分区 +author: Guo Huan +date: 2022-06-14 +--- + +# 何时使用哈希分区 + +哈希分区对于基于哈希算法在分区之间随机分布数据,而不是对相似数据进行分组很有用。 + +在有些情况下,虽然可以确定分区关键字,但分区数据应该位于哪个分区并不明显。有些情况则不希望像范围分区那样对相似数据进行分组,而是希望数据的分布与其业务或逻辑视图不一致。哈希分区根据将关键字传递给哈希算法的结果,将某一行放入某个分区中。 + +使用这种方法,数据在分区中随机分布而非分组。这对于某些数据来说是一种很好的方法,但可能不适用于管理历史数据。然而,哈希分区与范围分区具有一些相同的性能特征。例如,分区裁剪仅限于等式谓词。您还可以使用分区连接、并行索引访问和并行DML。 + +哈希分区的优点是,数据的分布几乎是随机的,所以分布相对均匀,能够在一定程度上避免热点问题。 + +哈希分区的缺点是: + +- 在不额外存储数据的情况下,无法执行范围查询。 +- 在添加或删除节点时,由于每个节点都需要一个相应的哈希值,所以增加节点需要修改哈希函数,这会导致许多现有的数据都要重新映射,引起数据大规模移动。并且在此期间,系统可能无法继续工作。 + +示例1使用列`s_productid`作为分区关键字为表`sales_hash`创建了四个哈希分区。与products表的并行连接可以利用部分或完全分区连接。此时分区裁剪有利于仅访问单个产品或一部分产品的销售数据的查询。 + +如果您没有明确指定分区名称,而是指定哈希分区的编号,那么MogDB会自动为分区生成内部名称。 + +**示例1 创建具有哈希分区的表** + +```sql +CREATE TABLE sales_hash + (s_productid NUMBER, + s_saledate DATE, + s_custid NUMBER, + s_totalprice NUMBER) +PARTITION BY HASH(s_productid) +( PARTITION p1 , + PARTITION p2, + PARTITION p3 , + PARTITION p4 +); +``` \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-list-partitioning.md b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-list-partitioning.md new file mode 100644 index 0000000000000000000000000000000000000000..343906fe51ebcb653cb14ba60eb4c4a3c97d502f --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-list-partitioning.md @@ -0,0 +1,33 @@ +--- +title: 何时使用列表分区 +summary: 何时使用列表分区 +author: Guo Huan +date: 2022-06-14 +--- + +# 何时使用列表分区 + +列表分区可基于离散值将行显式映射到分区。 + +在示例1中,按区域分析帐户的客户经理可有效利用分区裁剪。 + +**示例1 创建具有列表分区的表** + +```sql +CREATE TABLE accounts +( id NUMBER +, account_number NUMBER +, customer_id NUMBER +, branch_id NUMBER +, region VARCHAR(2) +, status VARCHAR2(1) +) +PARTITION BY LIST (region) +( PARTITION p_northwest VALUES ('OR', 'WA') +, PARTITION p_southwest VALUES ('AZ', 'UT', 'NM') +, PARTITION p_northeast VALUES ('NY', 'VM', 'NJ') +, PARTITION p_southeast VALUES ('FL', 'GA') +, PARTITION p_northcentral VALUES ('SD', 'WI') +, PARTITION p_southcentral VALUES ('OK', 'TX') +); +``` \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-range-partitioning.md b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-range-partitioning.md new file mode 100644 index 0000000000000000000000000000000000000000..e0bb80cc426346b9945a2a3b98b8e553ab71e346 --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-range-partitioning.md @@ -0,0 +1,36 @@ +--- +title: 何时使用范围分区 +summary: 何时使用范围分区 +author: Guo Huan +date: 2022-06-14 +--- + +# 何时使用范围分区 + +范围分区在组织类似的数据时很有用,尤其是日期和时间数据。 + +范围分区是一种方便的历史数据分区方法。范围分区的边界定义了表或索引中分区的顺序。 + +大多数访问范围分区的SQL语句都关注时间范围。例如类似于“从特定时间段选择数据”的SQL语句。如果每个分区代表一个月内的数据,扫描的数据量减少为总数据的一小部分,这种优化方法称为**分区裁剪**。 + +当您需要定期加载新数据并清除旧数据时,范围分区也很有用,因为范围分区很容易添加或删除。例如,系统通常会保留一个滚动的数据窗口,将过去36个月的数据保持为在线状态。范围分区简化了这个过程。 + +总之,在以下情况下您可以考虑使用范围分区: + +- 经常需要对大型表中容易分区的列进行范围谓词扫描。 +- 希望维护一个滚动的数据窗口。 +- 无法在指定时间范围内对大型表完成管理操作,例如备份和还原,但可以根据分区范围列将其分成更小的逻辑块。 + +**示例1 创建具有范围分区的表** + +```sql +CREATE TABLE employees ( + id INT NOT NULL, + fname VARCHAR(30), + lname VARCHAR(30), + hired DATE NOT NULL DEFAULT '1970-01-01', + separated DATE DEFAULT '9999-12-31', + job_code INT, + store_id INT NOT NULL +); +``` \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/13.1-hll-functions-and-operators.md b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/13.1-hll-functions-and-operators.md index 3e8446adf563de5f6ad943f37da0a6c91c8a6d61..b1ab9b0802721752e3f594741daf54c08b020d25 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/13.1-hll-functions-and-operators.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/13.1-hll-functions-and-operators.md @@ -1,878 +1,894 @@ ---- -title: HLL函数和操作符 -summary: HLL函数和操作符 -author: Zhang Cuiping -date: 2021-06-07 ---- - -# HLL函数和操作符 - -## 哈希函数 - -- hll_hash_boolean(bool) - - 描述:对bool类型数据计算哈希值。 - - 返回值类型:hll_hashval - - 示例: - - ```sql - MogDB=# SELECT hll_hash_boolean(FALSE); - hll_hash_boolean - --------------------- - -5451962507482445012 - (1 row) - ``` - -- hll_hash_boolean(bool, int32) - - 描述:设置hash seed(即改变哈希策略)并对bool类型数据计算哈希值。 - - 返回值类型:hll_hashval - - 示例: - - ```sql - MogDB=# SELECT hll_hash_boolean(FALSE, 10); - hll_hash_boolean - -------------------- - -1169037589280886076 - (1 row) - ``` - -- hll_hash_smallint(smallint) - - 描述:对smallint类型数据计算哈希值。 - - 返回值类型:hll_hashval - - 示例: - - ```sql - MogDB=# SELECT hll_hash_smallint(100::smallint); - hll_hash_smallint - --------------------- - 962727970174027904 - (1 row) - ``` - -> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 数值大小相同的参数使用不同数据类型的哈希函数计算,最后结果会不一样,因为不同类型哈希函数会选取不同的哈希计算策略。 - -- hll_hash_smallint(smallint, int32) - - 描述:设置hash seed(即改变哈希策略)同时对smallint类型数据计算哈希值。 - - 返回值类型:hll_hashval - - 示例: - - ```sql - MogDB=# SELECT hll_hash_smallint(100::smallint, 10); - hll_hash_smallint - --------------------- - -9056177146160443041 - (1 row) - ``` - -- hll_hash_integer(integer) - - 描述:对integer类型数据计算哈希值。 - - 返回值类型:hll_hashval - - 示例: - - ```sql - MogDB=# SELECT hll_hash_integer(0); - hll_hash_integer - ---------------------- - 5156626420896634997 - (1 row) - ``` - -- hll_hash_integer(integer, int32) - - 描述:对integer类型数据计算哈希值,并设置hashseed(即改变哈希策略)。 - - 返回值类型:hll_hashval - - 示例: - - ```sql - MogDB=# SELECT hll_hash_integer(0, 10); - hll_hash_integer - -------------------- - -5035020264353794276 - (1 row) - ``` - -- hll_hash_bigint(bigint) - - 描述:对bigint类型数据计算哈希值。 - - 返回值类型:hll_hashval - - 示例: - - ```sql - MogDB=# SELECT hll_hash_bigint(100::bigint); - hll_hash_bigint - --------------------- - -2401963681423227794 - (1 row) - ``` - -- hll_hash_bigint(bigint, int32) - - 描述:对bigint类型数据计算哈希值,并设置hashseed(即改变哈希策略)。 - - 返回值类型:hll_hashval - - 示例: - - ```sql - MogDB=# SELECT hll_hash_bigint(100::bigint, 10); - hll_hash_bigint - --------------------- - 4631120266694327276 - (1 row) - ``` - -- hll_hash_bytea(bytea) - - 描述:对bytea类型数据计算哈希值。 - - 返回值类型:hll_hashval - - 示例: - - ```sql - MogDB=# SELECT hll_hash_bytea(E'\\x'); - hll_hash_bytea - ---------------- - 0 - (1 row) - ``` - -- hll_hash_bytea(bytea, int32) - - 描述:对bytea类型数据计算哈希值,并设置hashseed(即改变哈希策略)。 - - 返回值类型:hll_hashval - - 示例: - - ```sql - MogDB=# SELECT hll_hash_bytea(E'\\x', 10); - hll_hash_bytea - --------------------- - 6574525721897061910 - (1 row) - ``` - -- hll_hash_text(text) - - 描述:对text类型数据计算哈希值。 - - 返回值类型:hll_hashval - - 示例: - - ```sql - MogDB=# SELECT hll_hash_text('AB'); - hll_hash_text - --------------------- - 5365230931951287672 - (1 row) - ``` - -- hll_hash_text(text, int32) - - 描述:对text类型数据计算哈希值,并设置hashseed(即改变哈希策略)。 - - 返回值类型:hll_hashval - - 示例: - - ```sql - MogDB=# SELECT hll_hash_text('AB', 10); - hll_hash_text - --------------------- - 7680762839921155903 - (1 row) - ``` - -- hll_hash_any(anytype) - - 描述:对任意类型数据计算哈希值。 - - 返回值类型:hll_hashval - - 示例: - - ```sql - MogDB=# select hll_hash_any(1); - hll_hash_any - ---------------------- - -8604791237420463362 - (1 row) - - MogDB=# select hll_hash_any('08:00:2b:01:02:03'::macaddr); - hll_hash_any - ---------------------- - -4883882473551067169 - (1 row) - ``` - -- hll_hash_any(anytype, int32) - - 描述:对任意类型数据计算哈希值,并设置hashseed(即改变哈希策略)。 - - 返回值类型:hll_hashval - - 示例: - - ```sql - MogDB=# select hll_hash_any(1, 10); - hll_hash_any - ---------------------- - -1478847531811254870 - (1 row) - ``` - -- hll_hashval_eq(hll_hashval, hll_hashval) - - 描述:比较两个hll_hashval类型数据是否相等。 - - 返回值类型:bool - - 示例: - - ```sql - MogDB=# select hll_hashval_eq(hll_hash_integer(1), hll_hash_integer(1)); - hll_hashval_eq - ---------------- - t - (1 row) - ``` - -- hll_hashval_ne(hll_hashval, hll_hashval) - - 描述:比较两个hll_hashval类型数据是否不相等。 - - 返回值类型:bool - - 示例: - - ```sql - MogDB=# select hll_hashval_ne(hll_hash_integer(1), hll_hash_integer(1)); - hll_hashval_ne - ---------------- - f - (1 row) - ``` - -## 日志函数 - -hll主要存在三种模式Explicit、Sparse、Full。当数据规模比较小的时候会使用Explicit模式,这种模式下distinct值的计算是没有误差的;随着distinct值越来越多,hll会先后转换为Sparse模式和Full模式,这两种模式在计算结果上没有任何区别,只影响hll函数的计算效率和hll对象的存储空间。下面的函数可以用于查看hll的一些参数。 - -- hll_print(hll) - - 描述:打印hll的一些debug参数信息。 - - 示例: - - ```sql - MogDB=# select hll_print(hll_empty()); - hll_print - ------------------------------------------------------------------------------- - type=1(HLL_EMPTY), log2m=14, log2explicit=10, log2sparse=12, duplicatecheck=0 - (1 row) - ``` - -- hll_type(hll) - - 描述:查看当前hll的类型。返回值具体含义如下:返回值0,表示HLL_UNINIT,未初始化的hll对象;返回值1,表示HLL_EMPTY,hll空对象;返回值2,表示HLL_EXPLICIT,Explicit模式的hll对象;返回值3,表示HLL_SPARSE,Sparse模式的hll对象;返回值4,表示HLL_FULL,Full模式的hll对象;返回值5,表示HLL_UNDEFINED,不合法的hll对象。 - - 示例: - - ```sql - MogDB=# select hll_type(hll_empty()); - hll_type - ---------- - 1 - (1 row) - ``` - -- hll_log2m(hll) - - 描述:查看当前hll数据结构中的log2m数值,log2m是分桶数的对数值,此值会影响最后hll计算distinct误差率,误差率计算公式为±1.04/√(2 ^ log2m)。当显式指定log2m的取值为10-16之间时,hll会设置分桶数为2log2m。当显示指定log2explicit为-1时,会采用内置默认值。 - - 示例: - - ```sql - MogDB=# select hll_log2m(hll_empty()); - hll_log2m - ----------- - 14 - (1 row) - - MogDB=# select hll_log2m(hll_empty(10)); - hll_log2m - ----------- - 10 - (1 row) - - MogDB=# select hll_log2m(hll_empty(-1)); - hll_log2m - ----------- - 14 - (1 row) - ``` - -- hll_log2explicit(hll) - - 描述:查看当前hll数据结构中的log2explicit数值。hll通常会由Explicit模式到Sparse模式再到Full模式,这个过程称为promotion hierarchy策略。可以通过调整log2explicit值的大小改变策略,比如log2explicit为0的时候就会跳过Explicit模式而直接进入Sparse模式。当显式指定log2explicit的取值为1-12之间时,hll会在数据段长度超过2log2explicit时转为Sparse模式。当显示指定log2explicit为-1时,会采用内置默认值。 - - 示例: - - ```sql - MogDB=# select hll_log2explicit(hll_empty()); - hll_log2explicit - ------------------ - 10 - (1 row) - - MogDB=# select hll_log2explicit(hll_empty(12, 8)); - hll_log2explicit - ------------------ - 8 - (1 row) - - MogDB=# select hll_log2explicit(hll_empty(12, -1)); - hll_log2explicit - ------------------ - 10 - (1 row) - ``` - -- hll_log2sparse(hll) - - 描述:查看当前hll数据结构中的log2sparse数值。hll通常会由Explicit模式到Sparse模式再到Full模式,这个过程称为promotion hierarchy策略。可以通过调整log2sparse值的大小改变策略,比如log2sparse为0的时候就会跳过Sparse模式而直接进入Full模式。当显式指定Sparse的取值为1-14之间时,hll会在数据段长度超过2log2sparse时转为Full模式。当显示指定log2sparse为-1时,会采用内置默认值。 - - 示例: - - ```sql - MogDB=# select hll_log2sparse(hll_empty()); - hll_log2sparse - ---------------- - 12 - (1 row) - - MogDB=# select hll_log2sparse(hll_empty(12, 8, 10)); - hll_log2sparse - ---------------- - 10 - (1 row) - - MogDB=# select hll_log2sparse(hll_empty(12, 8, -1)); - hll_log2sparse - ---------------- - 12 - (1 row) - ``` - -- hll_duplicatecheck(hll) - - 描述:是否启用duplicatecheck,0是关闭,1是开启。默认关闭,对于有较多重复值出现的情况,可以开启以提高效率。当显示指定duplicatecheck为-1时,会采用内置默认值。 - - 示例: - - ```sql - MogDB=# select hll_duplicatecheck(hll_empty()); - hll_duplicatecheck - -------------------- - 0 - (1 row) - - MogDB=# select hll_duplicatecheck(hll_empty(12, 8, 10, 1)); - hll_duplicatecheck - -------------------- - 1 - (1 row) - - MogDB=# select hll_duplicatecheck(hll_empty(12, 8, 10, -1)); - hll_duplicatecheck - -------------------- - 0 - (1 row) - ``` - -## 功能函数 - -- hll_empty() - - 描述:创建一个空的hll。 - - 返回值类型:hll - - 示例: - - ```sql - MogDB=# select hll_empty(); - hll_empty - ------------------------------------------------------------ - \x484c4c00000000002b05000000000000000000000000000000000000 - (1 row) - ``` - -- hll_empty(int32 log2m) - - 描述:创建空的hll并指定参数log2m,取值范围是10到16。若输入-1,则采用内置默认值。 - - 返回值类型:hll - - 示例: - - ```sql - MogDB=# select hll_empty(10); - hll_empty - ------------------------------------------------------------ - \x484c4c00000000002b04000000000000000000000000000000000000 - (1 row) - - MogDB=# select hll_empty(-1); - hll_empty - ------------------------------------------------------------ - \x484c4c00000000002b05000000000000000000000000000000000000 - (1 row) - ``` - -- hll_empty(int32 log2m, int32 log2explicit) - - 描述:创建空的hll并依次指定参数log2m、log2explicit。log2explicit取值范围是0到12,0表示直接跳过Explicit模式。该参数可以用来设置Explicit模式的阈值大小,在数据段长度达到2log2explicit后切换为Sparse模式或者Full模式。若输入-1,则log2explicit采用内置默认值。 - - 返回值类型: hll - - 示例: - - ```sql - MogDB=# select hll_empty(10, 4); - hll_empty - ------------------------------------------------------------ - \x484c4c00000000001304000000000000000000000000000000000000 - (1 row) - - MogDB=# select hll_empty(10, -1); - hll_empty - ------------------------------------------------------------ - \x484c4c00000000002b04000000000000000000000000000000000000 - (1 row) - ``` - -- hll_empty(int32 log2m, int32 log2explicit, int64 log2sparse) - - 描述:创建空的hll并依次指定参数log2m、log2explicit、log2sparse。log2sparse取值范围是0到14,0表示直接跳过Sparse模式。该参数可以用来设置Sparse模式的阈值大小,在数据段长度达到2log2sparse后切换为Full模式。若输入-1,则log2sparse采用内置默认值。 - - 返回值类型:hll - - 示例: - - ```sql - MogDB=# select hll_empty(10, 4, 8); - hll_empty - ------------------------------------------------------------ - \x484c4c00000000001204000000000000000000000000000000000000 - (1 row) - - MogDB=# select hll_empty(10, 4, -1); - hll_empty - ------------------------------------------------------------ - \x484c4c00000000001304000000000000000000000000000000000000 - (1 row) - ``` - -- hll_empty(int32 log2m, int32 log2explicit, int64 log2sparse, int32 duplicatecheck) - - 描述:创建空的hll并依次指定参数log2m、log2explicit、log2sparse、duplicatecheck。duplicatecheck取0或者1,表示是否开启该模式,默认情况下该模式会关闭。若输入-1,则duplicatecheck采用内置默认值。 - - 返回值类型:hll - - 示例: - - ```sql - MogDB=# select hll_empty(10, 4, 8, 0); - hll_empty - ------------------------------------------------------------ - \x484c4c00000000001204000000000000000000000000000000000000 - (1 row) - - MogDB=# select hll_empty(10, 4, 8, -1); - hll_empty - ------------------------------------------------------------ - \x484c4c00000000001204000000000000000000000000000000000000 - (1 row) - ``` - -- hll_add(hll, hll_hashval) - - 描述:把hll_hashval加入到hll中。 - - 返回值类型:hll - - 示例: - - ```sql - MogDB=# select hll_add(hll_empty(), hll_hash_integer(1)); - hll_add - ---------------------------------------------------------------------------- - \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00 - (1 row) - ``` - -- hll_add_rev(hll_hashval, hll) - - 描述:把hll_hashval加入到hll中,和hll_add功能一样,只是参数位置进行了交换。 - - 返回值类型:hll - - 示例: - - ```sql - MogDB=# select hll_add_rev(hll_hash_integer(1), hll_empty()); - hll_add_rev - ---------------------------------------------------------------------------- - \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00 - (1 row) - ``` - -- hll_eq(hll, hll) - - 描述:比较两个hll是否相等。 - - 返回值类型:bool - - 示例: - - ```sql - MogDB=# select hll_eq(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2))); - hll_eq - -------- - f - (1 row) - ``` - -- hll_ne(hll, hll) - - 描述:比较两个hll是否不相等。 - - 返回值类型:bool - - 示例: - - ```sql - MogDB=# select hll_ne(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2))); - hll_ne - -------- - t - (1 row) - ``` - -- hll_cardinality(hll) - - 描述:计算hll的distinct值。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# select hll_cardinality(hll_empty() || hll_hash_integer(1)); - hll_cardinality - ----------------- - 1 - (1 row) - ``` - -- hll_union(hll, hll) - - 描述:把两个hll数据结构union成一个。 - - 返回值类型:hll - - 示例: - - ```sql - MogDB=# select hll_union(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2))); - hll_union - -------------------------------------------------------------------------------------------- - \x484c4c10002000002b090000000000000000400000000000000000b3ccc49320cca1ae3e2921ff133fbaed00 - (1 row) - ``` - -## 聚合函数 - -- hll_add_agg(hll_hashval) - - 描述:把哈希后的数据按照分组放到hll中。 - - 返回值类型:hll - - 示例: - - ```sql - --准备数据 - MogDB=# create table t_id(id int); - MogDB=# insert into t_id values(generate_series(1,500)); - MogDB=# create table t_data(a int, c text); - MogDB=# insert into t_data select mod(id,2), id from t_id; - - --创建表并指定列为hll - MogDB=# create table t_a_c_hll(a int, c hll); - - --根据a列group by对数据分组,把各组数据加到hll中 - MogDB=# insert into t_a_c_hll select a, hll_add_agg(hll_hash_text(c)) from t_data group by a; - - --得到每组数据中hll的Distinct值 - MogDB=# select a, #c as cardinality from t_a_c_hll order by a; - a | cardinality - ---+------------------ - 0 | 247.862354346299 - 1 | 250.908710610377 - (2 rows) - ``` - -- hll_add_agg(hll_hashval, int32 log2m) - - 描述:把哈希后的数据按照分组放到hll中,并指定参数log2m,取值范围是10到16。若输入-1或者NULL,则采用内置默认值。 - - 返回值类型:hll - - 示例: - - ```sql - MogDB=# select hll_cardinality(hll_add_agg(hll_hash_text(c), 12)) from t_data; - hll_cardinality - ------------------ - 497.965240179228 - (1 row) - ``` - -- hll_add_agg(hll_hashval, int32 log2m, int32 log2explicit) - - 描述:把哈希后的数据按照分组放到hll中,依次指定参数log2m、log2explicit。log2explicit取值范围是0到12,0表示直接跳过Explicit模式。该参数可以用来设置Explicit模式的阈值大小,在数据段长度达到2log2explicit后切换为Sparse模式或者Full模式。若输入-1或者NULL,则log2explicit采用内置默认值。 - - 返回值类型:hll - - 示例: - - ```sql - MogDB=# select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 1)) from t_data; - hll_cardinality - ------------------ - 498.496062953313 - (1 row) - ``` - -- hll_add_agg(hll_hashval, int32 log2m, int32 log2explicit, int64 log2sparse) - - 描述:把哈希后的数据按照分组放到hll中,依次指定参数log2m、log2explicit、log2sparse。log2sparse取值范围是0到14,0表示直接跳过Sparse模式。该参数可以用来设置Sparse模式的阈值大小,在数据段长度达到2log2sparse后切换为Full模式。若输入-1或者NULL,则log2sparse采用内置默认值。 - - 返回值类型:hll - - 示例: - - ```sql - MogDB=# select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 6, 10)) from t_data; - hll_cardinality - ------------------ - 498.496062953313 - (1 row) - ``` - -- hll_add_agg(hll_hashval, int32 log2m, int32 log2explicit, int64 log2sparse, int32 duplicatecheck) - - 描述:把哈希后的数据按照分组放到hll中, 依次制定参数log2m、log2explicit、log2sparse、duplicatecheck,duplicatecheck取值范围是0或者1,表示是否开启该模式,默认情况下该模式会关闭。若输入-1或者NULL,则duplicatecheck采用内置默认值。 - - 返回值类型:hll - - 示例: - - ```sql - MogDB=# select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 6, 10, -1)) from t_data; - hll_cardinality - ------------------ - 498.496062953313 - (1 row) - ``` - -- hll_union_agg(hll) - - 描述:将多个hll类型数据union成一个hll。 - - 返回值类型:hll - - 示例: - - ```sql - --将各组中的hll数据union成一个hll,并计算distinct值。 - MogDB=# select #hll_union_agg(c) as cardinality from t_a_c_hll; - cardinality - ------------------ - 498.496062953313 - (1 row) - ``` - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: - > - > 注意:当两个或者多个hll数据结构做union的时候,必须要保证其中每一个hll里面的精度参数一样,否则将不可以进行union。同样的约束也适用于函数hll_union(hll,hll)。 - -## 废弃函数 - -由于版本升级,HLL(HyperLogLog)有一些旧的函数废弃,用户可以用类似的函数进行替代。 - -- hll_schema_version(hll) - - 描述:查看当前hll中的schema version。旧版本schema version是常值1,用来进行hll字段的头部校验,重构后的hll在头部增加字段“HLL”进行校验,schema version不再使用。 - -- hll_regwidth(hll) - - 描述:查看hll数据结构中桶的位数大小。旧版本桶的位数regwidth取值1~5,会存在较大的误差,也限制了基数估计上限。 重构后regwidth为固定值6,不再使用regwidth变量。 - -- hll_expthresh(hll) - - 描述:得到当前hll中expthresh大小。采用hll_log2explicit(hll)替代类似功能。 - -- hll_sparseon(hll) - - 描述:是否启用Sparse模式。采用hll_log2sparse(hll)替代类似功能,0表示关闭Sparse模式。 - -## 内置函数 - -HLL(HyperLogLog)有一系列内置函数用于内部对数据进行处理,一般情况下用户不需要熟知这些函数的使用。详情见表1。 - -**表 1** 内置函数 - -| 函数名称 | 功能描述 | -| :---------------- | :----------------------------------------------------------- | -| hll_in | 以string格式接收hll数据。 | -| hll_out | 以string格式发送hll数据。 | -| hll_recv | 以bytea格式接收hll数据。 | -| hll_send | 以bytea格式发送hll数据。 | -| hll_trans_in | 以string格式接收hll_trans_type数据。 | -| hll_trans_out | 以string格式发送hll_trans_type数据。 | -| hll_trans_recv | 以bytea形式接收hll_trans_type数据。 | -| hll_trans_send | 以bytea形式发送hll_trans_type数据。 | -| hll_typmod_in | 接收typmod类型数据。 | -| hll_typmod_out | 发送typmod类型数据。 | -| hll_hashval_in | 接收hll_hashval类型数据。 | -| hll_hashval_out | 发送hll_hashval类型数据。 | -| hll_add_trans0 | 类似于hll_add所提供的功能,初始化时无指定入参,通常在聚合运算的第一阶段DN上使用。 | -| hll_add_trans1 | 类似于hll_add所提供的功能,初始化时指定一个入参,通常在聚合运算的第一阶段DN上使用。 | -| hll_add_trans2 | 类似于hll_add所提供的功能,初始化时指定两个入参,通常在聚合运算的第一阶段DN上使用。 | -| hll_add_trans3 | 类似于hll_add所提供的功能,初始化时指定三个入参,通常在聚合运算的第一阶段DN上使用。 | -| hll_add_trans4 | 类似于hll_add所提供的功能,初始化时指定四个入参,通常在聚合运算的第一阶段DN上使用。 | -| hll_union_trans | 类似hll_union所提供的功能,在聚合运算的第一阶段DN上使用。 | -| hll_union_collect | 类似于hll_union所提供的功能,在聚合运算第二阶段DN上使用,汇总各个DN上的结果。 | -| hll_pack | 在聚合运算第三阶段DN上使用,把自定义hll_trans_type类型最后转换成hll类型。 | -| hll | 用于hll类型转换成hll类型,根据输入参数会设定指定参数。 | -| hll_hashval | 用于bigint类型转换成hll_hashval类型。 | -| hll_hashval_int4 | 用于int4类型转换成hll_hashval类型。 | - -## 操作符 - -- = - - 描述:比较hll或hll_hashval的值是否相等。 - - 返回值类型:bool - - 示例: - - ```sql - --hll - MogDB=# select (hll_empty() || hll_hash_integer(1)) = (hll_empty() || hll_hash_integer(1)); - column - ---------- - t - (1 row) - - --hll_hashval - MogDB=# select hll_hash_integer(1) = hll_hash_integer(1); - ?column? - ---------- - t - (1 row) - ``` - -- <> or != - - 描述:比较hll或hll_hashval是否不相等。 - - 返回值类型:bool - - 示例: - - ```sql - --hll - MogDB=# select (hll_empty() || hll_hash_integer(1)) <> (hll_empty() || hll_hash_integer(2)); - ?column? - ---------- - t - (1 row) - - --hll_hashval - MogDB=# select hll_hash_integer(1) <> hll_hash_integer(2); - ?column? - ---------- - t - (1 row) - ``` - -- || - - 描述:可代表hll_add、hll_union、hll_add_rev三个函数的功能。 - - 返回值类型:hll - - 示例: - - ```sql - --hll_add - MogDB=# select hll_empty() || hll_hash_integer(1); - ?column? - ---------------------------------------------------------------------------- - \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00 - (1 row) - - --hll_add_rev - MogDB=# select hll_hash_integer(1) || hll_empty(); - ?column? - ---------------------------------------------------------------------------- - \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00 - (1 row) - - --hll_union - MogDB=# select (hll_empty() || hll_hash_integer(1)) || (hll_empty() || hll_hash_integer(2)); - ?column? - -------------------------------------------------------------------------------------------- - \x484c4c10002000002b090000000000000000400000000000000000b3ccc49320cca1ae3e2921ff133fbaed00 - (1 row) - ``` - -- \# - - 描述:计算出hll的Dintinct值, 同hll_cardinality函数。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# select #(hll_empty() || hll_hash_integer(1)); - ?column? - ---------- - 1 - (1 row) - ``` +--- +title: HLL函数和操作符 +summary: HLL函数和操作符 +author: Zhang Cuiping +date: 2021-06-07 +--- + +# HLL函数和操作符 + +## 哈希函数 + +- hll_hash_boolean(bool) + + 描述:对bool类型数据计算哈希值。 + + 返回值类型:hll_hashval + + 示例: + + ```sql + MogDB=# SELECT hll_hash_boolean(FALSE); + hll_hash_boolean + --------------------- + -5451962507482445012 + (1 row) + ``` + +- hll_hash_boolean(bool, int32) + + 描述:设置hash seed(即改变哈希策略)并对bool类型数据计算哈希值。 + + 返回值类型:hll_hashval + + 示例: + + ```sql + MogDB=# SELECT hll_hash_boolean(FALSE, 10); + hll_hash_boolean + -------------------- + -1169037589280886076 + (1 row) + ``` + +- hll_hash_smallint(smallint) + + 描述:对smallint类型数据计算哈希值。 + + 返回值类型:hll_hashval + + 示例: + + ```sql + MogDB=# SELECT hll_hash_smallint(100::smallint); + hll_hash_smallint + --------------------- + 962727970174027904 + (1 row) + ``` + +> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** 数值大小相同的参数使用不同数据类型的哈希函数计算,最后结果会不一样,因为不同类型哈希函数会选取不同的哈希计算策略。 + +- hll_hash_smallint(smallint, int32) + + 描述:设置hash seed(即改变哈希策略)同时对smallint类型数据计算哈希值。 + + 返回值类型:hll_hashval + + 示例: + + ```sql + MogDB=# SELECT hll_hash_smallint(100::smallint, 10); + hll_hash_smallint + --------------------- + -9056177146160443041 + (1 row) + ``` + +- hll_hash_integer(integer) + + 描述:对integer类型数据计算哈希值。 + + 返回值类型:hll_hashval + + 示例: + + ```sql + MogDB=# SELECT hll_hash_integer(0); + hll_hash_integer + ---------------------- + 5156626420896634997 + (1 row) + ``` + +- hll_hash_integer(integer, int32) + + 描述:对integer类型数据计算哈希值,并设置hashseed(即改变哈希策略)。 + + 返回值类型:hll_hashval + + 示例: + + ```sql + MogDB=# SELECT hll_hash_integer(0, 10); + hll_hash_integer + -------------------- + -5035020264353794276 + (1 row) + ``` + +- hll_hash_bigint(bigint) + + 描述:对bigint类型数据计算哈希值。 + + 返回值类型:hll_hashval + + 示例: + + ```sql + MogDB=# SELECT hll_hash_bigint(100::bigint); + hll_hash_bigint + --------------------- + -2401963681423227794 + (1 row) + ``` + +- hll_hash_bigint(bigint, int32) + + 描述:对bigint类型数据计算哈希值,并设置hashseed(即改变哈希策略)。 + + 返回值类型:hll_hashval + + 示例: + + ```sql + MogDB=# SELECT hll_hash_bigint(100::bigint, 10); + hll_hash_bigint + --------------------- + 4631120266694327276 + (1 row) + ``` + +- hll_hash_bytea(bytea) + + 描述:对bytea类型数据计算哈希值。 + + 返回值类型:hll_hashval + + 示例: + + ```sql + MogDB=# SELECT hll_hash_bytea(E'\\x'); + hll_hash_bytea + ---------------- + 0 + (1 row) + ``` + +- hll_hash_bytea(bytea, int32) + + 描述:对bytea类型数据计算哈希值,并设置hashseed(即改变哈希策略)。 + + 返回值类型:hll_hashval + + 示例: + + ```sql + MogDB=# SELECT hll_hash_bytea(E'\\x', 10); + hll_hash_bytea + --------------------- + 6574525721897061910 + (1 row) + ``` + +- hll_hash_text(text) + + 描述:对text类型数据计算哈希值。 + + 返回值类型:hll_hashval + + 示例: + + ```sql + MogDB=# SELECT hll_hash_text('AB'); + hll_hash_text + --------------------- + 5365230931951287672 + (1 row) + ``` + +- hll_hash_text(text, int32) + + 描述:对text类型数据计算哈希值,并设置hashseed(即改变哈希策略)。 + + 返回值类型:hll_hashval + + 示例: + + ```sql + MogDB=# SELECT hll_hash_text('AB', 10); + hll_hash_text + --------------------- + 7680762839921155903 + (1 row) + ``` + +- hll_hash_any(anytype) + + 描述:对任意类型数据计算哈希值。 + + 返回值类型:hll_hashval + + 示例: + + ```sql + MogDB=# select hll_hash_any(1); + hll_hash_any + ---------------------- + -8604791237420463362 + (1 row) + + MogDB=# select hll_hash_any('08:00:2b:01:02:03'::macaddr); + hll_hash_any + ---------------------- + -4883882473551067169 + (1 row) + ``` + +- hll_hash_any(anytype, int32) + + 描述:对任意类型数据计算哈希值,并设置hashseed(即改变哈希策略)。 + + 返回值类型:hll_hashval + + 示例: + + ```sql + MogDB=# select hll_hash_any(1, 10); + hll_hash_any + ---------------------- + -1478847531811254870 + (1 row) + ``` + +- hll_hashval_eq(hll_hashval, hll_hashval) + + 描述:比较两个hll_hashval类型数据是否相等。 + + 返回值类型:bool + + 示例: + + ```sql + MogDB=# select hll_hashval_eq(hll_hash_integer(1), hll_hash_integer(1)); + hll_hashval_eq + ---------------- + t + (1 row) + ``` + +- hll_hashval_ne(hll_hashval, hll_hashval) + + 描述:比较两个hll_hashval类型数据是否不相等。 + + 返回值类型:bool + + 示例: + + ```sql + MogDB=# select hll_hashval_ne(hll_hash_integer(1), hll_hash_integer(1)); + hll_hashval_ne + ---------------- + f + (1 row) + ``` + +- ora_hash + + 描述:计算给定表达式的哈希值。 + + 返回值类型:integer + + 示例: + + ```sql + MogDB=# select ORA_HASH('abcdAbcdasd'); + ora_hash + ------------ + 1844255371 + (1 row) + ``` + +## 日志函数 + +hll主要存在三种模式Explicit、Sparse、Full。当数据规模比较小的时候会使用Explicit模式,这种模式下distinct值的计算是没有误差的;随着distinct值越来越多,hll会先后转换为Sparse模式和Full模式,这两种模式在计算结果上没有任何区别,只影响hll函数的计算效率和hll对象的存储空间。下面的函数可以用于查看hll的一些参数。 + +- hll_print(hll) + + 描述:打印hll的一些debug参数信息。 + + 示例: + + ```sql + MogDB=# select hll_print(hll_empty()); + hll_print + ------------------------------------------------------------------------------- + type=1(HLL_EMPTY), log2m=14, log2explicit=10, log2sparse=12, duplicatecheck=0 + (1 row) + ``` + +- hll_type(hll) + + 描述:查看当前hll的类型。返回值具体含义如下:返回值0,表示HLL_UNINIT,未初始化的hll对象;返回值1,表示HLL_EMPTY,hll空对象;返回值2,表示HLL_EXPLICIT,Explicit模式的hll对象;返回值3,表示HLL_SPARSE,Sparse模式的hll对象;返回值4,表示HLL_FULL,Full模式的hll对象;返回值5,表示HLL_UNDEFINED,不合法的hll对象。 + + 示例: + + ```sql + MogDB=# select hll_type(hll_empty()); + hll_type + ---------- + 1 + (1 row) + ``` + +- hll_log2m(hll) + + 描述:查看当前hll数据结构中的log2m数值,log2m是分桶数的对数值,此值会影响最后hll计算distinct误差率,误差率计算公式为±1.04/√(2 ^ log2m)。当显式指定log2m的取值为10-16之间时,hll会设置分桶数为2log2m。当显示指定log2explicit为-1时,会采用内置默认值。 + + 示例: + + ```sql + MogDB=# select hll_log2m(hll_empty()); + hll_log2m + ----------- + 14 + (1 row) + + MogDB=# select hll_log2m(hll_empty(10)); + hll_log2m + ----------- + 10 + (1 row) + + MogDB=# select hll_log2m(hll_empty(-1)); + hll_log2m + ----------- + 14 + (1 row) + ``` + +- hll_log2explicit(hll) + + 描述:查看当前hll数据结构中的log2explicit数值。hll通常会由Explicit模式到Sparse模式再到Full模式,这个过程称为promotion hierarchy策略。可以通过调整log2explicit值的大小改变策略,比如log2explicit为0的时候就会跳过Explicit模式而直接进入Sparse模式。当显式指定log2explicit的取值为1-12之间时,hll会在数据段长度超过2log2explicit时转为Sparse模式。当显示指定log2explicit为-1时,会采用内置默认值。 + + 示例: + + ```sql + MogDB=# select hll_log2explicit(hll_empty()); + hll_log2explicit + ------------------ + 10 + (1 row) + + MogDB=# select hll_log2explicit(hll_empty(12, 8)); + hll_log2explicit + ------------------ + 8 + (1 row) + + MogDB=# select hll_log2explicit(hll_empty(12, -1)); + hll_log2explicit + ------------------ + 10 + (1 row) + ``` + +- hll_log2sparse(hll) + + 描述:查看当前hll数据结构中的log2sparse数值。hll通常会由Explicit模式到Sparse模式再到Full模式,这个过程称为promotion hierarchy策略。可以通过调整log2sparse值的大小改变策略,比如log2sparse为0的时候就会跳过Sparse模式而直接进入Full模式。当显式指定Sparse的取值为1-14之间时,hll会在数据段长度超过2log2sparse时转为Full模式。当显示指定log2sparse为-1时,会采用内置默认值。 + + 示例: + + ```sql + MogDB=# select hll_log2sparse(hll_empty()); + hll_log2sparse + ---------------- + 12 + (1 row) + + MogDB=# select hll_log2sparse(hll_empty(12, 8, 10)); + hll_log2sparse + ---------------- + 10 + (1 row) + + MogDB=# select hll_log2sparse(hll_empty(12, 8, -1)); + hll_log2sparse + ---------------- + 12 + (1 row) + ``` + +- hll_duplicatecheck(hll) + + 描述:是否启用duplicatecheck,0是关闭,1是开启。默认关闭,对于有较多重复值出现的情况,可以开启以提高效率。当显示指定duplicatecheck为-1时,会采用内置默认值。 + + 示例: + + ```sql + MogDB=# select hll_duplicatecheck(hll_empty()); + hll_duplicatecheck + -------------------- + 0 + (1 row) + + MogDB=# select hll_duplicatecheck(hll_empty(12, 8, 10, 1)); + hll_duplicatecheck + -------------------- + 1 + (1 row) + + MogDB=# select hll_duplicatecheck(hll_empty(12, 8, 10, -1)); + hll_duplicatecheck + -------------------- + 0 + (1 row) + ``` + +## 功能函数 + +- hll_empty() + + 描述:创建一个空的hll。 + + 返回值类型:hll + + 示例: + + ```sql + MogDB=# select hll_empty(); + hll_empty + ------------------------------------------------------------ + \x484c4c00000000002b05000000000000000000000000000000000000 + (1 row) + ``` + +- hll_empty(int32 log2m) + + 描述:创建空的hll并指定参数log2m,取值范围是10到16。若输入-1,则采用内置默认值。 + + 返回值类型:hll + + 示例: + + ```sql + MogDB=# select hll_empty(10); + hll_empty + ------------------------------------------------------------ + \x484c4c00000000002b04000000000000000000000000000000000000 + (1 row) + + MogDB=# select hll_empty(-1); + hll_empty + ------------------------------------------------------------ + \x484c4c00000000002b05000000000000000000000000000000000000 + (1 row) + ``` + +- hll_empty(int32 log2m, int32 log2explicit) + + 描述:创建空的hll并依次指定参数log2m、log2explicit。log2explicit取值范围是0到12,0表示直接跳过Explicit模式。该参数可以用来设置Explicit模式的阈值大小,在数据段长度达到2log2explicit后切换为Sparse模式或者Full模式。若输入-1,则log2explicit采用内置默认值。 + + 返回值类型: hll + + 示例: + + ```sql + MogDB=# select hll_empty(10, 4); + hll_empty + ------------------------------------------------------------ + \x484c4c00000000001304000000000000000000000000000000000000 + (1 row) + + MogDB=# select hll_empty(10, -1); + hll_empty + ------------------------------------------------------------ + \x484c4c00000000002b04000000000000000000000000000000000000 + (1 row) + ``` + +- hll_empty(int32 log2m, int32 log2explicit, int64 log2sparse) + + 描述:创建空的hll并依次指定参数log2m、log2explicit、log2sparse。log2sparse取值范围是0到14,0表示直接跳过Sparse模式。该参数可以用来设置Sparse模式的阈值大小,在数据段长度达到2log2sparse后切换为Full模式。若输入-1,则log2sparse采用内置默认值。 + + 返回值类型:hll + + 示例: + + ```sql + MogDB=# select hll_empty(10, 4, 8); + hll_empty + ------------------------------------------------------------ + \x484c4c00000000001204000000000000000000000000000000000000 + (1 row) + + MogDB=# select hll_empty(10, 4, -1); + hll_empty + ------------------------------------------------------------ + \x484c4c00000000001304000000000000000000000000000000000000 + (1 row) + ``` + +- hll_empty(int32 log2m, int32 log2explicit, int64 log2sparse, int32 duplicatecheck) + + 描述:创建空的hll并依次指定参数log2m、log2explicit、log2sparse、duplicatecheck。duplicatecheck取0或者1,表示是否开启该模式,默认情况下该模式会关闭。若输入-1,则duplicatecheck采用内置默认值。 + + 返回值类型:hll + + 示例: + + ```sql + MogDB=# select hll_empty(10, 4, 8, 0); + hll_empty + ------------------------------------------------------------ + \x484c4c00000000001204000000000000000000000000000000000000 + (1 row) + + MogDB=# select hll_empty(10, 4, 8, -1); + hll_empty + ------------------------------------------------------------ + \x484c4c00000000001204000000000000000000000000000000000000 + (1 row) + ``` + +- hll_add(hll, hll_hashval) + + 描述:把hll_hashval加入到hll中。 + + 返回值类型:hll + + 示例: + + ```sql + MogDB=# select hll_add(hll_empty(), hll_hash_integer(1)); + hll_add + ---------------------------------------------------------------------------- + \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00 + (1 row) + ``` + +- hll_add_rev(hll_hashval, hll) + + 描述:把hll_hashval加入到hll中,和hll_add功能一样,只是参数位置进行了交换。 + + 返回值类型:hll + + 示例: + + ```sql + MogDB=# select hll_add_rev(hll_hash_integer(1), hll_empty()); + hll_add_rev + ---------------------------------------------------------------------------- + \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00 + (1 row) + ``` + +- hll_eq(hll, hll) + + 描述:比较两个hll是否相等。 + + 返回值类型:bool + + 示例: + + ```sql + MogDB=# select hll_eq(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2))); + hll_eq + -------- + f + (1 row) + ``` + +- hll_ne(hll, hll) + + 描述:比较两个hll是否不相等。 + + 返回值类型:bool + + 示例: + + ```sql + MogDB=# select hll_ne(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2))); + hll_ne + -------- + t + (1 row) + ``` + +- hll_cardinality(hll) + + 描述:计算hll的distinct值。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# select hll_cardinality(hll_empty() || hll_hash_integer(1)); + hll_cardinality + ----------------- + 1 + (1 row) + ``` + +- hll_union(hll, hll) + + 描述:把两个hll数据结构union成一个。 + + 返回值类型:hll + + 示例: + + ```sql + MogDB=# select hll_union(hll_add(hll_empty(), hll_hash_integer(1)), hll_add(hll_empty(), hll_hash_integer(2))); + hll_union + -------------------------------------------------------------------------------------------- + \x484c4c10002000002b090000000000000000400000000000000000b3ccc49320cca1ae3e2921ff133fbaed00 + (1 row) + ``` + +## 聚合函数 + +- hll_add_agg(hll_hashval) + + 描述:把哈希后的数据按照分组放到hll中。 + + 返回值类型:hll + + 示例: + + ```sql + --准备数据 + MogDB=# create table t_id(id int); + MogDB=# insert into t_id values(generate_series(1,500)); + MogDB=# create table t_data(a int, c text); + MogDB=# insert into t_data select mod(id,2), id from t_id; + + --创建表并指定列为hll + MogDB=# create table t_a_c_hll(a int, c hll); + + --根据a列group by对数据分组,把各组数据加到hll中 + MogDB=# insert into t_a_c_hll select a, hll_add_agg(hll_hash_text(c)) from t_data group by a; + + --得到每组数据中hll的Distinct值 + MogDB=# select a, #c as cardinality from t_a_c_hll order by a; + a | cardinality + ---+------------------ + 0 | 247.862354346299 + 1 | 250.908710610377 + (2 rows) + ``` + +- hll_add_agg(hll_hashval, int32 log2m) + + 描述:把哈希后的数据按照分组放到hll中,并指定参数log2m,取值范围是10到16。若输入-1或者NULL,则采用内置默认值。 + + 返回值类型:hll + + 示例: + + ```sql + MogDB=# select hll_cardinality(hll_add_agg(hll_hash_text(c), 12)) from t_data; + hll_cardinality + ------------------ + 497.965240179228 + (1 row) + ``` + +- hll_add_agg(hll_hashval, int32 log2m, int32 log2explicit) + + 描述:把哈希后的数据按照分组放到hll中,依次指定参数log2m、log2explicit。log2explicit取值范围是0到12,0表示直接跳过Explicit模式。该参数可以用来设置Explicit模式的阈值大小,在数据段长度达到2log2explicit后切换为Sparse模式或者Full模式。若输入-1或者NULL,则log2explicit采用内置默认值。 + + 返回值类型:hll + + 示例: + + ```sql + MogDB=# select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 1)) from t_data; + hll_cardinality + ------------------ + 498.496062953313 + (1 row) + ``` + +- hll_add_agg(hll_hashval, int32 log2m, int32 log2explicit, int64 log2sparse) + + 描述:把哈希后的数据按照分组放到hll中,依次指定参数log2m、log2explicit、log2sparse。log2sparse取值范围是0到14,0表示直接跳过Sparse模式。该参数可以用来设置Sparse模式的阈值大小,在数据段长度达到2log2sparse后切换为Full模式。若输入-1或者NULL,则log2sparse采用内置默认值。 + + 返回值类型:hll + + 示例: + + ```sql + MogDB=# select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 6, 10)) from t_data; + hll_cardinality + ------------------ + 498.496062953313 + (1 row) + ``` + +- hll_add_agg(hll_hashval, int32 log2m, int32 log2explicit, int64 log2sparse, int32 duplicatecheck) + + 描述:把哈希后的数据按照分组放到hll中, 依次制定参数log2m、log2explicit、log2sparse、duplicatecheck,duplicatecheck取值范围是0或者1,表示是否开启该模式,默认情况下该模式会关闭。若输入-1或者NULL,则duplicatecheck采用内置默认值。 + + 返回值类型:hll + + 示例: + + ```sql + MogDB=# select hll_cardinality(hll_add_agg(hll_hash_text(c), NULL, 6, 10, -1)) from t_data; + hll_cardinality + ------------------ + 498.496062953313 + (1 row) + ``` + +- hll_union_agg(hll) + + 描述:将多个hll类型数据union成一个hll。 + + 返回值类型:hll + + 示例: + + ```sql + --将各组中的hll数据union成一个hll,并计算distinct值。 + MogDB=# select #hll_union_agg(c) as cardinality from t_a_c_hll; + cardinality + ------------------ + 498.496062953313 + (1 row) + ``` + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** + > + > 注意:当两个或者多个hll数据结构做union的时候,必须要保证其中每一个hll里面的精度参数一样,否则将不可以进行union。同样的约束也适用于函数hll_union(hll,hll)。 + +## 废弃函数 + +由于版本升级,HLL(HyperLogLog)有一些旧的函数废弃,用户可以用类似的函数进行替代。 + +- hll_schema_version(hll) + + 描述:查看当前hll中的schema version。旧版本schema version是常值1,用来进行hll字段的头部校验,重构后的hll在头部增加字段“HLL”进行校验,schema version不再使用。 + +- hll_regwidth(hll) + + 描述:查看hll数据结构中桶的位数大小。旧版本桶的位数regwidth取值1~5,会存在较大的误差,也限制了基数估计上限。 重构后regwidth为固定值6,不再使用regwidth变量。 + +- hll_expthresh(hll) + + 描述:得到当前hll中expthresh大小。采用hll_log2explicit(hll)替代类似功能。 + +- hll_sparseon(hll) + + 描述:是否启用Sparse模式。采用hll_log2sparse(hll)替代类似功能,0表示关闭Sparse模式。 + +## 内置函数 + +HLL(HyperLogLog)有一系列内置函数用于内部对数据进行处理,一般情况下用户不需要熟知这些函数的使用。详情见表1。 + +**表 1** 内置函数 + +| 函数名称 | 功能描述 | +| :---------------- | :----------------------------------------------------------- | +| hll_in | 以string格式接收hll数据。 | +| hll_out | 以string格式发送hll数据。 | +| hll_recv | 以bytea格式接收hll数据。 | +| hll_send | 以bytea格式发送hll数据。 | +| hll_trans_in | 以string格式接收hll_trans_type数据。 | +| hll_trans_out | 以string格式发送hll_trans_type数据。 | +| hll_trans_recv | 以bytea形式接收hll_trans_type数据。 | +| hll_trans_send | 以bytea形式发送hll_trans_type数据。 | +| hll_typmod_in | 接收typmod类型数据。 | +| hll_typmod_out | 发送typmod类型数据。 | +| hll_hashval_in | 接收hll_hashval类型数据。 | +| hll_hashval_out | 发送hll_hashval类型数据。 | +| hll_add_trans0 | 类似于hll_add所提供的功能,初始化时无指定入参,通常在聚合运算的第一阶段DN上使用。 | +| hll_add_trans1 | 类似于hll_add所提供的功能,初始化时指定一个入参,通常在聚合运算的第一阶段DN上使用。 | +| hll_add_trans2 | 类似于hll_add所提供的功能,初始化时指定两个入参,通常在聚合运算的第一阶段DN上使用。 | +| hll_add_trans3 | 类似于hll_add所提供的功能,初始化时指定三个入参,通常在聚合运算的第一阶段DN上使用。 | +| hll_add_trans4 | 类似于hll_add所提供的功能,初始化时指定四个入参,通常在聚合运算的第一阶段DN上使用。 | +| hll_union_trans | 类似hll_union所提供的功能,在聚合运算的第一阶段DN上使用。 | +| hll_union_collect | 类似于hll_union所提供的功能,在聚合运算第二阶段DN上使用,汇总各个DN上的结果。 | +| hll_pack | 在聚合运算第三阶段DN上使用,把自定义hll_trans_type类型最后转换成hll类型。 | +| hll | 用于hll类型转换成hll类型,根据输入参数会设定指定参数。 | +| hll_hashval | 用于bigint类型转换成hll_hashval类型。 | +| hll_hashval_int4 | 用于int4类型转换成hll_hashval类型。 | + +## 操作符 + +- = + + 描述:比较hll或hll_hashval的值是否相等。 + + 返回值类型:bool + + 示例: + + ```sql + --hll + MogDB=# select (hll_empty() || hll_hash_integer(1)) = (hll_empty() || hll_hash_integer(1)); + column + ---------- + t + (1 row) + + --hll_hashval + MogDB=# select hll_hash_integer(1) = hll_hash_integer(1); + ?column? + ---------- + t + (1 row) + ``` + +- <> or != + + 描述:比较hll或hll_hashval是否不相等。 + + 返回值类型:bool + + 示例: + + ```sql + --hll + MogDB=# select (hll_empty() || hll_hash_integer(1)) <> (hll_empty() || hll_hash_integer(2)); + ?column? + ---------- + t + (1 row) + + --hll_hashval + MogDB=# select hll_hash_integer(1) <> hll_hash_integer(2); + ?column? + ---------- + t + (1 row) + ``` + +- || + + 描述:可代表hll_add、hll_union、hll_add_rev三个函数的功能。 + + 返回值类型:hll + + 示例: + + ```sql + --hll_add + MogDB=# select hll_empty() || hll_hash_integer(1); + ?column? + ---------------------------------------------------------------------------- + \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00 + (1 row) + + --hll_add_rev + MogDB=# select hll_hash_integer(1) || hll_empty(); + ?column? + ---------------------------------------------------------------------------- + \x484c4c08000002002b0900000000000000f03f3e2921ff133fbaed3e2921ff133fbaed00 + (1 row) + + --hll_union + MogDB=# select (hll_empty() || hll_hash_integer(1)) || (hll_empty() || hll_hash_integer(2)); + ?column? + -------------------------------------------------------------------------------------------- + \x484c4c10002000002b090000000000000000400000000000000000b3ccc49320cca1ae3e2921ff133fbaed00 + (1 row) + ``` + +- \# + + 描述:计算出hll的Dintinct值, 同hll_cardinality函数。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# select #(hll_empty() || hll_hash_integer(1)); + ?column? + ---------- + 1 + (1 row) + ``` diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/18-window-functions.md b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/18-window-functions.md index 6efb1c8fb02ab90d9ea47722d3bc622cce16c507..3c150f2088436b394ffb73906c1ae576aadc82ed 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/18-window-functions.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/18-window-functions.md @@ -1,629 +1,652 @@ ---- -title: 窗口函数 -summary: 窗口函数 -author: Zhang Cuiping -date: 2021-04-20 ---- - -# 窗口函数 - -列存表目前只支持rank(expression)和row_number(expression)两个函数。 - -窗口函数与OVER语句一起使用。OVER语句用于对数据进行分组,并对组内元素进行排序。窗口函数用于给组内的值生成序号。 - -> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: -> 窗口函数中的order by后面必须跟字段名,若order by后面跟数字,该数字会被按照常量处理,因此对目标列没有起到排序的作用。 - -- RANK() - - 描述:RANK函数为各组内值生成跳跃排序序号,其中,相同的值具有相同序号。 - - 返回值类型:BIGINT - - 示例: - - ```sql - MogDB=# SELECT d_moy, d_fy_week_seq, rank() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; - d_moy | d_fy_week_seq | rank - -------+---------------+------ - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 2 | 8 - 1 | 2 | 8 - 1 | 2 | 8 - 1 | 2 | 8 - 1 | 2 | 8 - 1 | 2 | 8 - 1 | 2 | 8 - 1 | 3 | 15 - 1 | 3 | 15 - 1 | 3 | 15 - 1 | 3 | 15 - 1 | 3 | 15 - 1 | 3 | 15 - 1 | 3 | 15 - 1 | 4 | 22 - 1 | 4 | 22 - 1 | 4 | 22 - 1 | 4 | 22 - 1 | 4 | 22 - 1 | 4 | 22 - 1 | 4 | 22 - 1 | 5 | 29 - 1 | 5 | 29 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 6 | 6 - 2 | 6 | 6 - 2 | 6 | 6 - 2 | 6 | 6 - 2 | 6 | 6 - 2 | 6 | 6 - 2 | 6 | 6 - (42 rows) - ``` - -- ROW_NUMBER() - - 描述:ROW_NUMBER函数为各组内值生成连续排序序号,其中,相同的值其序号也不相同。 - - 返回值类型:BIGINT - - 示例: - - ```sql - MogDB=# SELECT d_moy, d_fy_week_seq, Row_number() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; - d_moy | d_fy_week_seq | row_number - -------+---------------+------------ - 1 | 1 | 1 - 1 | 1 | 2 - 1 | 1 | 3 - 1 | 1 | 4 - 1 | 1 | 5 - 1 | 1 | 6 - 1 | 1 | 7 - 1 | 2 | 8 - 1 | 2 | 9 - 1 | 2 | 10 - 1 | 2 | 11 - 1 | 2 | 12 - 1 | 2 | 13 - 1 | 2 | 14 - 1 | 3 | 15 - 1 | 3 | 16 - 1 | 3 | 17 - 1 | 3 | 18 - 1 | 3 | 19 - 1 | 3 | 20 - 1 | 3 | 21 - 1 | 4 | 22 - 1 | 4 | 23 - 1 | 4 | 24 - 1 | 4 | 25 - 1 | 4 | 26 - 1 | 4 | 27 - 1 | 4 | 28 - 1 | 5 | 29 - 1 | 5 | 30 - 2 | 5 | 1 - 2 | 5 | 2 - 2 | 5 | 3 - 2 | 5 | 4 - 2 | 5 | 5 - 2 | 6 | 6 - 2 | 6 | 7 - 2 | 6 | 8 - 2 | 6 | 9 - 2 | 6 | 10 - 2 | 6 | 11 - 2 | 6 | 12 - (42 rows) - ``` - -- DENSE_RANK() - - 描述:DENSE_RANK函数为各组内值生成连续排序序号,其中,相同的值具有相同序号。 - - 返回值类型:BIGINT - - 示例: - - ```sql - MogDB=# SELECT d_moy, d_fy_week_seq, dense_rank() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; - d_moy | d_fy_week_seq | dense_rank - -------+---------------+------------ - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 2 | 2 - 1 | 2 | 2 - 1 | 2 | 2 - 1 | 2 | 2 - 1 | 2 | 2 - 1 | 2 | 2 - 1 | 2 | 2 - 1 | 3 | 3 - 1 | 3 | 3 - 1 | 3 | 3 - 1 | 3 | 3 - 1 | 3 | 3 - 1 | 3 | 3 - 1 | 3 | 3 - 1 | 4 | 4 - 1 | 4 | 4 - 1 | 4 | 4 - 1 | 4 | 4 - 1 | 4 | 4 - 1 | 4 | 4 - 1 | 4 | 4 - 1 | 5 | 5 - 1 | 5 | 5 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 6 | 2 - 2 | 6 | 2 - 2 | 6 | 2 - 2 | 6 | 2 - 2 | 6 | 2 - 2 | 6 | 2 - 2 | 6 | 2 - (42 rows) - ``` - -- PERCENT_RANK() - - 描述:PERCENT_RANK函数为各组内对应值生成相对序号,即根据公式 (rank - 1) / (total rows - 1)计算所得的值。其中rank为该值依据RANK函数所生成的对应序号,totalrows为该分组内的总元素个数。 - - 返回值类型:DOUBLE PRECISION - - 示例: - - ```sql - MogDB=# SELECT d_moy, d_fy_week_seq, percent_rank() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; - d_moy | d_fy_week_seq | percent_rank - -------+---------------+------------------ - 1 | 1 | 0 - 1 | 1 | 0 - 1 | 1 | 0 - 1 | 1 | 0 - 1 | 1 | 0 - 1 | 1 | 0 - 1 | 1 | 0 - 1 | 2 | .241379310344828 - 1 | 2 | .241379310344828 - 1 | 2 | .241379310344828 - 1 | 2 | .241379310344828 - 1 | 2 | .241379310344828 - 1 | 2 | .241379310344828 - 1 | 2 | .241379310344828 - 1 | 3 | .482758620689655 - 1 | 3 | .482758620689655 - 1 | 3 | .482758620689655 - 1 | 3 | .482758620689655 - 1 | 3 | .482758620689655 - 1 | 3 | .482758620689655 - 1 | 3 | .482758620689655 - 1 | 4 | .724137931034483 - 1 | 4 | .724137931034483 - 1 | 4 | .724137931034483 - 1 | 4 | .724137931034483 - 1 | 4 | .724137931034483 - 1 | 4 | .724137931034483 - 1 | 4 | .724137931034483 - 1 | 5 | .96551724137931 - 1 | 5 | .96551724137931 - 2 | 5 | 0 - 2 | 5 | 0 - 2 | 5 | 0 - 2 | 5 | 0 - 2 | 5 | 0 - 2 | 6 | .454545454545455 - 2 | 6 | .454545454545455 - 2 | 6 | .454545454545455 - 2 | 6 | .454545454545455 - 2 | 6 | .454545454545455 - 2 | 6 | .454545454545455 - 2 | 6 | .454545454545455 - (42 rows) - ``` - -- CUME_DIST() - - 描述:CUME_DIST函数为各组内对应值生成累积分布序号。即根据公式(小于等于当前值的数据行数)/(该分组总行数totalrows)计算所得的相对序号。 - - 返回值类型:DOUBLE PRECISION - - 示例: - - ```sql - MogDB=# SELECT d_moy, d_fy_week_seq, cume_dist() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim e_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; - d_moy | d_fy_week_seq | cume_dist - -------+---------------+------------------ - 1 | 1 | .233333333333333 - 1 | 1 | .233333333333333 - 1 | 1 | .233333333333333 - 1 | 1 | .233333333333333 - 1 | 1 | .233333333333333 - 1 | 1 | .233333333333333 - 1 | 1 | .233333333333333 - 1 | 2 | .466666666666667 - 1 | 2 | .466666666666667 - 1 | 2 | .466666666666667 - 1 | 2 | .466666666666667 - 1 | 2 | .466666666666667 - 1 | 2 | .466666666666667 - 1 | 2 | .466666666666667 - 1 | 3 | .7 - 1 | 3 | .7 - 1 | 3 | .7 - 1 | 3 | .7 - 1 | 3 | .7 - 1 | 3 | .7 - 1 | 3 | .7 - 1 | 4 | .933333333333333 - 1 | 4 | .933333333333333 - 1 | 4 | .933333333333333 - 1 | 4 | .933333333333333 - 1 | 4 | .933333333333333 - 1 | 4 | .933333333333333 - 1 | 4 | .933333333333333 - 1 | 5 | 1 - 1 | 5 | 1 - 2 | 5 | .416666666666667 - 2 | 5 | .416666666666667 - 2 | 5 | .416666666666667 - 2 | 5 | .416666666666667 - 2 | 5 | .416666666666667 - 2 | 6 | 1 - 2 | 6 | 1 - 2 | 6 | 1 - 2 | 6 | 1 - 2 | 6 | 1 - 2 | 6 | 1 - 2 | 6 | 1 - (42 rows) - ``` - -- NTILE(num_buckets integer) - - 描述:NTILE函数根据num_buckets integer将有序的数据集合平均分配到num_buckets所指定数量的桶中,并将桶号分配给每一行。分配时应尽量做到平均分配。 - - 返回值类型:INTEGER - - 示例: - - ```sql - MogDB=# SELECT d_moy, d_fy_week_seq, ntile(3) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; - d_moy | d_fy_week_seq | ntile - -------+---------------+------- - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 2 - 1 | 2 | 2 - 1 | 2 | 2 - 1 | 2 | 2 - 1 | 3 | 2 - 1 | 3 | 2 - 1 | 3 | 2 - 1 | 3 | 2 - 1 | 3 | 2 - 1 | 3 | 2 - 1 | 3 | 3 - 1 | 4 | 3 - 1 | 4 | 3 - 1 | 4 | 3 - 1 | 4 | 3 - 1 | 4 | 3 - 1 | 4 | 3 - 1 | 4 | 3 - 1 | 5 | 3 - 1 | 5 | 3 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 5 | 1 - 2 | 5 | 2 - 2 | 6 | 2 - 2 | 6 | 2 - 2 | 6 | 2 - 2 | 6 | 3 - 2 | 6 | 3 - 2 | 6 | 3 - 2 | 6 | 3 - (42 rows) - ``` - -- LAG(value any [, offset integer [, default any ]]) - - 描述:LAG函数为各组内对应值生成滞后值。即当前值对应的行数往前偏移offset位后所得行的value值作为序号。若经过偏移后行数不存在,则对应结果取为default值。若无指定,在默认情况下,offset取为1,default值取为NULL。 - - 返回值类型:与参数数据类型相同。 - - 示例: - - ```sql - MogDB=# SELECT d_moy, d_fy_week_seq, lag(d_moy,3,null) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; - d_moy | d_fy_week_seq | lag - -------+---------------+----- - 1 | 1 | - 1 | 1 | - 1 | 1 | - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 5 | 1 - 1 | 5 | 1 - 2 | 5 | - 2 | 5 | - 2 | 5 | - 2 | 5 | 2 - 2 | 5 | 2 - 2 | 6 | 2 - 2 | 6 | 2 - 2 | 6 | 2 - 2 | 6 | 2 - 2 | 6 | 2 - 2 | 6 | 2 - 2 | 6 | 2 - (42 rows) - ``` - -- LEAD(value any [, offset integer [, default any ]]) - - 描述:LEAD函数为各组内对应值生成提前值。即当前值对应的行数向后偏移offset位后所得行的value值作为序号。若经过向后偏移后行数超过当前组内的总行数,则对应结果取为default值。若无指定,在默认情况下,offset取为1,default值取为NULL。 - - 返回值类型:与参数数据类型相同。 - - 示例: - - ```sql - MogDB=# SELECT d_moy, d_fy_week_seq, lead(d_fy_week_seq,2) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; - d_moy | d_fy_week_seq | lead - -------+---------------+------ - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 2 - 1 | 1 | 2 - 1 | 2 | 2 - 1 | 2 | 2 - 1 | 2 | 2 - 1 | 2 | 2 - 1 | 2 | 2 - 1 | 2 | 3 - 1 | 2 | 3 - 1 | 3 | 3 - 1 | 3 | 3 - 1 | 3 | 3 - 1 | 3 | 3 - 1 | 3 | 3 - 1 | 3 | 4 - 1 | 3 | 4 - 1 | 4 | 4 - 1 | 4 | 4 - 1 | 4 | 4 - 1 | 4 | 4 - 1 | 4 | 4 - 1 | 4 | 5 - 1 | 4 | 5 - 1 | 5 | - 1 | 5 | - 2 | 5 | 5 - 2 | 5 | 5 - 2 | 5 | 5 - 2 | 5 | 6 - 2 | 5 | 6 - 2 | 6 | 6 - 2 | 6 | 6 - 2 | 6 | 6 - 2 | 6 | 6 - 2 | 6 | 6 - 2 | 6 | - 2 | 6 | - (42 rows) - ``` - -- FIRST_VALUE(value any) - - 描述:FIRST_VALUE函数取各组内的第一个值作为返回结果。 - - 返回值类型:与参数数据类型相同。 - - 示例: - - ```sql - MogDB=# SELECT d_moy, d_fy_week_seq, first_value(d_fy_week_seq) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; - d_moy | d_fy_week_seq | first_value - -------+---------------+------------- - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 5 | 1 - 1 | 5 | 1 - 2 | 5 | 5 - 2 | 5 | 5 - 2 | 5 | 5 - 2 | 5 | 5 - 2 | 5 | 5 - 2 | 6 | 5 - 2 | 6 | 5 - 2 | 6 | 5 - 2 | 6 | 5 - 2 | 6 | 5 - 2 | 6 | 5 - 2 | 6 | 5 - (42 rows) - ``` - -- LAST_VALUE(value any) - - 描述:LAST_VALUE函数取各组内的最后一个值作为返回结果。 - - 返回值类型:与参数数据类型相同。 - - 示例: - - ```sql - MogDB=# SELECT d_moy, d_fy_week_seq, last_value(d_moy) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 6 ORDER BY 1,2; - d_moy | d_fy_week_seq | last_value - -------+---------------+------------ - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 5 | 1 - 1 | 5 | 1 - 2 | 5 | 2 - 2 | 5 | 2 - 2 | 5 | 2 - 2 | 5 | 2 - 2 | 5 | 2 - (35 rows) - ``` - -- NTH_VALUE(value any, nth integer) - - 描述:NTH_VALUE函数返回该组内的第nth行作为结果。若该行不存在,则默认返回NULL。 - - 返回值类型:与参数数据类型相同。 - - 示例: - - ```sql - MogDB=# SELECT d_moy, d_fy_week_seq, nth_value(d_fy_week_seq,6) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 6 ORDER BY 1,2; - d_moy | d_fy_week_seq | nth_value - -------+---------------+----------- - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 1 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 2 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 3 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 4 | 1 - 1 | 5 | 1 - 1 | 5 | 1 - 2 | 5 | - 2 | 5 | - 2 | 5 | - 2 | 5 | - 2 | 5 | - (35 rows) - ``` +--- +title: 窗口函数 +summary: 窗口函数 +author: Zhang Cuiping +date: 2021-04-20 +--- + +# 窗口函数 + +列存表目前只支持rank(expression)和row_number(expression)两个函数。 + +窗口函数与OVER语句一起使用。OVER语句用于对数据进行分组,并对组内元素进行排序。窗口函数用于给组内的值生成序号。 + +> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: +> 窗口函数中的order by后面必须跟字段名,若order by后面跟数字,该数字会被按照常量处理,因此对目标列没有起到排序的作用。 + +- RANK() + + 描述:RANK函数为各组内值生成跳跃排序序号,其中,相同的值具有相同序号。 + + 返回值类型:BIGINT + + 示例: + + ```sql + MogDB=# SELECT d_moy, d_fy_week_seq, rank() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; + d_moy | d_fy_week_seq | rank + -------+---------------+------ + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 2 | 8 + 1 | 2 | 8 + 1 | 2 | 8 + 1 | 2 | 8 + 1 | 2 | 8 + 1 | 2 | 8 + 1 | 2 | 8 + 1 | 3 | 15 + 1 | 3 | 15 + 1 | 3 | 15 + 1 | 3 | 15 + 1 | 3 | 15 + 1 | 3 | 15 + 1 | 3 | 15 + 1 | 4 | 22 + 1 | 4 | 22 + 1 | 4 | 22 + 1 | 4 | 22 + 1 | 4 | 22 + 1 | 4 | 22 + 1 | 4 | 22 + 1 | 5 | 29 + 1 | 5 | 29 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 6 | 6 + 2 | 6 | 6 + 2 | 6 | 6 + 2 | 6 | 6 + 2 | 6 | 6 + 2 | 6 | 6 + 2 | 6 | 6 + (42 rows) + ``` + +- ROW_NUMBER() + + 描述:ROW_NUMBER函数为各组内值生成连续排序序号,其中,相同的值其序号也不相同。 + + 返回值类型:BIGINT + + 示例: + + ```sql + MogDB=# SELECT d_moy, d_fy_week_seq, Row_number() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; + d_moy | d_fy_week_seq | row_number + -------+---------------+------------ + 1 | 1 | 1 + 1 | 1 | 2 + 1 | 1 | 3 + 1 | 1 | 4 + 1 | 1 | 5 + 1 | 1 | 6 + 1 | 1 | 7 + 1 | 2 | 8 + 1 | 2 | 9 + 1 | 2 | 10 + 1 | 2 | 11 + 1 | 2 | 12 + 1 | 2 | 13 + 1 | 2 | 14 + 1 | 3 | 15 + 1 | 3 | 16 + 1 | 3 | 17 + 1 | 3 | 18 + 1 | 3 | 19 + 1 | 3 | 20 + 1 | 3 | 21 + 1 | 4 | 22 + 1 | 4 | 23 + 1 | 4 | 24 + 1 | 4 | 25 + 1 | 4 | 26 + 1 | 4 | 27 + 1 | 4 | 28 + 1 | 5 | 29 + 1 | 5 | 30 + 2 | 5 | 1 + 2 | 5 | 2 + 2 | 5 | 3 + 2 | 5 | 4 + 2 | 5 | 5 + 2 | 6 | 6 + 2 | 6 | 7 + 2 | 6 | 8 + 2 | 6 | 9 + 2 | 6 | 10 + 2 | 6 | 11 + 2 | 6 | 12 + (42 rows) + ``` + +- DENSE_RANK() + + 描述:DENSE_RANK函数为各组内值生成连续排序序号,其中,相同的值具有相同序号。 + + 返回值类型:BIGINT + + 示例: + + ```sql + MogDB=# SELECT d_moy, d_fy_week_seq, dense_rank() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; + d_moy | d_fy_week_seq | dense_rank + -------+---------------+------------ + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 5 | 5 + 1 | 5 | 5 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + (42 rows) + ``` + +- PERCENT_RANK() + + 描述:PERCENT_RANK函数为各组内对应值生成相对序号,即根据公式 (rank - 1) / (total rows - 1)计算所得的值。其中rank为该值依据RANK函数所生成的对应序号,totalrows为该分组内的总元素个数。 + + 返回值类型:DOUBLE PRECISION + + 示例: + + ```sql + MogDB=# SELECT d_moy, d_fy_week_seq, percent_rank() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; + d_moy | d_fy_week_seq | percent_rank + -------+---------------+------------------ + 1 | 1 | 0 + 1 | 1 | 0 + 1 | 1 | 0 + 1 | 1 | 0 + 1 | 1 | 0 + 1 | 1 | 0 + 1 | 1 | 0 + 1 | 2 | .241379310344828 + 1 | 2 | .241379310344828 + 1 | 2 | .241379310344828 + 1 | 2 | .241379310344828 + 1 | 2 | .241379310344828 + 1 | 2 | .241379310344828 + 1 | 2 | .241379310344828 + 1 | 3 | .482758620689655 + 1 | 3 | .482758620689655 + 1 | 3 | .482758620689655 + 1 | 3 | .482758620689655 + 1 | 3 | .482758620689655 + 1 | 3 | .482758620689655 + 1 | 3 | .482758620689655 + 1 | 4 | .724137931034483 + 1 | 4 | .724137931034483 + 1 | 4 | .724137931034483 + 1 | 4 | .724137931034483 + 1 | 4 | .724137931034483 + 1 | 4 | .724137931034483 + 1 | 4 | .724137931034483 + 1 | 5 | .96551724137931 + 1 | 5 | .96551724137931 + 2 | 5 | 0 + 2 | 5 | 0 + 2 | 5 | 0 + 2 | 5 | 0 + 2 | 5 | 0 + 2 | 6 | .454545454545455 + 2 | 6 | .454545454545455 + 2 | 6 | .454545454545455 + 2 | 6 | .454545454545455 + 2 | 6 | .454545454545455 + 2 | 6 | .454545454545455 + 2 | 6 | .454545454545455 + (42 rows) + ``` + +- CUME_DIST() + + 描述:CUME_DIST函数为各组内对应值生成累积分布序号。即根据公式(小于等于当前值的数据行数)/(该分组总行数totalrows)计算所得的相对序号。 + + 返回值类型:DOUBLE PRECISION + + 示例: + + ```sql + MogDB=# SELECT d_moy, d_fy_week_seq, cume_dist() OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim e_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; + d_moy | d_fy_week_seq | cume_dist + -------+---------------+------------------ + 1 | 1 | .233333333333333 + 1 | 1 | .233333333333333 + 1 | 1 | .233333333333333 + 1 | 1 | .233333333333333 + 1 | 1 | .233333333333333 + 1 | 1 | .233333333333333 + 1 | 1 | .233333333333333 + 1 | 2 | .466666666666667 + 1 | 2 | .466666666666667 + 1 | 2 | .466666666666667 + 1 | 2 | .466666666666667 + 1 | 2 | .466666666666667 + 1 | 2 | .466666666666667 + 1 | 2 | .466666666666667 + 1 | 3 | .7 + 1 | 3 | .7 + 1 | 3 | .7 + 1 | 3 | .7 + 1 | 3 | .7 + 1 | 3 | .7 + 1 | 3 | .7 + 1 | 4 | .933333333333333 + 1 | 4 | .933333333333333 + 1 | 4 | .933333333333333 + 1 | 4 | .933333333333333 + 1 | 4 | .933333333333333 + 1 | 4 | .933333333333333 + 1 | 4 | .933333333333333 + 1 | 5 | 1 + 1 | 5 | 1 + 2 | 5 | .416666666666667 + 2 | 5 | .416666666666667 + 2 | 5 | .416666666666667 + 2 | 5 | .416666666666667 + 2 | 5 | .416666666666667 + 2 | 6 | 1 + 2 | 6 | 1 + 2 | 6 | 1 + 2 | 6 | 1 + 2 | 6 | 1 + 2 | 6 | 1 + 2 | 6 | 1 + (42 rows) + ``` + +- NTILE(num_buckets integer) + + 描述:NTILE函数根据num_buckets integer将有序的数据集合平均分配到num_buckets所指定数量的桶中,并将桶号分配给每一行。分配时应尽量做到平均分配。 + + 返回值类型:INTEGER + + 示例: + + ```sql + MogDB=# SELECT d_moy, d_fy_week_seq, ntile(3) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; + d_moy | d_fy_week_seq | ntile + -------+---------------+------- + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 3 | 2 + 1 | 3 | 2 + 1 | 3 | 2 + 1 | 3 | 2 + 1 | 3 | 2 + 1 | 3 | 2 + 1 | 3 | 3 + 1 | 4 | 3 + 1 | 4 | 3 + 1 | 4 | 3 + 1 | 4 | 3 + 1 | 4 | 3 + 1 | 4 | 3 + 1 | 4 | 3 + 1 | 5 | 3 + 1 | 5 | 3 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 1 + 2 | 5 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 3 + 2 | 6 | 3 + 2 | 6 | 3 + 2 | 6 | 3 + (42 rows) + ``` + +- LAG(value any [, offset integer [, default any ]]) + + 描述:LAG函数为各组内对应值生成滞后值。即当前值对应的行数往前偏移offset位后所得行的value值作为序号。若经过偏移后行数不存在,则对应结果取为default值。若无指定,在默认情况下,offset取为1,default值取为NULL。 + + 返回值类型:与参数数据类型相同。 + + 示例: + + ```sql + MogDB=# SELECT d_moy, d_fy_week_seq, lag(d_moy,3,null) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; + d_moy | d_fy_week_seq | lag + -------+---------------+----- + 1 | 1 | + 1 | 1 | + 1 | 1 | + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 5 | 1 + 1 | 5 | 1 + 2 | 5 | + 2 | 5 | + 2 | 5 | + 2 | 5 | 2 + 2 | 5 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + 2 | 6 | 2 + (42 rows) + ``` + +- LEAD(value any [, offset integer [, default any ]]) + + 描述:LEAD函数为各组内对应值生成提前值。即当前值对应的行数向后偏移offset位后所得行的value值作为序号。若经过向后偏移后行数超过当前组内的总行数,则对应结果取为default值。若无指定,在默认情况下,offset取为1,default值取为NULL。 + + 返回值类型:与参数数据类型相同。 + + 示例: + + ```sql + MogDB=# SELECT d_moy, d_fy_week_seq, lead(d_fy_week_seq,2) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; + d_moy | d_fy_week_seq | lead + -------+---------------+------ + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 2 + 1 | 1 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 2 + 1 | 2 | 3 + 1 | 2 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 3 + 1 | 3 | 4 + 1 | 3 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 4 + 1 | 4 | 5 + 1 | 4 | 5 + 1 | 5 | + 1 | 5 | + 2 | 5 | 5 + 2 | 5 | 5 + 2 | 5 | 5 + 2 | 5 | 6 + 2 | 5 | 6 + 2 | 6 | 6 + 2 | 6 | 6 + 2 | 6 | 6 + 2 | 6 | 6 + 2 | 6 | 6 + 2 | 6 | + 2 | 6 | + (42 rows) + ``` + +- FIRST_VALUE(value any) + + 描述:FIRST_VALUE函数取各组内的第一个值作为返回结果。 + + 返回值类型:与参数数据类型相同。 + + 示例: + + ```sql + MogDB=# SELECT d_moy, d_fy_week_seq, first_value(d_fy_week_seq) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 7 ORDER BY 1,2; + d_moy | d_fy_week_seq | first_value + -------+---------------+------------- + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 5 | 1 + 1 | 5 | 1 + 2 | 5 | 5 + 2 | 5 | 5 + 2 | 5 | 5 + 2 | 5 | 5 + 2 | 5 | 5 + 2 | 6 | 5 + 2 | 6 | 5 + 2 | 6 | 5 + 2 | 6 | 5 + 2 | 6 | 5 + 2 | 6 | 5 + 2 | 6 | 5 + (42 rows) + ``` + +- LAST_VALUE(value any) + + 描述:LAST_VALUE函数取各组内的最后一个值作为返回结果。 + + 返回值类型:与参数数据类型相同。 + + 示例: + + ```sql + MogDB=# SELECT d_moy, d_fy_week_seq, last_value(d_moy) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 6 ORDER BY 1,2; + d_moy | d_fy_week_seq | last_value + -------+---------------+------------ + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 5 | 1 + 1 | 5 | 1 + 2 | 5 | 2 + 2 | 5 | 2 + 2 | 5 | 2 + 2 | 5 | 2 + 2 | 5 | 2 + (35 rows) + ``` + +- NTH_VALUE(value any, nth integer) + + 描述:NTH_VALUE函数返回该组内的第nth行作为结果。若该行不存在,则默认返回NULL。 + + 返回值类型:与参数数据类型相同。 + + 示例: + + ```sql + MogDB=# SELECT d_moy, d_fy_week_seq, nth_value(d_fy_week_seq,6) OVER(PARTITION BY d_moy ORDER BY d_fy_week_seq) FROM tpcds.date_dim WHERE d_moy < 4 AND d_fy_week_seq < 6 ORDER BY 1,2; + d_moy | d_fy_week_seq | nth_value + -------+---------------+----------- + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 1 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 2 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 3 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 4 | 1 + 1 | 5 | 1 + 1 | 5 | 1 + 2 | 5 | + 2 | 5 | + 2 | 5 | + 2 | 5 | + 2 | 5 | + (35 rows) + ``` + +- ratio_to_report + + 描述:计算一个值与一组值之和的比率。 + + 返回类型:float + + 示例: + + ```sql + MogDB=# SELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rr + FROM employees + WHERE job_id = 'PU_CLERK' + ORDER BY last_name, salary, rr; + ----------------------------------------------- + LAST_NAME SALARY RR + ------------------------- ---------- ---------- + Baida 2900 .208633094 + Colmenares 2500 .179856115 + Himuro 2600 .18705036 + Khoo 3100 .223021583 + Tobias 2800 .201438849 + ``` \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/23-system-information-functions.md b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/23-system-information-functions.md index 4e0b662a6960d518edac8883b891e4a41db4368f..b4fe3a380d3f75e944cf46be3bf27bfefde8e186 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/23-system-information-functions.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/23-system-information-functions.md @@ -1,1791 +1,1834 @@ ---- -title: 系统信息函数 -summary: 系统信息函数 -author: Zhang Cuiping -date: 2021-04-20 ---- - -# 系统信息函数 - -## 会话信息函数 - -- current_catalog - - 描述:当前数据库的名称(在标准SQL中称“catalog”)。 - - 返回值类型:name - - 示例: - - ```sql - MogDB=# SELECT current_catalog; - current_database - ------------------ - mogdb - (1 row) - ``` - -- current_database() - - 描述:当前数据库的名称。 - - 返回值类型:name - - 示例: - - ```sql - MogDB=# SELECT current_database(); - current_database - ------------------ - mogdb - (1 row) - ``` - -- current_query() - - 描述:由客户端提交的当前执行语句(可能包含多个声明)。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT current_query(); - current_query - ------------------------- - SELECT current_query(); - (1 row) - ``` - -- current_schema[()] - - 描述:当前模式的名称。 - - 返回值类型:name - - 示例: - - ```sql - MogDB=# SELECT current_schema(); - current_schema - ---------------- - public - (1 row) - ``` - - 备注:current_schema返回在搜索路径中第一个顺位有效的模式名。(如果搜索路径为空则返回NULL,没有有效的模式名也返回NULL)。如果创建表或者其他命名对象时没有声明目标模式,则将使用这些对象的模式。 - -- current_schemas(Boolean) - - 描述:搜索路径中的模式名称。 - - 返回值类型:name[] - - 示例: - - ```sql - MogDB=# SELECT current_schemas(true); - current_schemas - --------------------- - {pg_catalog,public} - (1 row) - ``` - - 备注: - - current_schemas(Boolean)返回搜索路径中所有模式名称的数组。布尔选项决定像pg_catalog这样隐含包含的系统模式是否包含在返回的搜索路径中。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 搜索路径可以通过运行时设置更改。命令是: - > - > ```sql - > SET search_path TO schema [, schema, ...] - > ``` - -- current_user - - 描述:当前执行环境下的用户名。 - - 返回值类型:name - - 示例: - - ```sql - MogDB=# SELECT current_user; - current_user - -------------- - omm - (1 row) - ``` - - 备注:current_user是用于权限检查的用户标识。通常,他表示会话用户,但是可以通过[SET ROLE](SET-ROLE)改变他。在函数执行的过程中随着属性SECURITY DEFINER的改变,其值也会改变。 - -- definer_current_user - - 描述:当前执行环境下的用户名。 - - 返回值类型:name - - 示例: - - ```sql - MogDB=# SELECT definer_current_user(); - definer_current_user - ---------------------- - omm - (1 row) - ``` - -- pg_current_sessionid() - - 描述:当前执行环境下的会话ID。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT pg_current_sessionid(); - pg_current_sessionid - ---------------------------- - 1579228402.140190434944768 - (1 row) - ``` - - 备注:pg_current_sessionid()是用于获取当前执行环境下的会话ID。其组成结构为:时间戳.会话ID,当线程池模式开启(enable_thread_pool=on)时,会话ID为SessionID;而线程池模式关闭时,会话ID为ThreadID。 - -- pg_current_sessid - - 描述:当前执行环境下的会话ID。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# select pg_current_sessid(); - pg_current_sessid - ------------------- - 140308875015936 - (1 row) - ``` - - 备注:在线程池模式下获得当前会话的会话ID,非线程池模式下获得当前会话对应的后台线程ID。 - -- pg_current_userid - - 描述:当前用户ID。 - - 返回值类型:text - - ```sql - MogDB=# SELECT pg_current_userid(); - pg_current_userid - ------------------- - 10 - (1 row) - ``` - -- working_version_num() - - 描述:版本序号信息。返回一个系统兼容性有关的版本序号。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# SELECT working_version_num(); - working_version_num - --------------------- - 92231 - (1 row) - - ``` - -- tablespace_oid_name() - - 描述: 根据表空间oid,查找表空间名称。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# select tablespace_oid_name(1663); - tablespace_oid_name - --------------------- - pg_default - (1 row) - ``` - -- inet_client_addr() - - 描述:连接的远端地址。inet_client_addr返回当前客户端的IP地址。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 此函数只有在远程连接模式下有效。 - - 返回值类型:inet - - 示例: - - ```sql - MogDB=# SELECT inet_client_addr(); - inet_client_addr - ------------------ - 10.10.0.50 - (1 row) - ``` - -- inet_client_port() - - 描述:连接的远端端口。inet_client_port返回当前客户端的端口号。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 此函数只有在远程连接模式下有效。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# SELECT inet_client_port(); - inet_client_port - ------------------ - 33143 - (1 row) - ``` - -- inet_server_addr() - - 描述:连接的本地地址。inet_server_addr返回服务器接收当前连接用的IP地址。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 此函数只有在远程连接模式下有效。 - - 返回值类型:inet - - 示例: - - ```sql - MogDB=# SELECT inet_server_addr(); - inet_server_addr - ------------------ - 10.10.0.13 - (1 row) - ``` - -- inet_server_port() - - 描述:连接的本地端口。inet_server_port返回接收当前连接的端口号。如果是通过Unix-domain socket连接的,则所有这些函数都返回NULL。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 此函数只有在远程连接模式下有效。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# SELECT inet_server_port(); - inet_server_port - ------------------ - 8000 - (1 row) - ``` - -- pg_backend_pid() - - 描述:当前会话连接的服务进程的进程ID。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# SELECT pg_backend_pid(); - pg_backend_pid - ----------------- - 140229352617744 - (1 row) - ``` - -- pg_conf_load_time() - - 描述:配置加载时间。pg_conf_load_time返回最后加载服务器配置文件的时间戳。 - - 返回值类型:timestamp with time zone - - 示例: - - ```sql - MogDB=# SELECT pg_conf_load_time(); - pg_conf_load_time - ------------------------------ - 2017-09-01 16:05:23.89868+08 - (1 row) - ``` - -- pg_my_temp_schema() - - 描述:会话的临时模式的OID,不存在则为0。 - - 返回值类型:oid - - 示例: - - ```sql - MogDB=# SELECT pg_my_temp_schema(); - pg_my_temp_schema - ------------------- - 0 - (1 row) - ``` - - 备注:pg_my_temp_schema返回当前会话中临时模式的OID,如果不存在(没有创建临时表)的话则返回0。如果给定的OID是其它会话中临时模式的OID,pg_is_other_temp_schema则返回true。 - -- pg_is_other_temp_schema(oid) - - 描述:是否为另一个会话的临时模式。 - - 返回值类型:Boolean - - 示例: - - ```sql - MogDB=# SELECT pg_is_other_temp_schema(25356); - pg_is_other_temp_schema - ------------------------- - f - (1 row) - ``` - -- pg_listening_channels() - - 描述:会话正在侦听的信道名称。 - - 返回值类型:setof text - - 示例: - - ```sql - MogDB=# SELECT pg_listening_channels(); - pg_listening_channels - ----------------------- - (0 rows) - ``` - - 备注:pg_listening_channels返回当前会话正在侦听的一组信道名称。 - -- pg_postmaster_start_time() - - 描述:服务器启动时间。pg_postmaster_start_time返回服务器启动时的timestamp with time zone。 - - 返回值类型:timestamp with time zone - - 示例: - - ```sql - MogDB=# SELECT pg_postmaster_start_time(); - pg_postmaster_start_time - ------------------------------ - 2017-08-30 16:02:54.99854+08 - (1 row) - ``` - -- pg_get_ruledef(rule_oid) - - 描述:获取规则的CREATE RULE命令。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# select * from pg_get_ruledef(24828); - pg_get_ruledef - ------------------------------------------------------------------- - CREATE RULE t1_ins AS ON INSERT TO t1 DO INSTEAD INSERT INTO t2 (id) VALUES (new.id); - (1 row) - ``` - -- sessionid2pid() - - 描述: 从sessionid中得到pid信息(例如,gs_session_stat中sessid列)。 - - 返回值类型: int8 - - 示例: - - ```sql - MogDB=# select sessionid2pid(sessid::cstring) from gs_session_stat limit 2; - sessionid2pid - ----------------- - 139973107902208 - 139973107902208 - (2 rows) - ``` - -- pg_trigger_depth() - - 描述:触发器的嵌套层次。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# SELECT pg_trigger_depth(); - pg_trigger_depth - ------------------ - 0 - (1 row) - ``` - -- session_user - - 描述:会话用户名。 - - 返回值类型:name - - 示例: - - ```sql - MogDB=# SELECT session_user; - session_user - -------------- - omm - (1 row) - ``` - - 备注:session_user通常是连接当前数据库的初始用户,不过系统管理员可以用[SET SESSION AUTHORIZATION](SET-SESSION-AUTHORIZATION)修改这个设置。 - -- user - - 描述:等价于current_user。 - - 返回值类型:name - - 示例: - - ```sql - MogDB=# SELECT user; - current_user - -------------- - omm - (1 row) - ``` - -- getpgusername() - - 描述:获取数据库用户名。 - - 返回值类型:name - - 示例: - - ```sql - MogDB=# select getpgusername(); - getpgusername - --------------- - GaussDB_userna - (1 row) - ``` - -- getdatabaseencoding() - - 描述:获取数据库编码方式。 - - 返回值类型:name - - 示例: - - ```sql - MogDB=# select getdatabaseencoding(); - getdatabaseencoding - --------------------- - SQL_ASCII - (1 row) - ``` - -- version() - - 描述:版本信息。version返回一个描述服务器版本信息的字符串。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# select version(); - version - ------------------------------------------------------------------------------------------------------------------------------------------------------------- - (mogdb 2.1.1 build 24abfc73) compiled at 2021-04-16 19:39:59 commit 0 last mr 305 debug on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit - (1 row) - ``` - -- opengauss_version() - - 描述:openGauss内核版本信息。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# select opengauss_version(); - opengauss_version - ------------------- - 2.1.0 - (1 row) - ``` - -- gs_deployment() - - 描述:当前系统的部署形态信息。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# select gs_deployment(); - gs_deployment - ----------------------- - OpenSourceCentralized - (1 row) - ``` - -- get_hostname() - - 描述:返回当前节点的hostname。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT get_hostname(); - get_hostname - -------------- - linux-user - (1 row) - ``` - -- get_nodename() - - 描述:返回当前节点的名字。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT get_nodename(); - get_nodename - -------------- - datanode1 - (1 row) - ``` - -- get_schema_oid(cstring) - - 描述:返回查询schema的oid。 - - 返回值类型:oid - - 示例: - - ```sql - MogDB=# SELECT get_schema_oid('public'); - get_schema_oid - ---------------- - 2200 - (1 row) - ``` - -- get_client_info() - - 描述:返回客户端信息。 - - 返回值类型:record - -## 访问权限查询函数 - -DDL类权限ALTER、DROP、COMMENT、INDEX、VACUUM属于所有者固有的权限,隐式拥有。 - -- has_any_column_privilege(user, table, privilege) - - 描述:指定用户是否有访问表任何列的权限。 - - **表 1** 参数类型说明 - - | 参数名 | 合法入参类型 | - | :-------- | :----------- | - | user | name, oid | - | table | text, oid | - | privilege | text | - - 返回类型:Boolean - -- has_any_column_privilege(table, privilege) - - 描述:当前用户是否有访问表任何列的权限,合法参数类型见表1。 - - 返回类型:Boolean - - 备注:has_any_column_privilege检查用户是否以特定方式访问表的任何列。其参数可能与has_table_privilege类似,除了访问权限类型必须是SELECT、INSERT、UPDATE、COMMENT或REFERENCES的一些组合。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 拥有表的表级别权限则隐含的拥有该表每列的列级权限,因此如果与has_table_privilege参数相同,has_any_column_privilege总是返回true。但是如果授予至少一列的列级权限也返回成功。 - -- has_column_privilege(user, table, column, privilege) - - 描述:指定用户是否有访问列的权限。 - - **表 2** 参数类型说明 - - | 参数名 | 合法入参类型 | - | :-------- | :------------- | - | user | name, oid | - | table | text, oid | - | column | text, smallint | - | privilege | text | - - 返回类型:Boolean - -- has_column_privilege(table, column, privilege) - - 描述:当前用户是否有访问列的权限,合法参数类型见表2。 - - 返回类型:Boolean - - 备注:has_column_privilege检查用户是否以特定方式访问一列。其参数类似于has_table_privilege,可以通过列名或属性号添加列。想要的访问权限类型必须是SELECT、INSERT、UPDATE、COMMENT或REFERENCES的一些组合。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 拥有表的表级别权限则隐含的拥有该表每列的列级权限。 - -- has_cek_privilege(user, cek, privilege) - - 描述:指定用户是否有访问列加密密钥CEK的权限。参数说明如下。 - - **表 3** 参数类型说明 - - | 参数名 | 合法入参类型 | 描述 | 取值范围 | - | :-------- | :----------- | :--------- | :----------------------------------------------------------- | - | user | name,oid | 用户 | 用户名字或id。 | - | cek | text,oid | 列加密密钥 | 列加密密钥名称或id。 | - | privilege | text | 权限 | USAGE:允许使用指定列加密密钥。DROP:允许删除指定列加密密钥。 | - - 返回类型:Boolean - -- has_cmk_privilege(user, cmk, privilege) - - 描述:指定用户是否有访问客户端加密主密钥CMK的权限。参数说明如下。 - - **表 4** 参数类型说明 - - | 参数名 | 合法入参类型 | 描述 | 取值范围 | - | :-------- | :----------- | :--------------- | :----------------------------------------------------------- | - | user | name,oid | 用户 | 用户名字或id。 | - | cmk | text,oid | 客户端加密主密钥 | 客户端加密主密钥名称或id。 | - | privilege | text | 权限 | USAGE:允许使用指定客户端加密主密钥。DROP:允许删除指定客户端加密主密钥。 | - - 返回类型:Boolean - -- has_database_privilege(user, database, privilege) - - 描述:指定用户是否有访问数据库的权限。参数说明如下。 - - **表 5** 参数类型说明 - - | 参数名 | 合法入参类型 | - | :-------- | :----------- | - | user | name, oid | - | database | text, oid | - | privilege | text | - - 返回类型:Boolean - -- has_database_privilege(database, privilege) - - 描述:当前用户是否有访问数据库的权限,合法参数类型请参见表5。 - - 返回类型:Boolean - - 备注:has_database_privilege检查用户是否能以在特定方式访问数据库。其参数类似has_table_privilege。访问权限类型必须是CREATE、CONNECT、TEMPORARY、ALTER、DROP、COMMENT或TEMP(等价于TEMPORARY)的一些组合。 - -- has_directory_privilege(user, directory, privilege) - - 描述:指定用户是否有访问directory的权限。 - - **表 6** 参数类型说明 - - | 参数名 | 合法入参类型 | - | :-------- | :----------- | - | user | name, oid | - | directory | text, oid | - | privilege | text | - - 返回类型:Boolean - -- has_directory_privilege(directory, privilege) - - 描述:当前用户是否有访问directory的权限,合法参数类型请参见表6。 - - 返回类型:Boolean - -- has_foreign_data_wrapper_privilege(user, fdw, privilege) - - 描述:指定用户是否有访问外部数据封装器的权限。 - - **表 7** 参数类型说明 - - | 参数名 | 合法入参类型 | - | :-------- | :----------- | - | user | name, oid | - | fdw | text, oid | - | privilege | text | - - 返回类型:Boolean - -- has_foreign_data_wrapper_privilege(fdw, privilege) - - 描述:当前用户是否有访问外部数据封装器的权限。合法参数类型请参见表7。 - - 返回类型:Boolean - - 备注:has_foreign_data_wrapper_privilege检查用户是否能以特定方式访问外部数据封装器。其参数类似has_table_privilege。访问权限类型必须是USAGE。 - -- has_function_privilege(user, function, privilege) - - 描述:指定用户是否有访问函数的权限。 - - **表 8** 参数类型说明 - - | 参数名 | 合法入参类型 | - | :-------- | :----------- | - | user | name, oid | - | function | text, oid | - | privilege | text | - - 返回类型:Boolean - -- has_function_privilege(function, privilege) - - 描述:当前用户是否有访问函数的权限。合法参数类型请参见表8。 - - 返回类型:Boolean - - 备注:has_function_privilege检查一个用户是否能以指定方式访问一个函数。其参数类似has_table_privilege。使用文本字符而不是OID声明一个函数时,允许输入的类型和regprocedure数据类型一样(请参考[对象标识符类型](14-object-identifier-types))。访问权限类型必须是EXECUTE、ALTER、DROP或COMMENT。 - -- has_language_privilege(user, language, privilege) - - 描述:指定用户是否有访问语言的权限。 - - **表 9** 参数类型说明 - - | 参数名 | 合法入参类型 | - | :-------- | :----------- | - | user | name, oid | - | language | text, oid | - | privilege | text | - - 返回类型:Boolean - -- has_language_privilege(language, privilege) - - 描述:当前用户是否有访问语言的权限。合法参数类型请参见表9。 - - 返回类型:Boolean - - 备注:has_language_privilege检查用户是否能以特定方式访问一个过程语言。其参数类似has_table_privilege。访问权限类型必须是USAGE。 - -- has_nodegroup_privilege(user, nodegroup, privilege) - - 描述:检查用户是否有数据库节点访问权限。 - - 返回类型:Boolean - - **表 10** 参数类型说明 - - | 参数名 | 合法入参类型 | - | :-------- | :----------- | - | user | name, oid | - | nodegroup | text, oid | - | privilege | text | - -- has_nodegroup_privilege(nodegroup, privilege) - - 描述:检查用户是否有数据库节点访问权限。参数与has_table_privilege类似。访问权限类型必须是USAGE、CREATE、COMPUTE、ALTER或CROP。 - - 返回类型:Boolean - -- has_schema_privilege(user, schema, privilege) - - 描述:指定用户是否有访问模式的权限。 - - 返回类型:Boolean - -- has_schema_privilege(schema, privilege) - - 描述:当前用户是否有访问模式的权限。 - - 返回类型:Boolean - - 备注:has_schema_privilege检查用户是否能以特定方式访问一个模式。其参数类似has_table_privilege。访问权限类型必须是CREATE、USAGE、ALTER、DROP或COMMENT的一些组合。 - -- has_server_privilege(user, server, privilege) - - 描述:指定用户是否有访问外部服务的权限。 - - 返回类型:Boolean - -- has_server_privilege(server, privilege) - - 描述:当前用户是否有访问外部服务的权限。 - - 返回类型:Boolean - - 备注:has_server_privilege检查用户是否能以指定方式访问一个外部服务器。其参数类似has_table_privilege。访问权限类型必须是USAGE、ALTER、DROP或COMMENT之一的值。 - -- has_table_privilege(user, table, privilege) - - 描述:指定用户是否有访问表的权限。 - - 返回类型:Boolean - -- has_table_privilege(table, privilege) - - 描述:当前用户是否有访问表的权限。 - - 返回类型:Boolean - - 备注:has_table_privilege检查用户是否以特定方式访问表。用户可以通过名称或OID(pg_authid.oid)来指定,public表明PUBLIC伪角色,或如果缺省该参数,则使用current_user。该表可以通过名称或者OID声明。如果用名称声明,则在必要时可以用模式进行修饰。如果使用文本字符串来声明所希望的权限类型,这个文本字符串必须是SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、TRIGGER、ALTER、DROP、COMMENT、INDEX或VACUUM之一的值。可以给权限类型添加WITH GRANT OPTION,用来测试权限是否拥有授权选项。也可以用逗号分隔列出的多个权限类型,如果拥有任何所列出的权限,则结果便为true。 - - 示例: - - ```sql - MogDB=# SELECT has_table_privilege('tpcds.web_site', 'select'); - has_table_privilege - --------------------- - t - (1 row) - - MogDB=# SELECT has_table_privilege('omm', 'tpcds.web_site', 'select,INSERT WITH GRANT OPTION '); - has_table_privilege - --------------------- - t - (1 row) - ``` - -- has_tablespace_privilege(user, tablespace, privilege) - - 描述:指定用户是否有访问表空间的权限。 - - 返回类型:Boolean - -- has_tablespace_privilege(tablespace, privilege) - - 描述:当前用户是否有访问表空间的权限。 - - 返回类型:Boolean - - 备注:has_tablespace_privilege检查用户是否能以特定方式访问一个表空间。其参数类似has_table_privilege。访问权限类型必须是CREATE、ALTER、DROP或COMMENT之一的值。 - -- pg_has_role(user, role, privilege) - - 描述:指定用户是否有角色的权限。 - - 返回类型:Boolean - -- pg_has_role(role, privilege) - - 描述:当前用户是否有角色的权限。 - - 返回类型:Boolean - - 备注:pg_has_role检查用户是否能以特定方式访问一个角色。其参数类似has_table_privilege,除了public不能用做用户名。访问权限类型必须是MEMBER或USAGE的一些组合。 MEMBER表示的是角色中的直接或间接成员关系(也就是SET ROLE的权限),而USAGE表示无需通过SET ROLE也直接拥有角色的使用权限。 - -- has_any_privilege(user, privilege) - - 描述:指定用户是否有某项ANY权限,若同时查询多个权限,只要具有其中一个则返回true。 - - 返回类型:Boolean - - **表 11** 参数类型说明 - - | 参数名 | 合法入参类型 | 描述 | 取值范围 | - | :-------- | :----------- | :------ | :----------------------------------------------------------- | - | user | name | 用户 | 已存在的用户名。 | - | privilege | text | ANY权限 | 可选取值:
CREATE ANY TABLE [WITH ADMIN OPTION]
ALTER ANY TABLE [WITH ADMIN OPTION]
DROP ANY TABLE [WITH ADMIN OPTION]
SELECT ANY TABLE [WITH ADMIN OPTION]
INSERT ANY TABLE [WITH ADMIN OPTION]
UPDATE ANY TABLE [WITH ADMIN OPTION]
DELETE ANY TABLE [WITH ADMIN OPTION]
CREATE ANY SEQUENCE [WITH ADMIN OPTION]
CREATE ANY INDEX [WITH ADMIN OPTION]
CREATE ANY FUNCTION [WITH ADMIN OPTION]
EXECUTE ANY FUNCTION [WITH ADMIN OPTION]
CREATE ANY PACKAGE [WITH ADMIN OPTION]
EXECUTE ANY PACKAGE [WITH ADMIN OPTION]
CREATE ANY TYPE [WITH ADMIN OPTION] | - -## 模式可见性查询函数 - -每个函数执行检查数据库对象类型的可见性。对于函数和操作符,如果在前面的搜索路径中没有相同的对象名称和参数的数据类型,则此对象是可见的。对于操作符类,则要同时考虑名称和相关索引的访问方法。 - -所有这些函数都需要使用OID来标识要需要检查的对象。如果用户想通过名称测试对象,则使用OID别名类型(regclass、regtype、regprocedure、regoperator、regconfig或regdictionary)将会很方便。 - -比如,如果一个表所在的模式在搜索路径中,并且在前面的搜索路径中没有同名的表,则这个表是可见的。它等效于表可以不带明确模式修饰进行引用。比如,要列出所有可见表的名称: - -```sql -MogDB=# SELECT relname FROM pg_class WHERE pg_table_is_visible(oid); -``` - -- pg_collation_is_visible(collation_oid) - - 描述:该排序是否在搜索路径中可见。 - - 返回类型:Boolean - -- pg_conversion_is_visible(conversion_oid) - - 描述:该转换是否在搜索路径中可见。 - - 返回类型:Boolean - -- pg_function_is_visible(function_oid) - - 描述:该函数是否在搜索路径中可见。 - - 返回类型:Boolean - -- pg_opclass_is_visible(opclass_oid) - - 描述:该操作符类是否在搜索路径中可见。 - - 返回类型:Boolean - -- pg_operator_is_visible(operator_oid) - - 描述:该操作符是否在搜索路径中可见。 - - 返回类型:Boolean - -- pg_opfamily_is_visible(opclass_oid) - - 描述:该操作符族是否在搜索路径中可见。 - - 返回类型:Boolean - -- pg_table_is_visible(table_oid) - - 描述:该表是否在搜索路径中可见。 - - 返回类型:Boolean - -- pg_ts_config_is_visible(config_oid) - - 描述:该文本检索配置是否在搜索路径中可见。 - - 返回类型:Boolean - -- pg_ts_dict_is_visible(dict_oid) - - 描述:该文本检索词典是否在搜索路径中可见。 - - 返回类型:Boolean - -- pg_ts_parser_is_visible(parser_oid) - - 描述:该文本搜索解析是否在搜索路径中可见。 - - 返回类型:Boolean - -- pg_ts_template_is_visible(template_oid) - - 描述:该文本检索模板是否在搜索路径中可见。 - - 返回类型:Boolean - -- pg_type_is_visible(type_oid) - - 描述:该类型(或域)是否在搜索路径中可见。 - - 返回类型:Boolean - -## 系统表信息函数 - -- format_type(type_oid, typemod) - - 描述:获取数据类型的SQL名称。 - - 返回类型:text - - 备注:format_type通过某个数据类型的类型OID以及可能的类型修饰词,返回其SQL名称。如果不知道具体的修饰词,则在类型修饰词的位置传入NULL。类型修饰词一般只对有长度限制的数据类型有意义。format_type所返回的SQL名称中包含数据类型的长度值,其大小是:实际存储长度len - sizeof(int32),单位字节。原因是数据存储时需要32位的空间来存储用户对数据类型的自定义长度信息,即实际存储长度要比用户定义长度多4个字节。在下例中,format_type返回的SQL名称为“character varying(6)”,6表示varchar类型的长度值是6字节,因此该类型的实际存储长度为10字节。 - - ```sql - MogDB=# SELECT format_type((SELECT oid FROM pg_type WHERE typname='varchar'), 10); - format_type - ---------------------- - character varying(6) - (1 row) - ``` - -- getdistributekey(table_name) - - 描述:获取一个hash表的分布列。单机环境下不支持分布,该函数返回为空。 - -- pg_check_authid(role_oid) - - 描述:检查是否存在给定oid的角色名。 - - 返回类型:bool - - 示例: - - ```sql - MogDB=# select pg_check_authid(1); - pg_check_authid - ----------------- - f - (1 row) - ``` - -- pg_describe_object(catalog_id, object_id, object_sub_id) - - 描述:获取数据库对象的描述。 - - 返回类型:text - - 备注:pg_describe_object返回由目录OID,对象OID和一个(或许0个)子对象ID指定的数据库对象的描述。这有助于确认存储在pg_depend系统表中对象的身份。 - -- pg_get_constraintdef(constraint_oid) - - 描述:获取约束的定义。 - - 返回类型:text - -- pg_get_constraintdef(constraint_oid, pretty_bool) - - 描述:获取约束的定义。 - - 返回类型:text - - 备注:pg_get_constraintdef和pg_get_indexdef分别从约束或索引上使用创建命令进行重构。 - -- pg_get_expr(pg_node_tree, relation_oid) - - 描述:反编译表达式的内部形式,假设其中的任何Vars都引用第二个参数指定的关系。 - - 返回类型:text - -- pg_get_expr(pg_node_tree, relation_oid, pretty_bool) - - 描述:反编译表达式的内部形式,假设其中的任何Vars都引用第二个参数指定的关系。 - - 返回类型:text - - 备注:pg_get_expr反编译一个独立表达式的内部形式,比如一个字段的缺省值。在检查系统表的内容的时候很有用。如果表达式可能包含关键字,则指定他们引用相关的OID作为第二个参数;如果没有关键字,零就足够了。 - -- pg_get_functiondef(func_oid) - - 描述:获取函数的定义。 - - 返回类型:text - - 示例: - - ```sql - MogDB=# select * from pg_get_functiondef(598); - headerlines | definition - -------------+---------------------------------------------------- - 4 | CREATE OR REPLACE FUNCTION pg_catalog.abbrev(inet)+ - | RETURNS text + - | LANGUAGE internal + - | IMMUTABLE STRICT NOT FENCED NOT SHIPPABLE + - | AS $function$inet_abbrev$function$ + - | - (1 row) - ``` - -- pg_get_function_arguments(func_oid) - - 描述:获取函数定义的参数列表(带默认值)。 - - 返回类型:text - - 备注:pg_get_function_arguments返回一个函数的参数列表,需要在CREATE FUNCTION中使用这种格式。 - -- pg_get_function_identity_arguments(func_oid) - - 描述:获取参数列表来确定一个函数(不带默认值)。 - - 返回类型:text - - 备注:pg_get_function_identity_arguments返回需要的参数列表用来标识函数,这种形式需要在ALTER FUNCTION中使用,并且这种形式省略了默认值。 - -- pg_get_function_result(func_oid) - - 描述:获取函数的RETURNS子句。 - - 返回类型:text - - 备注:pg_get_function_result为函数返回适当的RETURNS子句。 - -- pg_get_indexdef(index_oid) - - 描述:获取索引的CREATE INDEX命令。 - - 返回类型:text - - 示例: - - ```sql - MogDB=# select * from pg_get_indexdef(16416); - pg_get_indexdef - ------------------------------------------------------------------------- - CREATE INDEX test3_b_idx ON test3 USING btree (b) TABLESPACE pg_default - (1 row) - ``` - -- pg_get_indexdef(index_oid, dump_schema_only) - - 描述:获取索引的CREATE INDEX命令,仅用于dump场景。对于包含local索引的间隔分区表,当dump_schema_only为true时,返回的创建索引语句中不包含自动创建的分区的local索引信息;当dump_schema_only为false时,返回的创建索引语句中包含自动创建的分区的local索引信息。对于非间隔分区表或者不包含local索引的间隔分区分区表,dump_schema_only参数取值不影响函数返回结果。 - - 返回类型:text - - 示例: - - ```sql - MogDB=# CREATE TABLE sales - mogdb-# (prod_id NUMBER(6), - MogDB(# cust_id NUMBER, - MogDB(# time_id DATE, - MogDB(# channel_id CHAR(1), - MogDB(# promo_id NUMBER(6), - MogDB(# quantity_sold NUMBER(3), - MogDB(# amount_sold NUMBER(10,2) - MogDB(# ) - PARTITION BY RANGE( time_id) INTERVAL('1 day') - mogdb-# mogdb-# ( - MogDB(# partition p1 VALUES LESS THAN ('2019-02-01 00:00:00'), - MogDB(# partition p2 VALUES LESS THAN ('2019-02-02 00:00:00') - MogDB(# ); - CREATE TABLE - MogDB=# create index index_sales on sales(prod_id) local (PARTITION idx_p1 ,PARTITION idx_p2); - CREATE INDEX - MogDB=# -- 插入数据没有匹配的分区,新创建一个分区,并将数据插入该分区 - MogDB=# INSERT INTO sales VALUES(1, 12, '2019-02-05 00:00:00', 'a', 1, 1, 1); - INSERT 0 1 - MogDB=# select oid from pg_class where relname = 'index_sales'; - oid - ------- - 24632 - (1 row) - MogDB=# select * from pg_get_indexdef(24632, true); - pg_get_indexdef - -------------------------------------------------------------------------------------------------------------------------- - CREATE INDEX index_sales ON sales USING btree (prod_id) LOCAL(PARTITION idx_p1, PARTITION idx_p2) TABLESPACE pg_default - (1 row) - MogDB=# select * from pg_get_indexdef(24632, false); - pg_get_indexdef - - ------------------------------------------------------------------------------------------------------------------------------------ - -------------------- - CREATE INDEX index_sales ON sales USING btree (prod_id) LOCAL(PARTITION idx_p1, PARTITION idx_p2, PARTITION sys_p1_prod_id_idx) TA - BLESPACE pg_default - (1 row - ``` - -- pg_get_indexdef(index_oid, column_no, pretty_bool) - - 描述:获取索引的CREATE INDEX命令,或者如果column_no不为零,则只获取一个索引字段的定义。 - - 示例: - - ```sql - MogDB=# select * from pg_get_indexdef(16416, 0, false); - pg_get_indexdef - ------------------------------------------------------------------------- - CREATE INDEX test3_b_idx ON test3 USING btree (b) TABLESPACE pg_default - (1 row) - MogDB=# select * from pg_get_indexdef(16416, 1, false); - pg_get_indexdef - ----------------- - b - (1 row) - ``` - - 返回类型:text - - 备注:pg_get_functiondef为函数返回一个完整的CREATE OR REPLACE FUNCTION语句。 - -- pg_get_keywords() - - 描述:获取SQL关键字和类别列表。 - - 返回类型:setof record - - 备注:pg_get_keywords返回一组关于描述服务器识别SQL关键字的记录。word列包含关键字。catcode列包含一个分类代码:U表示通用的,C表示列名,T表示类型或函数名,或R表示保留。catdesc列包含了一个可能本地化描述分类的字符串。 - -- pg_get_userbyid(role_oid) - - 描述:获取给定OID的角色名。 - - 返回类型:name - - 备注:pg_get_userbyid通过角色的OID抽取对应的用户名。 - -- pg_check_authid(role_id) - - 描述:通过role_id检查用户是否存在。 - - 返回类型:text - - 示例: - - ```sql - MogDB=# select pg_check_authid(20); - pg_check_authid - ----------------- - f - (1 row) - ``` - -- pg_get_viewdef(view_name) - - 描述:为视图获取底层的SELECT命令。 - - 返回类型:text - -- pg_get_viewdef(view_name, pretty_bool) - - 描述:为视图获取底层的SELECT命令,如果pretty_bool为true,行字段可以包含80列。 - - 返回类型:text - - 备注:pg_get_viewdef重构出定义视图的SELECT查询。这些函数大多数都有两种形式,其中带有pretty_bool参数,且参数为true时,是”适合打印”的结果,这种格式更容易读。另一种是缺省的格式,更有可能被将来的不同版本用同样的方法解释。如果是用于转储,那么尽可能避免使用适合打印的格式。给pretty-print参数传递false生成的结果和没有这个参数的变种生成的结果是完全一样。 - -- pg_get_viewdef(view_oid) - - 描述:为视图获取底层的SELECT命令。 - - 返回类型:text - -- pg_get_viewdef(view_oid, pretty_bool) - - 描述:为视图获取底层的SELECT命令,如果pretty_bool为true,行字段可以包含80列。 - - 返回类型:text - -- pg_get_viewdef(view_oid, wrap_column_int) - - 描述:为视图获取底层的SELECT命令;行字段被换到指定的列数,打印是隐含的。 - - 返回类型:text - -- pg_get_tabledef(table_oid) - - 描述:根据table_oid获取表定义 - - 示例: - - ```sql - MogDB=# select * from pg_get_tabledef(16384); - pg_get_tabledef - ------------------------------------------------------- - SET search_path = public; + - CREATE TABLE t1 ( + - c1 bigint DEFAULT nextval('serial'::regclass)+ - ) + - WITH (orientation=row, compression=no) + - TO GROUP group1; - (1 row) - ``` - - 返回类型:text - -- pg_get_tabledef(table_name) - - 描述:根据table_name获取表定义。 - - 示例: - - ```sql - MogDB=# select * from pg_get_tabledef('t1'); - pg_get_tabledef - ------------------------------------------------------- - SET search_path = public; + - CREATE TABLE t1 ( + - c1 bigint DEFAULT nextval('serial'::regclass)+ - ) + - WITH (orientation=row, compression=no) + - TO GROUP group1; - (1 row) - ``` - - 返回类型:text - - 备注:pg_get_tabledef重构出表定义的CREATE语句,包含了表定义本身、索引信息、comments信息。对于表对象依赖的group、schema、tablespace、server等信息,需要用户自己去创建,表定义里不会有这些对象的创建语句。 - -- pg_options_to_table(reloptions) - - 描述:获取存储选项名称/值对的集合。 - - 返回类型:setof record - - 备注:pg_options_to_table当通过pg_class.reloptions或pg_attribute.attoptions时返回存储选项名称/值对(option_name/option_value)的集合。 - -- pg_tablespace_databases(tablespace_oid) - - 描述:获取在指定的表空间中有对象的数据库OID集合。 - - 返回类型:setof oid - - 备注:pg_tablespace_databases允许检查表空间的状况,返回在该表空间中保存了对象的数据库OID集合。如果这个函数返回数据行,则该表空间就是非空的,因此不能删除。要显示该表空间中的特定对象,用户需要连接pg_tablespace_databases标识的数据库与查询pg_class系统表。 - -- pg_tablespace_location(tablespace_oid) - - 描述:获取表空间所在的文件系统的路径。 - - 返回类型:text - -- pg_typeof(any) - - 描述:获取任何值的数据类型。 - - 返回类型:regtype - - 备注:pg_typeof返回传递给他的值的数据类型OID。这可能有助于故障排除或动态构造SQL查询。声明此函数返回regtype,这是一个OID别名类型(请参考[对象标识符类型](14-object-identifier-types));这意味着它是一个为了比较而显示类型名称的OID。 - - 示例: - - ```sql - MogDB=# SELECT pg_typeof(33); - pg_typeof - ----------- - integer - (1 row) - - MogDB=# SELECT typlen FROM pg_type WHERE oid = pg_typeof(33); - typlen - -------- - 4 - (1 row) - ``` - -- collation for (any) - - 描述:获取参数的排序。 - - 返回类型:text - - 备注:表达式collation for返回传递给他的值的排序。 - - 示例: - - ```sql - MogDB=# SELECT collation for (description) FROM pg_description LIMIT 1; - pg_collation_for - ------------------ - "default" - (1 row) - ``` - - 值可能是引号括起来的并且模式限制的。如果没有为参数表达式排序,则返回一个null值。如果参数不是排序的类型,则抛出一个错误。 - -- pg_extension_update_paths(name) - - 描述:返回指定扩展的版本更新路径。 - - 返回类型:text(source text), text(path text), text(target text) - -- pg_get_serial_sequence(tablename, colname) - - 描述:获取对应表名和列名上的序列。 - - 返回类型:text - - 示例: - - ```sql - MogDB=# select * from pg_get_serial_sequence('t1', 'c1'); - pg_get_serial_sequence - ------------------------ - public.serial - (1 row) - ``` - -- pg_sequence_parameters(sequence_oid) - - 描述:获取指定sequence的参数,包含起始值,最小值和最大值,递增值等。 - - 返回类型:int16, int16,int16, bigint, Boolean - - 示例: - - ```sql - MogDB=# select * from pg_sequence_parameters(16420); - start_value | minimum_value | maximum_value | increment | cycle_option - -------------+---------------+---------------------+-----------+-------------- - 101 | 1 | 9223372036854775807 | 1 | f - (1 row) - ``` - -## 注释信息函数 - -- col_description(table_oid, column_number) - - 描述:获取一个表字段的注释 - - 返回类型:text - - 备注:col_description返回一个表中字段的注释,通过表OID和字段号来声明。 - -- obj_description(object_oid, catalog_name) - - 描述:获取一个数据库对象的注释 - - 返回类型:text - - 备注:带有两个参数的obj_description返回一个数据库对象的注释,该对象是通过其OID和其所属的系统表名称声明。比如,obj_description(123456,'pg_class')将返回OID为123456的表的注释。只带一个参数的obj_description只要求对象OID。 - - obj_description不能用于表字段,因为字段没有自己的OID。 - -- obj_description(object_oid) - - 描述:获取一个数据库对象的注释 - - 返回类型:text - -- shobj_description(object_oid, catalog_name) - - 描述:获取一个共享数据库对象的注释 - - 返回类型:text - - 备注:shobj_description和obj_description差不多,不同之处仅在于前者用于共享对象。一些系统表是通用于MogDB中所有数据库的全局表,因此这些表的注释也是全局存储的。 - -## 事务ID和快照 - -内部事务ID类型(xid)是64位。这些函数使用的数据类型txid_snapshot,存储在特定时刻事务ID可见性的信息。其组件描述在表11。 - -**表 12** 快照组件 - -| 名称 | 描述 | -| :------- | :----------------------------------------------------------- | -| xmin | 最早的事务ID(txid)仍然活动。所有较早事务将是已经提交可见的,或者是直接回滚。 | -| xmax | 作为尚未分配的txid。所有大于或等于此txids的都是尚未开始的快照时间,因此不可见。 | -| xip_list | 当前快照中活动的txids。这个列表只包含在xmin和xmax之间活动的txids;有可能活动的txids高于xmax。介于大于等于xmin、小于xmax,并且不在这个列表中的txid,在这个时间快照已经完成的,因此按照提交状态查看他是可见还是回滚。这个列表不包含子事务的txids。 | - -txid_snapshot的文本表示为:xmin:xmax:xip_list。 - -示例:10:20:10,14,15意思为:xmin=10, xmax=20, xip_list=10, 14, 15。 - -以下的函数在一个输出形式中提供服务器事务信息。这些函数的主要用途是为了确定在两个快照之间有哪个事务提交。 - -- txid_current() - - 描述:获取当前事务ID。 - - 返回类型:bigint - -- gs\_txid\_oldestxmin\(\) - - 描述:获取当前最小事务id的值oldesxmin。 - - 返回类型:bigint - -- txid_current_snapshot() - - 描述:获取当前快照。 - - 返回类型:txid_snapshot - -- txid_snapshot_xip(txid_snapshot) - - 描述:在快照中获取正在进行的事务ID。 - - 返回类型:setof bigint - -- txid_snapshot_xmax(txid_snapshot) - - 描述:获取快照的xmax。 - - 返回类型:bigint - -- txid_snapshot_xmin(txid_snapshot) - - 描述:获取快照的xmin。 - - 返回类型:bigint - -- txid_visible_in_snapshot(bigint, txid_snapshot) - - 描述:在快照中事务ID是否可见(不使用子事务ID)。 - - 返回类型:Boolean - -- get_local_prepared_xact() - - 描述:获取当前节点两阶段残留事务信息,包括事务id,两阶段gid名称,prepared的时间,owner的oid,database的oid及当前节点的node_name。 - - 返回类型:xid, text, timestamptz, oid, oid,text - -- get_remote_prepared_xacts() - - 描述:获取所有远程节点两阶段残留事务信息,包括事务id,两阶段gid名称,prepared的时间,owner的名称,database的名称及node_name。 - - 返回类型:xid, text, timestamptz, name, name,text - -- global_clean_prepared_xacts(text, text) - - 描述:并发清理两阶段残留事务,仅gs_clean工具可以调用清理,其他用户调用均返回false。 - - 返回类型:Boolean - -- gs_get_next_xid_csn() - - 描述:返回全局所有节点上的next_xid和next_csn值。 - - 返回值如下: - - **表 13** gs_get_next_xid_csn返回参数说明 - - | 字段名 | 描述 | - | :------- | :----------------------- | - | nodename | 节点名称。 | - | next_xid | 当前节点下一个事务id号。 | - | next_csn | 当前节点下一个csn号。 | - -- slice(hstore, text[]) - - 描述: 提取hstore的子集。 - - 返回值: hstore - - 示例: - - ```sql - MogDB=# select slice('a=>1,b=>2,c=>3'::hstore, ARRAY['b','c','x']); - slice - -------------------- - "b"=>"2", "c"=>"3" - (1 row) - ``` - -- slice_array(hstore, text[]) - - 描述:提取hstore的值的集合。 - - 返回值:值数组 - - 示例: - - ```sql - MogDB=# select slice_array('a=>1,b=>2,c=>3'::hstore, ARRAY['b','c','x']); - slice_array - ------------- - {2,3,NULL} - (1 row) - ``` - -- skeys(hstore) - - 描述:返回hstore的所有键构成的集合。 - - 返回值:键的集合。 - - 示例: - - ```sql - MogDB=# select skeys('a=>1,b=>2'); - skeys - ------- - a - b - (2 rows) - ``` - -- pg_control_system() - - 描述:返回系统控制文件状态。 - - 返回类型:SETOF record - -- pg_control_checkpoint() - - 描述:返回系统检查点状态。 - - 返回类型:SETOF record - -- pv_builtin_functions - - 描述:查看所有内置系统函数信息。 - - 参数:nan - - 返回值类型:proname name, pronamespace oid, proowner oid, prolang oid, procost real, prorows real, provariadic oid, protransform regproc, proisagg boolean, proiswindow boolean, prosecdef boolean, proleakproof boolean, proisstrict boolean, proretset boolean, provolatile “char”, pronargs smallint, pronargdefaults smallint, prorettype oid, proargtypes oidvector, proallargtypes integer[], proargmodes “char”[], proargnames text[], proargdefaults pg_node_tree, prosrc text, probin text, proconfig text[], proacl aclitem[], prodefaultargpos int2vector, fencedmode boolean, proshippable boolean, propackage boolean, oid oid - -- pv_thread_memory_detail - - 描述:返回各线程的内存信息。 - - 参数:nan - - 返回值类型:threadid text, tid bigint, thrdtype text, contextname text, level smallint, parent text, totalsize bigint, freesize bigint, usedsize bigint - -- pg_relation_compression_ratio - - 描述:查询表压缩率,默认返回1.0。 - - 参数:text - - 返回值类型:real - -- pg_relation_with_compression - - 描述:查询表是否压缩。 - - 参数:text - - 返回值类型:boolean - -- pg_stat_file_recursive - - 描述:列出路径下所有文件。 - - 参数:location text - -- pg_shared_memory_detail - - 描述:返回所有已产生的共享内存上下文的使用信息,各列描述请参考[GS_SHARED_MEMORY_DETAIL](GS_SHARED_MEMORY_DETAIL)。 - - 参数:nan - - 返回值类型:contextname text, level smallint, parent text, totalsize bigint, freesize bigint, usedsize bigint - -- get_gtm_lite_status - - 描述:返回GTM上的backupXid和csn号,用来支持问题定位,GTM-FREE模式下不支持使用本系统函数。 - -- gs_stat_get_wlm_plan_operator_info - - 描述:从内部哈希表中获取算子计划信息。 - - 参数:oid - - 返回值类型:datname text, queryid int8, plan_node_id int4, startup_time int8, total_time int8, actual_rows int8, max_peak_memory int4, query_dop int4, parent_node_id int4, left_child_id int4, right_child_id int4, operation text, orientation text, strategy text, options text, condition text, projection text - -- pg_stat_get_partition_tuples_hot_updated - - 描述:返回给定分区id的分区热更新元组数的统计。 - - 参数:oid - - 返回值类型:bigint - -- gs_session_memory_detail_tp - - 描述:返回会话的内存使用情况,参考gs_session_memory_detail。 - - 参数:nan - - 返回值类型:sessid text, sesstype text, contextname text, level smallint, parent text, totalsize bigint, freesize bigint, usedsize bigint - -- gs_thread_memory_detail - - 描述:返回各线程的内存信息。 - - 参数:nan - - 返回值类型:threadid text, tid bigint, thrdtype text, contextname text, level smallint, parent text, totalsize bigint, freesize bigint, usedsize bigint - -- pg_stat_get_wlm_realtime_operator_info - - 描述:从内部哈希表中获取实时执行计划算子信息。 - - 参数:nan - - 返回值类型:queryid bigint, pid bigint, plan_node_id integer, plan_node_name text, start_time timestamp with time zone, duration bigint, status text, query_dop integer, estimated_rows bigint, tuple_processed bigint, min_peak_memory integer, max_peak_memory integer, average_peak_memory integer, memory_skew_percent integer, min_spill_size integer, max_spill_size integer, average_spill_size integer, spill_skew_percent integer, min_cpu_time bigint, max_cpu_time bigint, total_cpu_time bigint, cpu_skew_percent integer, warning text - -- pg_stat_get_wlm_realtime_ec_operator_info - - 描述:从内部哈希表中获取EC执行计划算子信息。 - - 参数:nan - - 返回值类型:queryid bigint, plan_node_id integer, plan_node_name text, start_time timestamp with time zone, ec_operator integer, ec_status text, ec_execute_datanode text, ec_dsn text, ec_username text, ec_query text, ec_libodbc_type text, ec_fetch_count bigint - -- pg_stat_get_wlm_operator_info - - 描述:从内部哈希表中获取执行计划算子信息。 - - 参数:nan - - 返回值类型:queryid bigint, pid bigint, plan_node_id integer, plan_node_name text, start_time timestamp with time zone, duration bigint, query_dop integer, estimated_rows bigint, tuple_processed bigint, min_peak_memory integer, max_peak_memory integer, average_peak_memory integer, memory_skew_percent integer, min_spill_size integer, max_spill_size integer, average_spill_size integer, spill_skew_percent integer, min_cpu_time bigint, max_cpu_time bigint, total_cpu_time bigint, cpu_skew_percent integer, warning text - -- pg_stat_get_wlm_node_resource_info - - 描述:获取当前节点资源信息。 - - 参数:nan - - 返回值类型:min_mem_util integer, max_mem_util integer, min_cpu_util integer, max_cpu_util integer, min_io_util integer, max_io_util integer, used_mem_rate integer - -- pg_stat_get_session_wlmstat - - 描述:返回当前会话负载信息。 - - 参数:pid integer - - 返回值类型:datid oid, threadid bigint, sessionid bigint, threadpid integer, usesysid oid, appname text, query text, priority bigint, block_time bigint, elapsed_time bigint, total_cpu_time bigint, skew_percent integer, statement_mem integer, active_points integer, dop_value integer, current_cgroup text, current_status text, enqueue_state text, attribute text, is_plana boolean, node_group text, srespool name - -- pg_stat_get_wlm_ec_operator_info - - 描述:从内部哈希表中获取EC执行计划算子信息。 - - 参数:nan - - 返回值类型:queryid bigint, plan_node_id integer, plan_node_name text, start_time timestamp with time zone, duration bigint, tuple_processed bigint, min_peak_memory integer, max_peak_memory integer, average_peak_memory integer, ec_operator integer, ec_status text, ec_execute_datanode text, ec_dsn text, ec_username text, ec_query text, ec_libodbc_type text, ec_fetch_count bigint - -- pg_stat_get_wlm_instance_info - - 描述:返回当前实例负载信息。 - - 参数:nan - - 返回值类型:instancename text, timestamp timestamp with time zone, used_cpu integer, free_memory integer, used_memory integer, io_await double precision, io_util double precision, disk_read double precision, disk_write double precision, process_read bigint, process_write bigint, logical_read bigint, logical_write bigint, read_counts bigint, write_counts bigint - -- pg_stat_get_wlm_instance_info_with_cleanup - - 描述:返回当前实例负载信息,并且保存到系统表中。 - - 参数:nan - - 返回值类型:instancename text, timestamp timestamp with time zone, used_cpu integer, free_memory integer, used_memory integer, io_await double precision, io_util double precision, disk_read double precision, disk_write double precision, process_read bigint, process_write bigint, logical_read bigint, logical_write bigint, read_counts bigint, write_counts bigint - -- pg_stat_get_wlm_realtime_session_info - - 描述:返回实时会话负载信息。 - - 参数:nan - - 返回值类型:nodename text, threadid bigint, block_time bigint, duration bigint, estimate_total_time bigint, estimate_left_time bigint, schemaname text, query_band text, spill_info text, control_group text, estimate_memory integer, min_peak_memory integer, max_peak_memory integer, average_peak_memory integer, memory_skew_percent integer, min_spill_size integer, max_spill_size integer, average_spill_size integer, spill_skew_percent integer, min_dn_time bigint, max_dn_time bigint, average_dn_time bigint, dntime_skew_percent integer, min_cpu_time bigint, max_cpu_time bigint, total_cpu_time bigint, cpu_skew_percent integer, min_peak_iops integer, max_peak_iops integer, average_peak_iops integer, iops_skew_percent integer, warning text, query text, query_plan text, cpu_top1_node_name text, cpu_top2_node_name text, cpu_top3_node_name text, cpu_top4_node_name text, cpu_top5_node_name text, mem_top1_node_name text, mem_top2_node_name text, mem_top3_node_name text, mem_top4_node_name text, mem_top5_node_name text, cpu_top1_value bigint, cpu_top2_value bigint, cpu_top3_value bigint, cpu_top4_value bigint, cpu_top5_value bigint, mem_top1_value bigint, mem_top2_value bigint, mem_top3_value bigint, mem_top4_value bigint, mem_top5_value bigint, top_mem_dn text, top_cpu_dn text - -- pg_stat_get_wlm_session_iostat_info - - 描述:返回会话负载IO信息。 - - 参数:nan - - 返回值类型:threadid bigint, maxcurr_iops integer, mincurr_iops integer, maxpeak_iops integer, minpeak_iops integer, iops_limits integer, io_priority integer, curr_io_limits integer - -- pg_stat_get_wlm_statistics - - 描述:返回会话负载统计数据。 - - 参数:nan - - 返回值类型:statement text, block_time bigint, elapsed_time bigint, total_cpu_time bigint, qualification_time bigint, skew_percent integer, control_group text, status text, action text - -## 其他函数 - -- sys_guid函数 - - 描述:sys_guid生成并返回一个由16个字节组成的全球唯一标识符。生成的标识符由主机时间、线程标识符和随机值构成。 - - 示例: - - ```sql - MogDB=# select sys_guid(); - sys_guid - ---------------------------------- - 0005D3DE87AB3147177B0300B2E3FED6 - (1 row) - ``` +--- +title: 系统信息函数 +summary: 系统信息函数 +author: Zhang Cuiping +date: 2021-04-20 +--- + +# 系统信息函数 + +## 会话信息函数 + +- current_catalog + + 描述:当前数据库的名称(在标准SQL中称“catalog”)。 + + 返回值类型:name + + 示例: + + ```sql + MogDB=# SELECT current_catalog; + current_database + ------------------ + mogdb + (1 row) + ``` + +- current_database() + + 描述:当前数据库的名称。 + + 返回值类型:name + + 示例: + + ```sql + MogDB=# SELECT current_database(); + current_database + ------------------ + mogdb + (1 row) + ``` + +- current_query() + + 描述:由客户端提交的当前执行语句(可能包含多个声明)。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT current_query(); + current_query + ------------------------- + SELECT current_query(); + (1 row) + ``` + +- current_schema[()] + + 描述:当前模式的名称。 + + 返回值类型:name + + 示例: + + ```sql + MogDB=# SELECT current_schema(); + current_schema + ---------------- + public + (1 row) + ``` + + 备注:current_schema返回在搜索路径中第一个顺位有效的模式名。(如果搜索路径为空则返回NULL,没有有效的模式名也返回NULL)。如果创建表或者其他命名对象时没有声明目标模式,则将使用这些对象的模式。 + +- current_schemas(Boolean) + + 描述:搜索路径中的模式名称。 + + 返回值类型:name[] + + 示例: + + ```sql + MogDB=# SELECT current_schemas(true); + current_schemas + --------------------- + {pg_catalog,public} + (1 row) + ``` + + 备注: + + current_schemas(Boolean)返回搜索路径中所有模式名称的数组。布尔选项决定像pg_catalog这样隐含包含的系统模式是否包含在返回的搜索路径中。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 搜索路径可以通过运行时设置更改。命令是: + > + > ```sql + > SET search_path TO schema [, schema, ...] + > ``` + +- current_user + + 描述:当前执行环境下的用户名。 + + 返回值类型:name + + 示例: + + ```sql + MogDB=# SELECT current_user; + current_user + -------------- + omm + (1 row) + ``` + + 备注:current_user是用于权限检查的用户标识。通常,他表示会话用户,但是可以通过[SET ROLE](SET-ROLE)改变他。在函数执行的过程中随着属性SECURITY DEFINER的改变,其值也会改变。 + +- definer_current_user + + 描述:当前执行环境下的用户名。 + + 返回值类型:name + + 示例: + + ```sql + MogDB=# SELECT definer_current_user(); + definer_current_user + ---------------------- + omm + (1 row) + ``` + +- pg_current_sessionid() + + 描述:当前执行环境下的会话ID。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT pg_current_sessionid(); + pg_current_sessionid + ---------------------------- + 1579228402.140190434944768 + (1 row) + ``` + + 备注:pg_current_sessionid()是用于获取当前执行环境下的会话ID。其组成结构为:时间戳.会话ID,当线程池模式开启(enable_thread_pool=on)时,会话ID为SessionID;而线程池模式关闭时,会话ID为ThreadID。 + +- pg_current_sessid + + 描述:当前执行环境下的会话ID。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# select pg_current_sessid(); + pg_current_sessid + ------------------- + 140308875015936 + (1 row) + ``` + + 备注:在线程池模式下获得当前会话的会话ID,非线程池模式下获得当前会话对应的后台线程ID。 + +- pg_current_userid + + 描述:当前用户ID。 + + 返回值类型:text + + ```sql + MogDB=# SELECT pg_current_userid(); + pg_current_userid + ------------------- + 10 + (1 row) + ``` + +- working_version_num() + + 描述:版本序号信息。返回一个系统兼容性有关的版本序号。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT working_version_num(); + working_version_num + --------------------- + 92231 + (1 row) + + ``` + +- tablespace_oid_name() + + 描述: 根据表空间oid,查找表空间名称。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# select tablespace_oid_name(1663); + tablespace_oid_name + --------------------- + pg_default + (1 row) + ``` + +- inet_client_addr() + + 描述:连接的远端地址。inet_client_addr返回当前客户端的IP地址。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 此函数只有在远程连接模式下有效。 + + 返回值类型:inet + + 示例: + + ```sql + MogDB=# SELECT inet_client_addr(); + inet_client_addr + ------------------ + 10.10.0.50 + (1 row) + ``` + +- inet_client_port() + + 描述:连接的远端端口。inet_client_port返回当前客户端的端口号。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 此函数只有在远程连接模式下有效。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT inet_client_port(); + inet_client_port + ------------------ + 33143 + (1 row) + ``` + +- inet_server_addr() + + 描述:连接的本地地址。inet_server_addr返回服务器接收当前连接用的IP地址。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 此函数只有在远程连接模式下有效。 + + 返回值类型:inet + + 示例: + + ```sql + MogDB=# SELECT inet_server_addr(); + inet_server_addr + ------------------ + 10.10.0.13 + (1 row) + ``` + +- inet_server_port() + + 描述:连接的本地端口。inet_server_port返回接收当前连接的端口号。如果是通过Unix-domain socket连接的,则所有这些函数都返回NULL。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 此函数只有在远程连接模式下有效。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT inet_server_port(); + inet_server_port + ------------------ + 8000 + (1 row) + ``` + +- pg_backend_pid() + + 描述:当前会话连接的服务进程的进程ID。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT pg_backend_pid(); + pg_backend_pid + ----------------- + 140229352617744 + (1 row) + ``` + +- pg_conf_load_time() + + 描述:配置加载时间。pg_conf_load_time返回最后加载服务器配置文件的时间戳。 + + 返回值类型:timestamp with time zone + + 示例: + + ```sql + MogDB=# SELECT pg_conf_load_time(); + pg_conf_load_time + ------------------------------ + 2017-09-01 16:05:23.89868+08 + (1 row) + ``` + +- pg_my_temp_schema() + + 描述:会话的临时模式的OID,不存在则为0。 + + 返回值类型:oid + + 示例: + + ```sql + MogDB=# SELECT pg_my_temp_schema(); + pg_my_temp_schema + ------------------- + 0 + (1 row) + ``` + + 备注:pg_my_temp_schema返回当前会话中临时模式的OID,如果不存在(没有创建临时表)的话则返回0。如果给定的OID是其它会话中临时模式的OID,pg_is_other_temp_schema则返回true。 + +- pg_is_other_temp_schema(oid) + + 描述:是否为另一个会话的临时模式。 + + 返回值类型:Boolean + + 示例: + + ```sql + MogDB=# SELECT pg_is_other_temp_schema(25356); + pg_is_other_temp_schema + ------------------------- + f + (1 row) + ``` + +- pg_listening_channels() + + 描述:会话正在侦听的信道名称。 + + 返回值类型:setof text + + 示例: + + ```sql + MogDB=# SELECT pg_listening_channels(); + pg_listening_channels + ----------------------- + (0 rows) + ``` + + 备注:pg_listening_channels返回当前会话正在侦听的一组信道名称。 + +- pg_postmaster_start_time() + + 描述:服务器启动时间。pg_postmaster_start_time返回服务器启动时的timestamp with time zone。 + + 返回值类型:timestamp with time zone + + 示例: + + ```sql + MogDB=# SELECT pg_postmaster_start_time(); + pg_postmaster_start_time + ------------------------------ + 2017-08-30 16:02:54.99854+08 + (1 row) + ``` + +- pg_get_ruledef(rule_oid) + + 描述:获取规则的CREATE RULE命令。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# select * from pg_get_ruledef(24828); + pg_get_ruledef + ------------------------------------------------------------------- + CREATE RULE t1_ins AS ON INSERT TO t1 DO INSTEAD INSERT INTO t2 (id) VALUES (new.id); + (1 row) + ``` + +- sessionid2pid() + + 描述: 从sessionid中得到pid信息(例如,gs_session_stat中sessid列)。 + + 返回值类型: int8 + + 示例: + + ```sql + MogDB=# select sessionid2pid(sessid::cstring) from gs_session_stat limit 2; + sessionid2pid + ----------------- + 139973107902208 + 139973107902208 + (2 rows) + ``` + +- pg_trigger_depth() + + 描述:触发器的嵌套层次。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT pg_trigger_depth(); + pg_trigger_depth + ------------------ + 0 + (1 row) + ``` + +- session_user + + 描述:会话用户名。 + + 返回值类型:name + + 示例: + + ```sql + MogDB=# SELECT session_user; + session_user + -------------- + omm + (1 row) + ``` + + 备注:session_user通常是连接当前数据库的初始用户,不过系统管理员可以用[SET SESSION AUTHORIZATION](SET-SESSION-AUTHORIZATION)修改这个设置。 + +- user + + 描述:等价于current_user。 + + 返回值类型:name + + 示例: + + ```sql + MogDB=# SELECT user; + current_user + -------------- + omm + (1 row) + ``` + +- getpgusername() + + 描述:获取数据库用户名。 + + 返回值类型:name + + 示例: + + ```sql + MogDB=# select getpgusername(); + getpgusername + --------------- + GaussDB_userna + (1 row) + ``` + +- getdatabaseencoding() + + 描述:获取数据库编码方式。 + + 返回值类型:name + + 示例: + + ```sql + MogDB=# select getdatabaseencoding(); + getdatabaseencoding + --------------------- + SQL_ASCII + (1 row) + ``` + +- version() + + 描述:版本信息。version返回一个描述服务器版本信息的字符串。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# select version(); + version + ------------------------------------------------------------------------------------------------------------------------------------------------------------- + (mogdb 2.1.1 build 24abfc73) compiled at 2021-04-16 19:39:59 commit 0 last mr 305 debug on x86_64-unknown-linux-gnu, compiled by g++ (GCC) 7.3.0, 64-bit + (1 row) + ``` + +- opengauss_version() + + 描述:openGauss内核版本信息。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# select opengauss_version(); + opengauss_version + ------------------- + 2.1.0 + (1 row) + ``` + +- gs_deployment() + + 描述:当前系统的部署形态信息。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# select gs_deployment(); + gs_deployment + ----------------------- + OpenSourceCentralized + (1 row) + ``` + +- get_hostname() + + 描述:返回当前节点的hostname。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT get_hostname(); + get_hostname + -------------- + linux-user + (1 row) + ``` + +- get_nodename() + + 描述:返回当前节点的名字。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT get_nodename(); + get_nodename + -------------- + datanode1 + (1 row) + ``` + +- get_schema_oid(cstring) + + 描述:返回查询schema的oid。 + + 返回值类型:oid + + 示例: + + ```sql + MogDB=# SELECT get_schema_oid('public'); + get_schema_oid + ---------------- + 2200 + (1 row) + ``` + +- get_client_info() + + 描述:返回客户端信息。 + + 返回值类型:record + +## 访问权限查询函数 + +DDL类权限ALTER、DROP、COMMENT、INDEX、VACUUM属于所有者固有的权限,隐式拥有。 + +- has_any_column_privilege(user, table, privilege) + + 描述:指定用户是否有访问表任何列的权限。 + + **表 1** 参数类型说明 + + | 参数名 | 合法入参类型 | + | :-------- | :----------- | + | user | name, oid | + | table | text, oid | + | privilege | text | + + 返回类型:Boolean + +- has_any_column_privilege(table, privilege) + + 描述:当前用户是否有访问表任何列的权限,合法参数类型见表1。 + + 返回类型:Boolean + + 备注:has_any_column_privilege检查用户是否以特定方式访问表的任何列。其参数可能与has_table_privilege类似,除了访问权限类型必须是SELECT、INSERT、UPDATE、COMMENT或REFERENCES的一些组合。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 拥有表的表级别权限则隐含的拥有该表每列的列级权限,因此如果与has_table_privilege参数相同,has_any_column_privilege总是返回true。但是如果授予至少一列的列级权限也返回成功。 + +- has_column_privilege(user, table, column, privilege) + + 描述:指定用户是否有访问列的权限。 + + **表 2** 参数类型说明 + + | 参数名 | 合法入参类型 | + | :-------- | :------------- | + | user | name, oid | + | table | text, oid | + | column | text, smallint | + | privilege | text | + + 返回类型:Boolean + +- has_column_privilege(table, column, privilege) + + 描述:当前用户是否有访问列的权限,合法参数类型见表2。 + + 返回类型:Boolean + + 备注:has_column_privilege检查用户是否以特定方式访问一列。其参数类似于has_table_privilege,可以通过列名或属性号添加列。想要的访问权限类型必须是SELECT、INSERT、UPDATE、COMMENT或REFERENCES的一些组合。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 拥有表的表级别权限则隐含的拥有该表每列的列级权限。 + +- has_cek_privilege(user, cek, privilege) + + 描述:指定用户是否有访问列加密密钥CEK的权限。参数说明如下。 + + **表 3** 参数类型说明 + + | 参数名 | 合法入参类型 | 描述 | 取值范围 | + | :-------- | :----------- | :--------- | :----------------------------------------------------------- | + | user | name,oid | 用户 | 用户名字或id。 | + | cek | text,oid | 列加密密钥 | 列加密密钥名称或id。 | + | privilege | text | 权限 | USAGE:允许使用指定列加密密钥。DROP:允许删除指定列加密密钥。 | + + 返回类型:Boolean + +- has_cmk_privilege(user, cmk, privilege) + + 描述:指定用户是否有访问客户端加密主密钥CMK的权限。参数说明如下。 + + **表 4** 参数类型说明 + + | 参数名 | 合法入参类型 | 描述 | 取值范围 | + | :-------- | :----------- | :--------------- | :----------------------------------------------------------- | + | user | name,oid | 用户 | 用户名字或id。 | + | cmk | text,oid | 客户端加密主密钥 | 客户端加密主密钥名称或id。 | + | privilege | text | 权限 | USAGE:允许使用指定客户端加密主密钥。DROP:允许删除指定客户端加密主密钥。 | + + 返回类型:Boolean + +- has_database_privilege(user, database, privilege) + + 描述:指定用户是否有访问数据库的权限。参数说明如下。 + + **表 5** 参数类型说明 + + | 参数名 | 合法入参类型 | + | :-------- | :----------- | + | user | name, oid | + | database | text, oid | + | privilege | text | + + 返回类型:Boolean + +- has_database_privilege(database, privilege) + + 描述:当前用户是否有访问数据库的权限,合法参数类型请参见表5。 + + 返回类型:Boolean + + 备注:has_database_privilege检查用户是否能以在特定方式访问数据库。其参数类似has_table_privilege。访问权限类型必须是CREATE、CONNECT、TEMPORARY、ALTER、DROP、COMMENT或TEMP(等价于TEMPORARY)的一些组合。 + +- has_directory_privilege(user, directory, privilege) + + 描述:指定用户是否有访问directory的权限。 + + **表 6** 参数类型说明 + + | 参数名 | 合法入参类型 | + | :-------- | :----------- | + | user | name, oid | + | directory | text, oid | + | privilege | text | + + 返回类型:Boolean + +- has_directory_privilege(directory, privilege) + + 描述:当前用户是否有访问directory的权限,合法参数类型请参见表6。 + + 返回类型:Boolean + +- has_foreign_data_wrapper_privilege(user, fdw, privilege) + + 描述:指定用户是否有访问外部数据封装器的权限。 + + **表 7** 参数类型说明 + + | 参数名 | 合法入参类型 | + | :-------- | :----------- | + | user | name, oid | + | fdw | text, oid | + | privilege | text | + + 返回类型:Boolean + +- has_foreign_data_wrapper_privilege(fdw, privilege) + + 描述:当前用户是否有访问外部数据封装器的权限。合法参数类型请参见表7。 + + 返回类型:Boolean + + 备注:has_foreign_data_wrapper_privilege检查用户是否能以特定方式访问外部数据封装器。其参数类似has_table_privilege。访问权限类型必须是USAGE。 + +- has_function_privilege(user, function, privilege) + + 描述:指定用户是否有访问函数的权限。 + + **表 8** 参数类型说明 + + | 参数名 | 合法入参类型 | + | :-------- | :----------- | + | user | name, oid | + | function | text, oid | + | privilege | text | + + 返回类型:Boolean + +- has_function_privilege(function, privilege) + + 描述:当前用户是否有访问函数的权限。合法参数类型请参见表8。 + + 返回类型:Boolean + + 备注:has_function_privilege检查一个用户是否能以指定方式访问一个函数。其参数类似has_table_privilege。使用文本字符而不是OID声明一个函数时,允许输入的类型和regprocedure数据类型一样(请参考[对象标识符类型](14-object-identifier-types))。访问权限类型必须是EXECUTE、ALTER、DROP或COMMENT。 + +- has_language_privilege(user, language, privilege) + + 描述:指定用户是否有访问语言的权限。 + + **表 9** 参数类型说明 + + | 参数名 | 合法入参类型 | + | :-------- | :----------- | + | user | name, oid | + | language | text, oid | + | privilege | text | + + 返回类型:Boolean + +- has_language_privilege(language, privilege) + + 描述:当前用户是否有访问语言的权限。合法参数类型请参见表9。 + + 返回类型:Boolean + + 备注:has_language_privilege检查用户是否能以特定方式访问一个过程语言。其参数类似has_table_privilege。访问权限类型必须是USAGE。 + +- has_nodegroup_privilege(user, nodegroup, privilege) + + 描述:检查用户是否有数据库节点访问权限。 + + 返回类型:Boolean + + **表 10** 参数类型说明 + + | 参数名 | 合法入参类型 | + | :-------- | :----------- | + | user | name, oid | + | nodegroup | text, oid | + | privilege | text | + +- has_nodegroup_privilege(nodegroup, privilege) + + 描述:检查用户是否有数据库节点访问权限。参数与has_table_privilege类似。访问权限类型必须是USAGE、CREATE、COMPUTE、ALTER或CROP。 + + 返回类型:Boolean + +- has_schema_privilege(user, schema, privilege) + + 描述:指定用户是否有访问模式的权限。 + + 返回类型:Boolean + +- has_schema_privilege(schema, privilege) + + 描述:当前用户是否有访问模式的权限。 + + 返回类型:Boolean + + 备注:has_schema_privilege检查用户是否能以特定方式访问一个模式。其参数类似has_table_privilege。访问权限类型必须是CREATE、USAGE、ALTER、DROP或COMMENT的一些组合。 + +- has_server_privilege(user, server, privilege) + + 描述:指定用户是否有访问外部服务的权限。 + + 返回类型:Boolean + +- has_server_privilege(server, privilege) + + 描述:当前用户是否有访问外部服务的权限。 + + 返回类型:Boolean + + 备注:has_server_privilege检查用户是否能以指定方式访问一个外部服务器。其参数类似has_table_privilege。访问权限类型必须是USAGE、ALTER、DROP或COMMENT之一的值。 + +- has_table_privilege(user, table, privilege) + + 描述:指定用户是否有访问表的权限。 + + 返回类型:Boolean + +- has_table_privilege(table, privilege) + + 描述:当前用户是否有访问表的权限。 + + 返回类型:Boolean + + 备注:has_table_privilege检查用户是否以特定方式访问表。用户可以通过名称或OID(pg_authid.oid)来指定,public表明PUBLIC伪角色,或如果缺省该参数,则使用current_user。该表可以通过名称或者OID声明。如果用名称声明,则在必要时可以用模式进行修饰。如果使用文本字符串来声明所希望的权限类型,这个文本字符串必须是SELECT、INSERT、UPDATE、DELETE、TRUNCATE、REFERENCES、TRIGGER、ALTER、DROP、COMMENT、INDEX或VACUUM之一的值。可以给权限类型添加WITH GRANT OPTION,用来测试权限是否拥有授权选项。也可以用逗号分隔列出的多个权限类型,如果拥有任何所列出的权限,则结果便为true。 + + 示例: + + ```sql + MogDB=# SELECT has_table_privilege('tpcds.web_site', 'select'); + has_table_privilege + --------------------- + t + (1 row) + + MogDB=# SELECT has_table_privilege('omm', 'tpcds.web_site', 'select,INSERT WITH GRANT OPTION '); + has_table_privilege + --------------------- + t + (1 row) + ``` + +- has_tablespace_privilege(user, tablespace, privilege) + + 描述:指定用户是否有访问表空间的权限。 + + 返回类型:Boolean + +- has_tablespace_privilege(tablespace, privilege) + + 描述:当前用户是否有访问表空间的权限。 + + 返回类型:Boolean + + 备注:has_tablespace_privilege检查用户是否能以特定方式访问一个表空间。其参数类似has_table_privilege。访问权限类型必须是CREATE、ALTER、DROP或COMMENT之一的值。 + +- pg_has_role(user, role, privilege) + + 描述:指定用户是否有角色的权限。 + + 返回类型:Boolean + +- pg_has_role(role, privilege) + + 描述:当前用户是否有角色的权限。 + + 返回类型:Boolean + + 备注:pg_has_role检查用户是否能以特定方式访问一个角色。其参数类似has_table_privilege,除了public不能用做用户名。访问权限类型必须是MEMBER或USAGE的一些组合。 MEMBER表示的是角色中的直接或间接成员关系(也就是SET ROLE的权限),而USAGE表示无需通过SET ROLE也直接拥有角色的使用权限。 + +- has_any_privilege(user, privilege) + + 描述:指定用户是否有某项ANY权限,若同时查询多个权限,只要具有其中一个则返回true。 + + 返回类型:Boolean + + **表 11** 参数类型说明 + + | 参数名 | 合法入参类型 | 描述 | 取值范围 | + | :-------- | :----------- | :------ | :----------------------------------------------------------- | + | user | name | 用户 | 已存在的用户名。 | + | privilege | text | ANY权限 | 可选取值:
CREATE ANY TABLE [WITH ADMIN OPTION]
ALTER ANY TABLE [WITH ADMIN OPTION]
DROP ANY TABLE [WITH ADMIN OPTION]
SELECT ANY TABLE [WITH ADMIN OPTION]
INSERT ANY TABLE [WITH ADMIN OPTION]
UPDATE ANY TABLE [WITH ADMIN OPTION]
DELETE ANY TABLE [WITH ADMIN OPTION]
CREATE ANY SEQUENCE [WITH ADMIN OPTION]
CREATE ANY INDEX [WITH ADMIN OPTION]
CREATE ANY FUNCTION [WITH ADMIN OPTION]
EXECUTE ANY FUNCTION [WITH ADMIN OPTION]
CREATE ANY PACKAGE [WITH ADMIN OPTION]
EXECUTE ANY PACKAGE [WITH ADMIN OPTION]
CREATE ANY TYPE [WITH ADMIN OPTION] | + +## 模式可见性查询函数 + +每个函数执行检查数据库对象类型的可见性。对于函数和操作符,如果在前面的搜索路径中没有相同的对象名称和参数的数据类型,则此对象是可见的。对于操作符类,则要同时考虑名称和相关索引的访问方法。 + +所有这些函数都需要使用OID来标识要需要检查的对象。如果用户想通过名称测试对象,则使用OID别名类型(regclass、regtype、regprocedure、regoperator、regconfig或regdictionary)将会很方便。 + +比如,如果一个表所在的模式在搜索路径中,并且在前面的搜索路径中没有同名的表,则这个表是可见的。它等效于表可以不带明确模式修饰进行引用。比如,要列出所有可见表的名称: + +```sql +MogDB=# SELECT relname FROM pg_class WHERE pg_table_is_visible(oid); +``` + +- pg_collation_is_visible(collation_oid) + + 描述:该排序是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg_conversion_is_visible(conversion_oid) + + 描述:该转换是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg_function_is_visible(function_oid) + + 描述:该函数是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg_opclass_is_visible(opclass_oid) + + 描述:该操作符类是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg_operator_is_visible(operator_oid) + + 描述:该操作符是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg_opfamily_is_visible(opclass_oid) + + 描述:该操作符族是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg_table_is_visible(table_oid) + + 描述:该表是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg_ts_config_is_visible(config_oid) + + 描述:该文本检索配置是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg_ts_dict_is_visible(dict_oid) + + 描述:该文本检索词典是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg_ts_parser_is_visible(parser_oid) + + 描述:该文本搜索解析是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg_ts_template_is_visible(template_oid) + + 描述:该文本检索模板是否在搜索路径中可见。 + + 返回类型:Boolean + +- pg_type_is_visible(type_oid) + + 描述:该类型(或域)是否在搜索路径中可见。 + + 返回类型:Boolean + +## 系统表信息函数 + +- format_type(type_oid, typemod) + + 描述:获取数据类型的SQL名称。 + + 返回类型:text + + 备注:format_type通过某个数据类型的类型OID以及可能的类型修饰词,返回其SQL名称。如果不知道具体的修饰词,则在类型修饰词的位置传入NULL。类型修饰词一般只对有长度限制的数据类型有意义。format_type所返回的SQL名称中包含数据类型的长度值,其大小是:实际存储长度len - sizeof(int32),单位字节。原因是数据存储时需要32位的空间来存储用户对数据类型的自定义长度信息,即实际存储长度要比用户定义长度多4个字节。在下例中,format_type返回的SQL名称为“character varying(6)”,6表示varchar类型的长度值是6字节,因此该类型的实际存储长度为10字节。 + + ```sql + MogDB=# SELECT format_type((SELECT oid FROM pg_type WHERE typname='varchar'), 10); + format_type + ---------------------- + character varying(6) + (1 row) + ``` + +- getdistributekey(table_name) + + 描述:获取一个hash表的分布列。单机环境下不支持分布,该函数返回为空。 + +- pg_check_authid(role_oid) + + 描述:检查是否存在给定oid的角色名。 + + 返回类型:bool + + 示例: + + ```sql + MogDB=# select pg_check_authid(1); + pg_check_authid + ----------------- + f + (1 row) + ``` + +- pg_describe_object(catalog_id, object_id, object_sub_id) + + 描述:获取数据库对象的描述。 + + 返回类型:text + + 备注:pg_describe_object返回由目录OID,对象OID和一个(或许0个)子对象ID指定的数据库对象的描述。这有助于确认存储在pg_depend系统表中对象的身份。 + +- pg_get_constraintdef(constraint_oid) + + 描述:获取约束的定义。 + + 返回类型:text + +- pg_get_constraintdef(constraint_oid, pretty_bool) + + 描述:获取约束的定义。 + + 返回类型:text + + 备注:pg_get_constraintdef和pg_get_indexdef分别从约束或索引上使用创建命令进行重构。 + +- pg_get_expr(pg_node_tree, relation_oid) + + 描述:反编译表达式的内部形式,假设其中的任何Vars都引用第二个参数指定的关系。 + + 返回类型:text + +- pg_get_expr(pg_node_tree, relation_oid, pretty_bool) + + 描述:反编译表达式的内部形式,假设其中的任何Vars都引用第二个参数指定的关系。 + + 返回类型:text + + 备注:pg_get_expr反编译一个独立表达式的内部形式,比如一个字段的缺省值。在检查系统表的内容的时候很有用。如果表达式可能包含关键字,则指定他们引用相关的OID作为第二个参数;如果没有关键字,零就足够了。 + +- pg_get_functiondef(func_oid) + + 描述:获取函数的定义。 + + 返回类型:text + + 示例: + + ```sql + MogDB=# select * from pg_get_functiondef(598); + headerlines | definition + -------------+---------------------------------------------------- + 4 | CREATE OR REPLACE FUNCTION pg_catalog.abbrev(inet)+ + | RETURNS text + + | LANGUAGE internal + + | IMMUTABLE STRICT NOT FENCED NOT SHIPPABLE + + | AS $function$inet_abbrev$function$ + + | + (1 row) + ``` + +- pg_get_function_arguments(func_oid) + + 描述:获取函数定义的参数列表(带默认值)。 + + 返回类型:text + + 备注:pg_get_function_arguments返回一个函数的参数列表,需要在CREATE FUNCTION中使用这种格式。 + +- pg_get_function_identity_arguments(func_oid) + + 描述:获取参数列表来确定一个函数(不带默认值)。 + + 返回类型:text + + 备注:pg_get_function_identity_arguments返回需要的参数列表用来标识函数,这种形式需要在ALTER FUNCTION中使用,并且这种形式省略了默认值。 + +- pg_get_function_result(func_oid) + + 描述:获取函数的RETURNS子句。 + + 返回类型:text + + 备注:pg_get_function_result为函数返回适当的RETURNS子句。 + +- pg_get_indexdef(index_oid) + + 描述:获取索引的CREATE INDEX命令。 + + 返回类型:text + + 示例: + + ```sql + MogDB=# select * from pg_get_indexdef(16416); + pg_get_indexdef + ------------------------------------------------------------------------- + CREATE INDEX test3_b_idx ON test3 USING btree (b) TABLESPACE pg_default + (1 row) + ``` + +- pg_get_indexdef(index_oid, dump_schema_only) + + 描述:获取索引的CREATE INDEX命令,仅用于dump场景。对于包含local索引的间隔分区表,当dump_schema_only为true时,返回的创建索引语句中不包含自动创建的分区的local索引信息;当dump_schema_only为false时,返回的创建索引语句中包含自动创建的分区的local索引信息。对于非间隔分区表或者不包含local索引的间隔分区分区表,dump_schema_only参数取值不影响函数返回结果。 + + 返回类型:text + + 示例: + + ```sql + MogDB=# CREATE TABLE sales + mogdb-# (prod_id NUMBER(6), + MogDB(# cust_id NUMBER, + MogDB(# time_id DATE, + MogDB(# channel_id CHAR(1), + MogDB(# promo_id NUMBER(6), + MogDB(# quantity_sold NUMBER(3), + MogDB(# amount_sold NUMBER(10,2) + MogDB(# ) + PARTITION BY RANGE( time_id) INTERVAL('1 day') + mogdb-# mogdb-# ( + MogDB(# partition p1 VALUES LESS THAN ('2019-02-01 00:00:00'), + MogDB(# partition p2 VALUES LESS THAN ('2019-02-02 00:00:00') + MogDB(# ); + CREATE TABLE + MogDB=# create index index_sales on sales(prod_id) local (PARTITION idx_p1 ,PARTITION idx_p2); + CREATE INDEX + MogDB=# -- 插入数据没有匹配的分区,新创建一个分区,并将数据插入该分区 + MogDB=# INSERT INTO sales VALUES(1, 12, '2019-02-05 00:00:00', 'a', 1, 1, 1); + INSERT 0 1 + MogDB=# select oid from pg_class where relname = 'index_sales'; + oid + ------- + 24632 + (1 row) + MogDB=# select * from pg_get_indexdef(24632, true); + pg_get_indexdef + -------------------------------------------------------------------------------------------------------------------------- + CREATE INDEX index_sales ON sales USING btree (prod_id) LOCAL(PARTITION idx_p1, PARTITION idx_p2) TABLESPACE pg_default + (1 row) + MogDB=# select * from pg_get_indexdef(24632, false); + pg_get_indexdef + + ------------------------------------------------------------------------------------------------------------------------------------ + -------------------- + CREATE INDEX index_sales ON sales USING btree (prod_id) LOCAL(PARTITION idx_p1, PARTITION idx_p2, PARTITION sys_p1_prod_id_idx) TA + BLESPACE pg_default + (1 row + ``` + +- pg_get_indexdef(index_oid, column_no, pretty_bool) + + 描述:获取索引的CREATE INDEX命令,或者如果column_no不为零,则只获取一个索引字段的定义。 + + 示例: + + ```sql + MogDB=# select * from pg_get_indexdef(16416, 0, false); + pg_get_indexdef + ------------------------------------------------------------------------- + CREATE INDEX test3_b_idx ON test3 USING btree (b) TABLESPACE pg_default + (1 row) + MogDB=# select * from pg_get_indexdef(16416, 1, false); + pg_get_indexdef + ----------------- + b + (1 row) + ``` + + 返回类型:text + + 备注:pg_get_functiondef为函数返回一个完整的CREATE OR REPLACE FUNCTION语句。 + +- pg_get_keywords() + + 描述:获取SQL关键字和类别列表。 + + 返回类型:setof record + + 备注:pg_get_keywords返回一组关于描述服务器识别SQL关键字的记录。word列包含关键字。catcode列包含一个分类代码:U表示通用的,C表示列名,T表示类型或函数名,或R表示保留。catdesc列包含了一个可能本地化描述分类的字符串。 + +- pg_get_userbyid(role_oid) + + 描述:获取给定OID的角色名。 + + 返回类型:name + + 备注:pg_get_userbyid通过角色的OID抽取对应的用户名。 + +- pg_check_authid(role_id) + + 描述:通过role_id检查用户是否存在。 + + 返回类型:text + + 示例: + + ```sql + MogDB=# select pg_check_authid(20); + pg_check_authid + ----------------- + f + (1 row) + ``` + +- pg_get_viewdef(view_name) + + 描述:为视图获取底层的SELECT命令。 + + 返回类型:text + +- pg_get_viewdef(view_name, pretty_bool) + + 描述:为视图获取底层的SELECT命令,如果pretty_bool为true,行字段可以包含80列。 + + 返回类型:text + + 备注:pg_get_viewdef重构出定义视图的SELECT查询。这些函数大多数都有两种形式,其中带有pretty_bool参数,且参数为true时,是”适合打印”的结果,这种格式更容易读。另一种是缺省的格式,更有可能被将来的不同版本用同样的方法解释。如果是用于转储,那么尽可能避免使用适合打印的格式。给pretty-print参数传递false生成的结果和没有这个参数的变种生成的结果是完全一样。 + +- pg_get_viewdef(view_oid) + + 描述:为视图获取底层的SELECT命令。 + + 返回类型:text + +- pg_get_viewdef(view_oid, pretty_bool) + + 描述:为视图获取底层的SELECT命令,如果pretty_bool为true,行字段可以包含80列。 + + 返回类型:text + +- pg_get_viewdef(view_oid, wrap_column_int) + + 描述:为视图获取底层的SELECT命令;行字段被换到指定的列数,打印是隐含的。 + + 返回类型:text + +- pg_get_tabledef(table_oid) + + 描述:根据table_oid获取表定义 + + 示例: + + ```sql + MogDB=# select * from pg_get_tabledef(16384); + pg_get_tabledef + ------------------------------------------------------- + SET search_path = public; + + CREATE TABLE t1 ( + + c1 bigint DEFAULT nextval('serial'::regclass)+ + ) + + WITH (orientation=row, compression=no) + + TO GROUP group1; + (1 row) + ``` + + 返回类型:text + +- pg_get_tabledef(table_name) + + 描述:根据table_name获取表定义。 + + 示例: + + ```sql + MogDB=# select * from pg_get_tabledef('t1'); + pg_get_tabledef + ------------------------------------------------------- + SET search_path = public; + + CREATE TABLE t1 ( + + c1 bigint DEFAULT nextval('serial'::regclass)+ + ) + + WITH (orientation=row, compression=no) + + TO GROUP group1; + (1 row) + ``` + + 返回类型:text + + 备注:pg_get_tabledef重构出表定义的CREATE语句,包含了表定义本身、索引信息、comments信息。对于表对象依赖的group、schema、tablespace、server等信息,需要用户自己去创建,表定义里不会有这些对象的创建语句。 + +- pg_options_to_table(reloptions) + + 描述:获取存储选项名称/值对的集合。 + + 返回类型:setof record + + 备注:pg_options_to_table当通过pg_class.reloptions或pg_attribute.attoptions时返回存储选项名称/值对(option_name/option_value)的集合。 + +- pg_tablespace_databases(tablespace_oid) + + 描述:获取在指定的表空间中有对象的数据库OID集合。 + + 返回类型:setof oid + + 备注:pg_tablespace_databases允许检查表空间的状况,返回在该表空间中保存了对象的数据库OID集合。如果这个函数返回数据行,则该表空间就是非空的,因此不能删除。要显示该表空间中的特定对象,用户需要连接pg_tablespace_databases标识的数据库与查询pg_class系统表。 + +- pg_tablespace_location(tablespace_oid) + + 描述:获取表空间所在的文件系统的路径。 + + 返回类型:text + +- pg_typeof(any) + + 描述:获取任何值的数据类型。 + + 返回类型:regtype + + 备注:pg_typeof返回传递给他的值的数据类型OID。这可能有助于故障排除或动态构造SQL查询。声明此函数返回regtype,这是一个OID别名类型(请参考[对象标识符类型](14-object-identifier-types));这意味着它是一个为了比较而显示类型名称的OID。 + + 示例: + + ```sql + MogDB=# SELECT pg_typeof(33); + pg_typeof + ----------- + integer + (1 row) + + MogDB=# SELECT typlen FROM pg_type WHERE oid = pg_typeof(33); + typlen + -------- + 4 + (1 row) + ``` + +- collation for (any) + + 描述:获取参数的排序。 + + 返回类型:text + + 备注:表达式collation for返回传递给他的值的排序。 + + 示例: + + ```sql + MogDB=# SELECT collation for (description) FROM pg_description LIMIT 1; + pg_collation_for + ------------------ + "default" + (1 row) + ``` + + 值可能是引号括起来的并且模式限制的。如果没有为参数表达式排序,则返回一个null值。如果参数不是排序的类型,则抛出一个错误。 + +- pg_extension_update_paths(name) + + 描述:返回指定扩展的版本更新路径。 + + 返回类型:text(source text), text(path text), text(target text) + +- pg_get_serial_sequence(tablename, colname) + + 描述:获取对应表名和列名上的序列。 + + 返回类型:text + + 示例: + + ```sql + MogDB=# select * from pg_get_serial_sequence('t1', 'c1'); + pg_get_serial_sequence + ------------------------ + public.serial + (1 row) + ``` + +- pg_sequence_parameters(sequence_oid) + + 描述:获取指定sequence的参数,包含起始值,最小值和最大值,递增值等。 + + 返回类型:int16, int16,int16, bigint, Boolean + + 示例: + + ```sql + MogDB=# select * from pg_sequence_parameters(16420); + start_value | minimum_value | maximum_value | increment | cycle_option + -------------+---------------+---------------------+-----------+-------------- + 101 | 1 | 9223372036854775807 | 1 | f + (1 row) + ``` + +## 注释信息函数 + +- col_description(table_oid, column_number) + + 描述:获取一个表字段的注释 + + 返回类型:text + + 备注:col_description返回一个表中字段的注释,通过表OID和字段号来声明。 + +- obj_description(object_oid, catalog_name) + + 描述:获取一个数据库对象的注释 + + 返回类型:text + + 备注:带有两个参数的obj_description返回一个数据库对象的注释,该对象是通过其OID和其所属的系统表名称声明。比如,obj_description(123456,'pg_class')将返回OID为123456的表的注释。只带一个参数的obj_description只要求对象OID。 + + obj_description不能用于表字段,因为字段没有自己的OID。 + +- obj_description(object_oid) + + 描述:获取一个数据库对象的注释 + + 返回类型:text + +- shobj_description(object_oid, catalog_name) + + 描述:获取一个共享数据库对象的注释 + + 返回类型:text + + 备注:shobj_description和obj_description差不多,不同之处仅在于前者用于共享对象。一些系统表是通用于MogDB中所有数据库的全局表,因此这些表的注释也是全局存储的。 + +## 事务ID和快照 + +内部事务ID类型(xid)是64位。这些函数使用的数据类型txid_snapshot,存储在特定时刻事务ID可见性的信息。其组件描述在表11。 + +**表 12** 快照组件 + +| 名称 | 描述 | +| :------- | :----------------------------------------------------------- | +| xmin | 最早的事务ID(txid)仍然活动。所有较早事务将是已经提交可见的,或者是直接回滚。 | +| xmax | 作为尚未分配的txid。所有大于或等于此txids的都是尚未开始的快照时间,因此不可见。 | +| xip_list | 当前快照中活动的txids。这个列表只包含在xmin和xmax之间活动的txids;有可能活动的txids高于xmax。介于大于等于xmin、小于xmax,并且不在这个列表中的txid,在这个时间快照已经完成的,因此按照提交状态查看他是可见还是回滚。这个列表不包含子事务的txids。 | + +txid_snapshot的文本表示为:xmin:xmax:xip_list。 + +示例:10:20:10,14,15意思为:xmin=10, xmax=20, xip_list=10, 14, 15。 + +以下的函数在一个输出形式中提供服务器事务信息。这些函数的主要用途是为了确定在两个快照之间有哪个事务提交。 + +- txid_current() + + 描述:获取当前事务ID。 + + 返回类型:bigint + +- gs\_txid\_oldestxmin\(\) + + 描述:获取当前最小事务id的值oldesxmin。 + + 返回类型:bigint + +- txid_current_snapshot() + + 描述:获取当前快照。 + + 返回类型:txid_snapshot + +- txid_snapshot_xip(txid_snapshot) + + 描述:在快照中获取正在进行的事务ID。 + + 返回类型:setof bigint + +- txid_snapshot_xmax(txid_snapshot) + + 描述:获取快照的xmax。 + + 返回类型:bigint + +- txid_snapshot_xmin(txid_snapshot) + + 描述:获取快照的xmin。 + + 返回类型:bigint + +- txid_visible_in_snapshot(bigint, txid_snapshot) + + 描述:在快照中事务ID是否可见(不使用子事务ID)。 + + 返回类型:Boolean + +- get_local_prepared_xact() + + 描述:获取当前节点两阶段残留事务信息,包括事务id,两阶段gid名称,prepared的时间,owner的oid,database的oid及当前节点的node_name。 + + 返回类型:xid, text, timestamptz, oid, oid,text + +- get_remote_prepared_xacts() + + 描述:获取所有远程节点两阶段残留事务信息,包括事务id,两阶段gid名称,prepared的时间,owner的名称,database的名称及node_name。 + + 返回类型:xid, text, timestamptz, name, name,text + +- global_clean_prepared_xacts(text, text) + + 描述:并发清理两阶段残留事务,仅gs_clean工具可以调用清理,其他用户调用均返回false。 + + 返回类型:Boolean + +- gs_get_next_xid_csn() + + 描述:返回全局所有节点上的next_xid和next_csn值。 + + 返回值如下: + + **表 13** gs_get_next_xid_csn返回参数说明 + + | 字段名 | 描述 | + | :------- | :----------------------- | + | nodename | 节点名称。 | + | next_xid | 当前节点下一个事务id号。 | + | next_csn | 当前节点下一个csn号。 | + +- slice(hstore, text[]) + + 描述: 提取hstore的子集。 + + 返回值: hstore + + 示例: + + ```sql + MogDB=# select slice('a=>1,b=>2,c=>3'::hstore, ARRAY['b','c','x']); + slice + -------------------- + "b"=>"2", "c"=>"3" + (1 row) + ``` + +- slice_array(hstore, text[]) + + 描述:提取hstore的值的集合。 + + 返回值:值数组 + + 示例: + + ```sql + MogDB=# select slice_array('a=>1,b=>2,c=>3'::hstore, ARRAY['b','c','x']); + slice_array + ------------- + {2,3,NULL} + (1 row) + ``` + +- skeys(hstore) + + 描述:返回hstore的所有键构成的集合。 + + 返回值:键的集合。 + + 示例: + + ```sql + MogDB=# select skeys('a=>1,b=>2'); + skeys + ------- + a + b + (2 rows) + ``` + +- pg_control_system() + + 描述:返回系统控制文件状态。 + + 返回类型:SETOF record + +- pg_control_checkpoint() + + 描述:返回系统检查点状态。 + + 返回类型:SETOF record + +- pv_builtin_functions + + 描述:查看所有内置系统函数信息。 + + 参数:nan + + 返回值类型:proname name, pronamespace oid, proowner oid, prolang oid, procost real, prorows real, provariadic oid, protransform regproc, proisagg boolean, proiswindow boolean, prosecdef boolean, proleakproof boolean, proisstrict boolean, proretset boolean, provolatile “char”, pronargs smallint, pronargdefaults smallint, prorettype oid, proargtypes oidvector, proallargtypes integer[], proargmodes “char”[], proargnames text[], proargdefaults pg_node_tree, prosrc text, probin text, proconfig text[], proacl aclitem[], prodefaultargpos int2vector, fencedmode boolean, proshippable boolean, propackage boolean, oid oid + +- pv_thread_memory_detail + + 描述:返回各线程的内存信息。 + + 参数:nan + + 返回值类型:threadid text, tid bigint, thrdtype text, contextname text, level smallint, parent text, totalsize bigint, freesize bigint, usedsize bigint + +- pg_relation_compression_ratio + + 描述:查询表压缩率,默认返回1.0。 + + 参数:text + + 返回值类型:real + +- pg_relation_with_compression + + 描述:查询表是否压缩。 + + 参数:text + + 返回值类型:boolean + +- pg_stat_file_recursive + + 描述:列出路径下所有文件。 + + 参数:location text + +- pg_shared_memory_detail + + 描述:返回所有已产生的共享内存上下文的使用信息,各列描述请参考[GS_SHARED_MEMORY_DETAIL](GS_SHARED_MEMORY_DETAIL)。 + + 参数:nan + + 返回值类型:contextname text, level smallint, parent text, totalsize bigint, freesize bigint, usedsize bigint + +- get_gtm_lite_status + + 描述:返回GTM上的backupXid和csn号,用来支持问题定位,GTM-FREE模式下不支持使用本系统函数。 + +- gs_stat_get_wlm_plan_operator_info + + 描述:从内部哈希表中获取算子计划信息。 + + 参数:oid + + 返回值类型:datname text, queryid int8, plan_node_id int4, startup_time int8, total_time int8, actual_rows int8, max_peak_memory int4, query_dop int4, parent_node_id int4, left_child_id int4, right_child_id int4, operation text, orientation text, strategy text, options text, condition text, projection text + +- pg_stat_get_partition_tuples_hot_updated + + 描述:返回给定分区id的分区热更新元组数的统计。 + + 参数:oid + + 返回值类型:bigint + +- gs_session_memory_detail_tp + + 描述:返回会话的内存使用情况,参考gs_session_memory_detail。 + + 参数:nan + + 返回值类型:sessid text, sesstype text, contextname text, level smallint, parent text, totalsize bigint, freesize bigint, usedsize bigint + +- gs_thread_memory_detail + + 描述:返回各线程的内存信息。 + + 参数:nan + + 返回值类型:threadid text, tid bigint, thrdtype text, contextname text, level smallint, parent text, totalsize bigint, freesize bigint, usedsize bigint + +- pg_stat_get_wlm_realtime_operator_info + + 描述:从内部哈希表中获取实时执行计划算子信息。 + + 参数:nan + + 返回值类型:queryid bigint, pid bigint, plan_node_id integer, plan_node_name text, start_time timestamp with time zone, duration bigint, status text, query_dop integer, estimated_rows bigint, tuple_processed bigint, min_peak_memory integer, max_peak_memory integer, average_peak_memory integer, memory_skew_percent integer, min_spill_size integer, max_spill_size integer, average_spill_size integer, spill_skew_percent integer, min_cpu_time bigint, max_cpu_time bigint, total_cpu_time bigint, cpu_skew_percent integer, warning text + +- pg_stat_get_wlm_realtime_ec_operator_info + + 描述:从内部哈希表中获取EC执行计划算子信息。 + + 参数:nan + + 返回值类型:queryid bigint, plan_node_id integer, plan_node_name text, start_time timestamp with time zone, ec_operator integer, ec_status text, ec_execute_datanode text, ec_dsn text, ec_username text, ec_query text, ec_libodbc_type text, ec_fetch_count bigint + +- pg_stat_get_wlm_operator_info + + 描述:从内部哈希表中获取执行计划算子信息。 + + 参数:nan + + 返回值类型:queryid bigint, pid bigint, plan_node_id integer, plan_node_name text, start_time timestamp with time zone, duration bigint, query_dop integer, estimated_rows bigint, tuple_processed bigint, min_peak_memory integer, max_peak_memory integer, average_peak_memory integer, memory_skew_percent integer, min_spill_size integer, max_spill_size integer, average_spill_size integer, spill_skew_percent integer, min_cpu_time bigint, max_cpu_time bigint, total_cpu_time bigint, cpu_skew_percent integer, warning text + +- pg_stat_get_wlm_node_resource_info + + 描述:获取当前节点资源信息。 + + 参数:nan + + 返回值类型:min_mem_util integer, max_mem_util integer, min_cpu_util integer, max_cpu_util integer, min_io_util integer, max_io_util integer, used_mem_rate integer + +- pg_stat_get_session_wlmstat + + 描述:返回当前会话负载信息。 + + 参数:pid integer + + 返回值类型:datid oid, threadid bigint, sessionid bigint, threadpid integer, usesysid oid, appname text, query text, priority bigint, block_time bigint, elapsed_time bigint, total_cpu_time bigint, skew_percent integer, statement_mem integer, active_points integer, dop_value integer, current_cgroup text, current_status text, enqueue_state text, attribute text, is_plana boolean, node_group text, srespool name + +- pg_stat_get_wlm_ec_operator_info + + 描述:从内部哈希表中获取EC执行计划算子信息。 + + 参数:nan + + 返回值类型:queryid bigint, plan_node_id integer, plan_node_name text, start_time timestamp with time zone, duration bigint, tuple_processed bigint, min_peak_memory integer, max_peak_memory integer, average_peak_memory integer, ec_operator integer, ec_status text, ec_execute_datanode text, ec_dsn text, ec_username text, ec_query text, ec_libodbc_type text, ec_fetch_count bigint + +- pg_stat_get_wlm_instance_info + + 描述:返回当前实例负载信息。 + + 参数:nan + + 返回值类型:instancename text, timestamp timestamp with time zone, used_cpu integer, free_memory integer, used_memory integer, io_await double precision, io_util double precision, disk_read double precision, disk_write double precision, process_read bigint, process_write bigint, logical_read bigint, logical_write bigint, read_counts bigint, write_counts bigint + +- pg_stat_get_wlm_instance_info_with_cleanup + + 描述:返回当前实例负载信息,并且保存到系统表中。 + + 参数:nan + + 返回值类型:instancename text, timestamp timestamp with time zone, used_cpu integer, free_memory integer, used_memory integer, io_await double precision, io_util double precision, disk_read double precision, disk_write double precision, process_read bigint, process_write bigint, logical_read bigint, logical_write bigint, read_counts bigint, write_counts bigint + +- pg_stat_get_wlm_realtime_session_info + + 描述:返回实时会话负载信息。 + + 参数:nan + + 返回值类型:nodename text, threadid bigint, block_time bigint, duration bigint, estimate_total_time bigint, estimate_left_time bigint, schemaname text, query_band text, spill_info text, control_group text, estimate_memory integer, min_peak_memory integer, max_peak_memory integer, average_peak_memory integer, memory_skew_percent integer, min_spill_size integer, max_spill_size integer, average_spill_size integer, spill_skew_percent integer, min_dn_time bigint, max_dn_time bigint, average_dn_time bigint, dntime_skew_percent integer, min_cpu_time bigint, max_cpu_time bigint, total_cpu_time bigint, cpu_skew_percent integer, min_peak_iops integer, max_peak_iops integer, average_peak_iops integer, iops_skew_percent integer, warning text, query text, query_plan text, cpu_top1_node_name text, cpu_top2_node_name text, cpu_top3_node_name text, cpu_top4_node_name text, cpu_top5_node_name text, mem_top1_node_name text, mem_top2_node_name text, mem_top3_node_name text, mem_top4_node_name text, mem_top5_node_name text, cpu_top1_value bigint, cpu_top2_value bigint, cpu_top3_value bigint, cpu_top4_value bigint, cpu_top5_value bigint, mem_top1_value bigint, mem_top2_value bigint, mem_top3_value bigint, mem_top4_value bigint, mem_top5_value bigint, top_mem_dn text, top_cpu_dn text + +- pg_stat_get_wlm_session_iostat_info + + 描述:返回会话负载IO信息。 + + 参数:nan + + 返回值类型:threadid bigint, maxcurr_iops integer, mincurr_iops integer, maxpeak_iops integer, minpeak_iops integer, iops_limits integer, io_priority integer, curr_io_limits integer + +- pg_stat_get_wlm_statistics + + 描述:返回会话负载统计数据。 + + 参数:nan + + 返回值类型:statement text, block_time bigint, elapsed_time bigint, total_cpu_time bigint, qualification_time bigint, skew_percent integer, control_group text, status text, action text + +## GUC值查询函数 + +- show(text) + + 描述:返回该GUC变量当前设置的值。 + + 返回值类型:SETOF RECORD + + 示例: + + ```sql + MogDB=# select SHOW('enable_custom_parser'); + show + ---------------------------------------------------- + name | set | description + ---------------------+-----+---------------------- + enable_custom_parser | off | Enables custom parser + (3 rows) + ``` + +- show_parameter(text) + + 描述:返回该GUC变量当前设置的值。 + + 返回值类型:SETOF RECORD + + 示例: + + ```sql + MogDB=# select show_parameter('enable_default'); + show_parameter + + -------------------------------------------------------------------------------------- + name | set | description + ---------------------------------+-----+--------------------------------------------- + enable_default_cfunc_libpath | on | Enable check for c function lib path. + enable_default_compression_table | off | Enables create table default compression tab + le or not. + enable_default_ustore_table | off | Creates all user-defined tables with orienta + tion inplace + (5 rows) + ``` + +## 其他函数 + +- sys_guid函数 + + 描述:sys_guid生成并返回一个由16个字节组成的全球唯一标识符。生成的标识符由主机时间、线程标识符和随机值构成。 + + 示例: + + ```sql + MogDB=# select sys_guid(); + sys_guid + ---------------------------------- + 0005D3DE87AB3147177B0300B2E3FED6 + (1 row) + ``` diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/24-system-management-functions/1-configuration-settings-functions.md b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/24-system-management-functions/1-configuration-settings-functions.md index 6d7755b1be802166c1b88772a9c15009cc9570de..87baef4bfdd559275dc7c509d5d44b17908003e8 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/24-system-management-functions/1-configuration-settings-functions.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/24-system-management-functions/1-configuration-settings-functions.md @@ -1,62 +1,62 @@ ---- -title: 配置设置函数 -summary: 配置设置函数 -author: Zhang Cuiping -date: 2021-04-20 ---- - -# 配置设置函数 - -配置设置函数是可以用于查询以及修改运行时配置参数的函数。 - -- current_setting(setting_name) - - 描述: 当前的设置值。 - - 返回值类型: text - - 备注: current_setting用于以查询形式获取setting_name的当前值。和SQL语句SHOW是等效的。比如: - - ```sql - MogDB=# SELECT current_setting('datestyle'); - - current_setting - ----------------- - ISO, MDY - (1 row) - ``` - -- set_working_grand_version_num_manually(tmp_version) - - 描述:通过切换授权版本号来更新和升级数据库的新特性。 - - 返回值类型:void - -- shell_in(type) - - 描述: 为shell类型输入路由(那些尚未填充的类型)。 - - 返回值类型:void - -- shell_out(type) - - 描述:为shell 类型输出路由(那些尚未填充的类型)。 - - 返回值类型:void - -- set_config(setting_name, new_value, is_local) - - 描述: 设置参数并返回新值。 - - 返回值类型: text - - 备注: set_config将参数setting_name设置为new_value。如果is_local为true,则new_value将只应用于当前事务。如果希望new_value应用于当前会话,可以使用false,和SQL语句SET是等效的。比如: - - ```sql - MogDB=# SELECT set_config('log_statement_stats', 'off', false); - - set_config - ------------ - off - (1 row) - ``` +--- +title: 配置设置函数 +summary: 配置设置函数 +author: Zhang Cuiping +date: 2021-04-20 +--- + +# 配置设置函数 + +配置设置函数是可以用于查询以及修改运行时配置参数的函数。 + +- current_setting(setting_name) + + 描述: 当前的设置值。 + + 返回值类型: text + + 备注: current_setting用于以查询形式获取setting_name的当前值。和SQL语句SHOW是等效的。比如: + + ```sql + MogDB=# SELECT current_setting('datestyle'); + + current_setting + ----------------- + ISO, MDY + (1 row) + ``` + +- set_working_grand_version_num_manually(tmp_version) + + 描述:通过切换授权版本号来更新和升级数据库的新特性。 + + 返回值类型:void + +- shell_in(type) + + 描述: 为shell类型输入路由(那些尚未填充的类型)。 + + 返回值类型:void + +- shell_out(type) + + 描述:为shell 类型输出路由(那些尚未填充的类型)。 + + 返回值类型:void + +- set_config(setting_name, new_value, is_local) + + 描述: 设置参数并返回新值。 + + 返回值类型: text + + 备注: set_config将参数setting_name设置为new_value。如果is_local为true,则new_value将只应用于当前事务。如果希望new_value应用于当前会话,可以使用false,和SQL语句SET是等效的。比如: + + ```sql + MogDB=# SELECT set_config('log_statement_stats', 'off', false); + + set_config + ------------ + off + (1 row) + ``` diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/24-system-management-functions/7-advisory-lock-functions.md b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/24-system-management-functions/7-advisory-lock-functions.md index b18559e284c13dcd83af0470fb8285b095824945..b98e1eda8c60e8a535cdffb509b21e24b2a4c253 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/24-system-management-functions/7-advisory-lock-functions.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/24-system-management-functions/7-advisory-lock-functions.md @@ -1,190 +1,244 @@ ---- -title: 咨询锁函数 -summary: 咨询锁函数 -author: Zhang Cuiping -date: 2021-04-20 ---- - -# 咨询锁函数 - -咨询锁函数用于管理咨询锁(Advisory Lock)。 - -- pg_advisory_lock(key bigint) - - 描述: 获取会话级别的排它咨询锁。 - - 返回值类型: void - - 备注: pg_advisory_lock锁定应用程序定义的资源,该资源可以用一个64位或两个不重叠的32位键值标识。如果已经有另外的会话锁定了该资源,则该函数将阻塞到该资源可用为止。这个锁是排它的。多个锁定请求将会被压入栈中,因此,如果同一个资源被锁定了三次,它必须被解锁三次以将资源释放给其他会话使用。 - -- pg_advisory_lock(key1 int, key2 int) - - 描述: 获取会话级别的排它咨询锁。 - - 返回值类型: void - - 备注: 只允许sysadmin对键值对(65535, 65535)加会话级别的排它咨询锁,普通用户无权限。 - -- pg_advisory_lock(int4, int4, Name) - - 描述:获取指定数据库的排它咨询锁。 - - 返回值类型:void - -- pg_advisory_lock_shared(key bigint) - - 描述: 获取会话级别的共享咨询锁。 - - 返回值类型: void - -- pg_advisory_lock_shared(key1 int, key2 int) - - 描述: 获取会话级别的共享咨询锁。 - - 返回值类型: void - - 备注: pg_advisory_lock_shared类似于pg_advisory_lock,不同之处仅在于共享锁会话可以和其他请求共享锁的会话共享资源,但排它锁除外。 - -- pg_advisory_unlock(key bigint) - - 描述: 释放会话级别的排它咨询锁。 - - 返回值类型: Boolean - -- pg_advisory_unlock(key1 int, key2 int) - - 描述: 释放会话级别的排它咨询锁。 - - 返回值类型: Boolean - - 备注: pg_advisory_unlock释放先前取得的排它咨询锁。如果释放成功则返回true。如果实际上并未持有指定的锁,将返回false并在服务器中产生一条SQL警告信息。 - -- pg_advisory_unlock(int4, int4, Name) - - 描述:释放指定数据库上的排它咨询锁。 - - 返回值类型:Boolean - - 备注:如果释放成功则返回true;如果未持有锁,则返回false。 - -- pg_advisory_unlock_shared(key bigint) - - 描述: 释放会话级别的共享咨询锁。 - - 返回值类型: Boolean - -- pg_advisory_unlock_shared(key1 int, key2 int) - - 描述: 释放会话级别的共享咨询锁。 - - 返回值类型: Boolean - - 备注: pg_advisory_unlock_shared类似于pg_advisory_unlock,不同之处在于该函数释放的是共享咨询锁。 - -- pg_advisory_unlock_all() - - 描述: 释放当前会话持有的所有咨询锁。 - - 返回值类型: void - - 备注: pg_advisory_unlock_all将会释放当前会话持有的所有咨询锁,该函数在会话结束的时候被隐含调用,即使客户端异常地断开连接也是一样。 - -- pg_advisory_xact_lock(key bigint) - - 描述: 获取事务级别的排它咨询锁。 - - 返回值类型: void - -- pg_advisory_xact_lock(key1 int, key2 int) - - 描述: 获取事务级别的排它咨询锁。 - - 返回值类型: void - - 备注: pg_advisory_xact_lock类似于pg_advisory_lock,不同之处在于锁是自动在当前事务结束时释放,而且不能被显式的释放。只允许sysadmin对键值对(65535, 65535)加事务级别的排它咨询锁,普通用户无权限。 - -- pg_advisory_xact_lock_shared(key bigint) - - 描述: 获取事务级别的共享咨询锁。 - - 返回值类型: void - -- pg_advisory_xact_lock_shared(key1 int, key2 int) - - 描述: 获取事务级别的共享咨询锁。 - - 返回值类型: void - - 备注: pg_advisory_xact_lock_shared类似于pg_advisory_lock_shared,不同之处在于锁是在当前事务结束时自动释放,而且不能被显式的释放。 - -- pg_try_advisory_lock(key bigint) - - 描述: 尝试获取会话级排它咨询锁。 - - 返回值类型: Boolean - - 备注: pg_try_advisory_lock类似于pg_advisory_lock,不同之处在于该函数不会阻塞以等待资源的释放。它要么立即获得锁并返回true,要么返回false表示目前不能锁定。 - -- pg_try_advisory_lock(key1 int, key2 int) - - 描述: 尝试获取会话级排它咨询锁。 - - 返回值类型: Boolean - - 备注: 只允许sysadmin对键值对(65535, 65535)加会话级别的排它咨询锁,普通用户无权限。 - -- pg_try_advisory_lock_shared(key bigint) - - 描述: 尝试获取会话级共享咨询锁。 - - 返回值类型: Boolean - -- pg_try_advisory_lock_shared(key1 int, key2 int) - - 描述: 尝试获取会话级共享咨询锁。 - - 返回值类型: Boolean - - 备注: pg_try_advisory_lock_shared类似于pg_try_advisory_lock,不同之处在于该函数尝试获得共享锁而不是排它锁。 - -- pg_try_advisory_xact_lock(key bigint) - - 描述: 尝试获取事务级别的排它咨询锁。 - - 返回值类型: Boolean - -- pg_try_advisory_xact_lock(key1 int, key2 int) - - 描述: 尝试获取事务级别的排它咨询锁。 - - 返回值类型: Boolean - - 备注: pg_try_advisory_xact_lock类似于pg_try_advisory_lock,不同之处在于如果得到锁,在当前事务的结束时自动释放,而且不能被显式的释放。只允许sysadmin对键值对(65535, 65535)加事务级别的排它咨询锁,普通用户无权限。 - -- pg_try_advisory_xact_lock_shared(key bigint) - - 描述: 尝试获取事务级别的共享咨询锁。 - - 返回值类型: Boolean - -- pg_try_advisory_xact_lock_shared(key1 int, key2 int) - - 描述: 尝试获取事务级别的共享咨询锁。 - - 返回值类型: Boolean - - 备注: pg_try_advisory_xact_lock_shared类似于pg_try_advisory_lock_shared,不同之处在于如果得到锁,在当前事务结束时自动释放,而且不能被显式的释放。 - -- lock_cluster_ddl() - - 描述: 尝试对MogDB内所有存活的数据库主节点获取会话级别的排他咨询锁。 - - 返回值类型: Boolean - - 备注: 只允许sysadmin调用,普通用户无权限。 - -- unlock_cluster_ddl() - - 描述: 尝试对数据库主节点会话级别的排他咨询锁。 - - 返回值类型: Boolean +--- +title: 咨询锁函数 +summary: 咨询锁函数 +author: Zhang Cuiping +date: 2021-04-20 +--- + +# 咨询锁函数 + +咨询锁函数用于管理咨询锁(Advisory Lock)。 + +- pg_advisory_lock(key bigint) + + 描述: 获取会话级别的排它咨询锁。 + + 返回值类型: void + + 备注: pg_advisory_lock锁定应用程序定义的资源,该资源可以用一个64位或两个不重叠的32位键值标识。如果已经有另外的会话锁定了该资源,则该函数将阻塞到该资源可用为止。这个锁是排它的。多个锁定请求将会被压入栈中,因此,如果同一个资源被锁定了三次,它必须被解锁三次以将资源释放给其他会话使用。 + +- pg_advisory_lock(key1 int, key2 int) + + 描述: 获取会话级别的排它咨询锁。 + + 返回值类型: void + + 备注: 只允许sysadmin对键值对(65535, 65535)加会话级别的排它咨询锁,普通用户无权限。 + +- pg_advisory_lock(int4, int4, Name) + + 描述:获取指定数据库的排它咨询锁。 + + 返回值类型:void + +- pg_advisory_lock_shared(key bigint) + + 描述: 获取会话级别的共享咨询锁。 + + 返回值类型: void + +- pg_advisory_lock_shared(key1 int, key2 int) + + 描述: 获取会话级别的共享咨询锁。 + + 返回值类型: void + + 备注: pg_advisory_lock_shared类似于pg_advisory_lock,不同之处仅在于共享锁会话可以和其他请求共享锁的会话共享资源,但排它锁除外。 + +- pg_advisory_unlock(key bigint) + + 描述: 释放会话级别的排它咨询锁。 + + 返回值类型: Boolean + +- pg_advisory_unlock(key1 int, key2 int) + + 描述: 释放会话级别的排它咨询锁。 + + 返回值类型: Boolean + + 备注: pg_advisory_unlock释放先前取得的排它咨询锁。如果释放成功则返回true。如果实际上并未持有指定的锁,将返回false并在服务器中产生一条SQL警告信息。 + +- pg_advisory_unlock(int4, int4, Name) + + 描述:释放指定数据库上的排它咨询锁。 + + 返回值类型:Boolean + + 备注:如果释放成功则返回true;如果未持有锁,则返回false。 + +- pg_advisory_unlock_shared(key bigint) + + 描述: 释放会话级别的共享咨询锁。 + + 返回值类型: Boolean + +- pg_advisory_unlock_shared(key1 int, key2 int) + + 描述: 释放会话级别的共享咨询锁。 + + 返回值类型: Boolean + + 备注: pg_advisory_unlock_shared类似于pg_advisory_unlock,不同之处在于该函数释放的是共享咨询锁。 + +- pg_advisory_unlock_all() + + 描述: 释放当前会话持有的所有咨询锁。 + + 返回值类型: void + + 备注: pg_advisory_unlock_all将会释放当前会话持有的所有咨询锁,该函数在会话结束的时候被隐含调用,即使客户端异常地断开连接也是一样。 + +- pg_advisory_xact_lock(key bigint) + + 描述: 获取事务级别的排它咨询锁。 + + 返回值类型: void + +- pg_advisory_xact_lock(key1 int, key2 int) + + 描述: 获取事务级别的排它咨询锁。 + + 返回值类型: void + + 备注: pg_advisory_xact_lock类似于pg_advisory_lock,不同之处在于锁是自动在当前事务结束时释放,而且不能被显式的释放。只允许sysadmin对键值对(65535, 65535)加事务级别的排它咨询锁,普通用户无权限。 + +- pg_advisory_xact_lock_shared(key bigint) + + 描述: 获取事务级别的共享咨询锁。 + + 返回值类型: void + +- pg_advisory_xact_lock_shared(key1 int, key2 int) + + 描述: 获取事务级别的共享咨询锁。 + + 返回值类型: void + + 备注: pg_advisory_xact_lock_shared类似于pg_advisory_lock_shared,不同之处在于锁是在当前事务结束时自动释放,而且不能被显式的释放。 + +- pg_try_advisory_lock(key bigint) + + 描述: 尝试获取会话级排它咨询锁。 + + 返回值类型: Boolean + + 备注: pg_try_advisory_lock类似于pg_advisory_lock,不同之处在于该函数不会阻塞以等待资源的释放。它要么立即获得锁并返回true,要么返回false表示目前不能锁定。 + +- pg_try_advisory_lock(key1 int, key2 int) + + 描述: 尝试获取会话级排它咨询锁。 + + 返回值类型: Boolean + + 备注: 只允许sysadmin对键值对(65535, 65535)加会话级别的排它咨询锁,普通用户无权限。 + +- pg_try_advisory_lock_shared(key bigint) + + 描述: 尝试获取会话级共享咨询锁。 + + 返回值类型: Boolean + +- pg_try_advisory_lock_shared(key1 int, key2 int) + + 描述: 尝试获取会话级共享咨询锁。 + + 返回值类型: Boolean + + 备注: pg_try_advisory_lock_shared类似于pg_try_advisory_lock,不同之处在于该函数尝试获得共享锁而不是排它锁。 + +- pg_try_advisory_xact_lock(key bigint) + + 描述: 尝试获取事务级别的排它咨询锁。 + + 返回值类型: Boolean + +- pg_try_advisory_xact_lock(key1 int, key2 int) + + 描述: 尝试获取事务级别的排它咨询锁。 + + 返回值类型: Boolean + + 备注: pg_try_advisory_xact_lock类似于pg_try_advisory_lock,不同之处在于如果得到锁,在当前事务的结束时自动释放,而且不能被显式的释放。只允许sysadmin对键值对(65535, 65535)加事务级别的排它咨询锁,普通用户无权限。 + +- pg_try_advisory_xact_lock_shared(key bigint) + + 描述: 尝试获取事务级别的共享咨询锁。 + + 返回值类型: Boolean + +- pg_try_advisory_xact_lock_shared(key1 int, key2 int) + + 描述: 尝试获取事务级别的共享咨询锁。 + + 返回值类型: Boolean + + 备注: pg_try_advisory_xact_lock_shared类似于pg_try_advisory_lock_shared,不同之处在于如果得到锁,在当前事务结束时自动释放,而且不能被显式的释放。 + +- lock_cluster_ddl() + + 描述: 尝试对MogDB内所有存活的数据库主节点获取会话级别的排他咨询锁。 + + 返回值类型: Boolean + + 备注: 只允许sysadmin调用,普通用户无权限。 + +- unlock_cluster_ddl() + + 描述: 尝试对数据库主节点会话级别的排他咨询锁。 + + 返回值类型: Boolean + +- pg_catalog.get_lock(text,text) + + 描述:用指定的字符串在数据库加用户锁,第二个参数是加锁等待时间。 + + 返回值类型:Int + +- pg_catalog.get_lock(text,double) + + 描述:用指定的字符串在数据库加用户锁,第二个参数是加锁等待时间。 + + 返回值类型:Int + +- pg_catalog.get_lock(text) + + 描述:用指定的字符串在数据库加用户锁。 + + 返回值类型:Int + +- pg_catalog.release_lock(text) + + 描述:释放指定的锁,如果释放成功,返回1,如果当前会话并未持有指定锁,返回0,如果当前锁并不存在(锁必须有人持有才会出现),返回NULL。 + + 返回值类型:Int + +- pg_catalog.is_free_lock(text) + + 描述:检查字符串是否空闲,如果没有被加锁返回1,否则返回0,如果检查期间出现其他错误,返回NULL。 + + 返回值类型:Int + +- pg_catalog.is_used_lock(text) + + 描述:检查字符串的锁被谁持有,返回对应的用户的会话id,如果指定锁无人持有,返回NULL。 + + 返回值类型:Bigint + +- pg_catalog.clear_all_invalid_locks() + + 描述:清除lockname HASH表中无效锁的信息,返回清除的锁的数量。 + + 返回值类型:Bigint + +- pg_catalog.release_all_locks() + + 描述:释放当前会话持有的所有的锁,返回释放的次数(对于单个字符串持有多个的情况,按对应数字计算而非只计算一次)。 + + 返回值类型:Bigint + +- pg_catalog.get_all_locks() + + 描述:查询当前库中的所有用户锁,以记录的形式返回所有用户锁的名字和持有人信息。 + + 返回值类型:Record \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/3-character-processing-functions-and-operators.md b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/3-character-processing-functions-and-operators.md index be5260b6ce3352d95a7847f6a1cda7826b32bc99..b080f85f3920ccaea7bbf606658e819d836e9a41 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/3-character-processing-functions-and-operators.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/3-character-processing-functions-and-operators.md @@ -1,1768 +1,1883 @@ ---- -title: 字符处理函数和操作符 -summary: 字符处理函数和操作符 -author: Zhang Cuiping -date: 2021-04-20 ---- - -# 字符处理函数和操作符 - -MogDB提供的字符处理函数和操作符主要用于字符串与字符串、字符串与非字符串之间的连接,以及字符串的模式匹配操作。注意:字符串处理函数除了length相关函数,其他函数和操作符不支持大于1GB CLOB作为参数。 - -- bit_length(string) - - 描述:字符串的位数。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# SELECT bit_length('world'); - bit_length - ------------ - 40 - (1 row) - ``` - -- btrim(string text [, characters text]) - - 描述:从string开头和结尾删除只包含characters中字符(缺省是空白)的最长字符串。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT btrim('sring' , 'ing'); - btrim - ------- - sr - (1 row) - ``` - -- char_length(string)或character_length(string) - - 描述:字符串中的字符个数。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# SELECT char_length('hello'); - char_length - ------------- - 5 - (1 row) - ``` - -- instr(text,text,int,int) - - 描述:instr(string1,string2,int1,int2)返回在string1中从int1位置开始匹配到第int2次string2的位置,第一个int表示开始匹配起始位置,第二个int表示匹配的次数。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# SELECT instr( 'abcdabcdabcd', 'bcd', 2, 2 ); - instr - ------- - 6 - (1 row) - ``` - -- lengthb(text/bpchar) - - 描述:获取指定字符串的字节数。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# SELECT lengthb('hello'); - lengthb - --------- - 5 - (1 row) - ``` - -- left(str text, n int) - - 描述:返回字符串的前n个字符。当n是负数时,返回除最后|n|个字符以外的所有字符。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT left('abcde', 2); - left - ------ - ab - (1 row) - ``` - -- length(string bytea, encoding name ) - - 描述:指定encoding编码格式的string的字符数。在这个编码格式中,string必须是有效的。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# SELECT length('jose', 'UTF8'); - length - -------- - 4 - (1 row) - ``` - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: - > - > 如果是查询bytea类型的长度,指定utf8编码时,最大长度只能为536870888。 - -- lpad(string text, length int [, fill text]) - - 描述:通过填充字符fill(缺省时为空白),把string填充为length长度。如果string已经比length长则将其尾部截断。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT lpad('hi', 5, 'xyza'); - lpad - ------- - xyzhi - (1 row) - ``` - -- notlike(x bytea name text, y bytea text) - - 描述:比较x和y是否不一致。 - - 返回值类型:bool - - 示例: - - ```sql - MogDB=# SELECT notlike(1,2); - notlike - -------------- - t - (1 row) - MogDB=# SELECT notlike(1,1); - notlike - -------------- - f - (1 row) - ``` - -- octet_length(string) - - 描述:字符串中的字节数。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# SELECT octet_length('jose'); - octet_length - -------------- - 4 - (1 row) - ``` - -- overlay(string placing string FROM int [for int]) - - 描述:替换子字符串。FROM int表示从第一个string的第几个字符开始替换,for int表示替换第一个string的字符数目。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT overlay('hello' placing 'world' from 2 for 3 ); - overlay - --------- - hworldo - (1 row) - ``` - -- position(substring in string) - - 描述:指定子字符串的位置。字符串区分大小写。 - - 返回值类型:int,字符串不存在时返回0。 - - 示例: - - ```sql - MogDB=# SELECT position('ing' in 'string'); - position - ---------- - 4 - (1 row) - ``` - -- pg_client_encoding() - - 描述:当前客户端编码名称。 - - 返回值类型:name - - 示例: - - ```sql - MogDB=# SELECT pg_client_encoding(); - pg_client_encoding - -------------------- - UTF8 - (1 row) - ``` - -- quote_ident(string text) - - 描述:返回适用于SQL语句的标识符形式(使用适当的引号进行界定)。只有在必要的时候才会添加引号(字符串包含非标识符字符或者会转换大小写的字符)。返回值中嵌入的引号都写了两次。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT quote_ident('hello world'); - quote_ident - -------------- - "hello world" - (1 row) - ``` - -- quote_literal(string text) - - 描述:返回适用于在SQL语句里当作文本使用的形式(使用适当的引号进行界定)。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT quote_literal('hello'); - quote_literal - --------------- - 'hello' - (1 row) - ``` - - 如果出现如下写法,text文本将进行转义。 - - ```sql - MogDB=# SELECT quote_literal(E'O\'hello'); - quote_literal - --------------- - 'O''hello' - (1 row) - ``` - - 如果出现如下写法,反斜杠会写入两次。 - - ```sql - MogDB=# SELECT quote_literal('O\hello'); - quote_literal - --------------- - E'O\\hello' - (1 row) - ``` - - 如果参数为NULL,返回空。如果参数可能为null,通常使用函数quote_nullable更适用。 - - ```sql - MogDB=# SELECT quote_literal(NULL); - quote_literal - --------------- - - (1 row) - ``` - -- quote_literal(value anyelement) - - 描述:将给定的值强制转换为text,加上引号作为文本。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT quote_literal(42.5); - quote_literal - --------------- - '42.5' - (1 row) - ``` - - 如果出现如下写法,定值将进行转义。 - - ```sql - MogDB=# SELECT quote_literal(E'O\'42.5'); - quote_literal - --------------- - '0''42.5' - (1 row) - ``` - - 如果出现如下写法,反斜杠会写入两次。 - - ```sql - MogDB=# SELECT quote_literal('O\42.5'); - quote_literal - --------------- - E'O\\42.5' - (1 row) - ``` - -- quote_nullable(string text) - - 描述:返回适用于在SQL语句里当作字符串使用的形式(使用适当的引号进行界定)。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT quote_nullable('hello'); - quote_nullable - ---------------- - 'hello' - (1 row) - ``` - - 如果出现如下写法,text文本将进行转义。 - - ```sql - MogDB=# SELECT quote_nullable(E'O\'hello'); - quote_nullable - ---------------- - 'O''hello' - (1 row) - ``` - - 如果出现如下写法,反斜杠会写入两次。 - - ```sql - MogDB=# SELECT quote_nullable('O\hello'); - quote_nullable - ---------------- - E'O\\hello' - (1 row) - ``` - - 如果参数为NULL,返回NULL。 - - ```sql - MogDB=# SELECT quote_nullable(NULL); - quote_nullable - ---------------- - NULL - (1 row) - ``` - -- quote_nullable(value anyelement) - - 描述:将给定的参数值转化为text,加上引号作为文本。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT quote_nullable(42.5); - quote_nullable - ---------------- - '42.5' - (1 row) - ``` - - 如果出现如下写法,定值将进行转义。 - - ```sql - MogDB=# SELECT quote_nullable(E'O\'42.5'); - quote_nullable - ---------------- - 'O''42.5' - (1 row) - ``` - - 如果出现如下写法,反斜杠会写入两次。 - - ```sql - MogDB=# SELECT quote_nullable('O\42.5'); - quote_nullable - ---------------- - E'O\\42.5' - (1 row) - ``` - - 如果参数为NULL,返回NULL。 - - ```sql - MogDB=# SELECT quote_nullable(NULL); - quote_nullable - ---------------- - NULL - (1 row) - ``` - -- substring_inner(string [from int] [for int]) - - 描述:截取子字符串,from int表示从第几个字符开始截取,for int表示截取几个字节。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# select substring_inner('adcde', 2,3); - substring_inner - ----------------- - dcd - (1 row) - ``` - -- substring(string [from int] [for int]) - - 描述:截取子字符串,from int表示从第几个字符开始截取,for int表示截取几个字节。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT substring('Thomas' from 2 for 3); - substring - ----------- - hom - (1 row) - ``` - -- substring(string from *pattern*) - - 描述:截取匹配POSIX正则表达式的子字符串。如果没有匹配它返回空值,否则返回文本中匹配模式的那部分。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT substring('Thomas' from '...$'); - substring - ----------- - mas - (1 row) - MogDB=# SELECT substring('foobar' from 'o(.)b'); - result - -------- - o - (1 row) - MogDB=# SELECT substring('foobar' from '(o(.)b)'); - result - -------- - oob - (1 row) - ``` - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: - > 如果POSIX正则表达式模式包含任何圆括号,那么将返回匹配第一对子表达式(对应第一个左圆括号的) 的文本。如果你想在表达式里使用圆括号而又不想导致这个例外,那么你可以在整个表达式外边放上一对圆括号。 - -- substring(string from *pattern* for *escape*) - - 描述:截取匹配SQL正则表达式的子字符串。声明的模式必须匹配整个数据串,否则函数失败并返回空值。为了标识在成功的时候应该返回的模式部分,模式必须包含逃逸字符的两次出现,并且后面要跟上双引号(")。匹配这两个标记之间的模式的文本将被返回。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT substring('Thomas' from '%#"o_a#"_' for '#'); - substring - ----------- - oma - (1 row) - ``` - -- rawcat(raw,raw) - - 描述:字符串拼接函数。 - - 返回值类型:raw - - 示例: - - ```sql - MogDB=# SELECT rawcat('ab','cd'); - rawcat - -------- - ABCD - (1 row) - ``` - -- regexp_like(text,text,text) - - 描述:正则表达式的模式匹配函数。 - - 返回值类型:bool - - 示例: - - ```sql - MogDB=# SELECT regexp_like('str','[ac]'); - regexp_like - ------------- - f - (1 row) - ``` - -- regexp_substr(string text, pattern text [, position int [, occurrence int [, flags text]]]) - - 描述:正则表达式的抽取子串函数。与substr功能相似,正则表达式出现多个并列的括号时,也全部处理。 - - 参数说明: - - − string:用于匹配的源字符串。 - - − pattern:用于匹配的正则表达式模式串。 - - − position:可选参数,表示从源字符串的第几个字符开始匹配,默认值为1。 - - − occurrence:可选参数,表示抽取第几个满足匹配的子串,为,默认值为1。 - - − flags:可选参数,包含零个或多个改变函数匹配行为的单字母标记。其中:m表示按照多行模式匹配。SQL语法兼容A和B的情况下,n选项在GUC参数behavior_compat_options值包含aformat_regexp_match时,表示“.”能够匹配 '\n' 字符,flags中没有指定n时,默认“.”不能匹配 '\n' 字符;值不包含aformat_regexp_match时,“.”默认能匹配'\n'字符。n选项的含义与m选项一致。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT regexp_substr('str','[ac]'); - regexp_substr - --------------- - - (1 row) - - MogDB=# SELECT regexp_substr('foobarbaz', 'b(..)', 3, 2) AS RESULT; - result - -------- - baz - (1 row) - ``` - -- regexp_count(string text, pattern text [, position int [, flags text]]) - - 描述:获取满足匹配的子串个数。 - - 参数说明: - - − string:用于匹配的源字符串。 - - − pattern:用于匹配的正则表达式模式串。 - - − position:表示从源字符串的第几个字符开始匹配,为可选参数,默认值为1。 - - − flags:可选参数,包含零个或多个改变函数匹配行为的单字母标记。其中:m表示按照多行模式匹配。SQL语法兼容A和B的情况下,n选项在GUC参数behavior_compat_options值包含aformat_regexp_match时,表示“.”能够匹配 '\n' 字符,flags中没有指定n时,默认“.”不能匹配 '\n' 字符;值不包含aformat_regexp_match时,“.”默认能匹配'\n'字符。n选项的含义与m选项一致。 - - 返回值类型:int - - 示例: - - ``` - MogDB=# SELECT regexp_count('foobarbaz','b(..)', 5) AS RESULT; - result - -------- - 1 - (1 row) - ``` - -- regexp_instr(string text, pattern text [, position int [, occurrence int [, return_opt int [, flags text]]]]) - - 描述:获取满足匹配条件的子串位置(从1开始)。如果没有匹配的子串,则返回0。 - - 参数说明: - - − string:用于匹配的源字符串。 - - − pattern:用于匹配的正则表达式模式串。 - - − position:可选参数,表示从源字符串的第几个字符开始匹配,默认值为1。 - - − occurrence:可选参数,表示获取第occurrence个匹配子串的位置,默认值为1。 - - − return_opt:可选参数,用于控制返回匹配子串的首字符位置还是尾字符位置。取值为0时,返回匹配子串的第一个字符的位置(从1开始计算),取值为大于0的值时,返回匹配子串的尾字符的下一个字符的位置。默认值为0。 - - − flags:可选参数,包含零个或多个改变函数匹配行为的单字母标记。其中:m表示按照多行模式匹配。SQL语法兼容A和B的情况下,n选项在GUC参数behavior_compat_options值包含aformat_regexp_match时,表示“.”能够匹配 '\n' 字符,flags中没有指定n时,默认“.”不能匹配 '\n' 字符;值不包含aformat_regexp_match时,“.”默认能匹配'\n'字符。n选项的含义与m选项一致。 - - 返回值类型:int - - 示例: - - ``` - MogDB=# SELECT regexp_instr('foobarbaz','b(..)', 1, 1, 0) AS RESULT; - result - -------- - 4 - (1 row) - - MogDB=# SELECT regexp_instr('foobarbaz','b(..)', 1, 2, 0) AS RESULT; - result - -------- - 7 - (1 row) - ``` - -- regexp_matches(string text, pattern text [, flags text]) - - 描述:返回string中所有匹配POSIX正则表达式的子字符串。如果pattern不匹配,该函数不返回行。如果模式不包含圆括号子表达式,则每一个被返回的行都是一个单一元素的文本数组,其中包括匹配整个模式的子串。如果模式包含圆括号子表达式,该函数返回一个文本数组,它的第n个元素是匹配模式的第n个圆括号子表达式的子串。 - - flags参数为可选参数,包含零个或多个改变函数行为的单字母标记。i表示进行大小写无关的匹配,g表示替换每一个匹配的子字符串而不仅仅是第一个。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-notice.gif) **须知**: - > 如果提供了最后一个参数,但参数值是空字符串("),且数据库SQL兼容模式设置为A的情况下,会导致返回结果为空集。这是因为A兼容模式将"作为NULL处理,避免此类行为的方式有如下几种: - > - > - 将数据库SQL兼容模式改为C; - > - 不提供最后一个参数,或最后一个参数不为空字符串。 - - 返回值类型:setof text[] - - 示例: - - ```sql - MogDB=# SELECT regexp_matches('foobarbequebaz', '(bar)(beque)'); - regexp_matches - ---------------- - {bar,beque} - (1 row) - MogDB=# SELECT regexp_matches('foobarbequebaz', 'barbeque'); - regexp_matches - ---------------- - {barbeque} - (1 row) - MogDB=# SELECT regexp_matches('foobarbequebazilbarfbonk', '(b[^b]+)(b[^b]+)', 'g'); - result - -------------- - {bar,beque} - {bazil,barf} - (2 rows) - ``` - -- regexp_split_to_array(string text, pattern text [, flags text ]) - - 描述:用POSIX正则表达式作为分隔符,分隔string。和regexp_split_to_table相同,不过regexp_split_to_array会把它的结果以一个text数组的形式返回。 - - 返回值类型:text[] - - 示例: - - ```sql - MogDB=# SELECT regexp_split_to_array('hello world', E'\\s+'); - regexp_split_to_array - ----------------------- - {hello,world} - (1 row) - ``` - -- regexp_split_to_table(string text, pattern text [, flags text]) - - 描述:用POSIX正则表达式作为分隔符,分隔string。如果没有与pattern的匹配,该函数返回string。如果有至少有一个匹配,对每一个匹配它都返回从上一个匹配的末尾(或者串的开头)到这次匹配开头之间的文本。当没有更多匹配时,它返回从上一次匹配的末尾到串末尾之间的文本。 - - flags参数包含零个或多个改变函数行为的单字母标记。i表示进行大小写无关的匹配。 - - 返回值类型:setof text - - 示例: - - ```sql - MogDB=# SELECT regexp_split_to_table('hello world', E'\\s+'); - regexp_split_to_table - ----------------------- - hello - world - (2 rows) - ``` - -- repeat(string text, number int ) - - 描述:将string重复number次。 - - 返回值类型:text。 - - 示例: - - ```sql - MogDB=# SELECT repeat('Pg', 4); - repeat - ---------- - PgPgPgPg - (1 row) - ``` - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: - > 由于数据库内存分配机制限制单次内存分配不可超过1GB,因此number最大值不应超过(1G-x)/lengthb(string) - 1。x为头信息长度,通常大于4字节,其具体值在不同的场景下存在差异。 - -- replace(string text, from text, to text) - - 描述:把字符串string里出现地所有子字符串from的内容替换成子字符串to的内容。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT replace('abcdefabcdef', 'cd', 'XXX'); - replace - ---------------- - abXXXefabXXXef - (1 row) - ``` - -- replace(string, substring) - - 描述:删除字符串string里出现的所有子字符串substring的内容。 - - string类型:text - - substring类型:text - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT replace('abcdefabcdef', 'cd'); - replace - ---------------- - abefabef - (1 row) - ``` - -- reverse(str) - - 描述:返回颠倒的字符串。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT reverse('abcde'); - reverse - --------- - edcba - (1 row) - ``` - -- right(str text, n int) - - 描述:返回字符串中的后n个字符。当n是负值时,返回除前|n|个字符以外的所有字符。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT right('abcde', 2); - right - ------- - de - (1 row) - - MogDB=# SELECT right('abcde', -2); - right - ------- - cde - (1 row) - ``` - -- rpad(string text, length int [, fill text]) - - 描述:使用填充字符fill(缺省时为空白),把string填充到length长度。如果string已经比length长则将其从尾部截断。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT rpad('hi', 5, 'xy'); - rpad - ------- - hixyx - (1 row) - ``` - -- rtrim(string text [, characters text]) - - 描述:从字符串string的结尾删除只包含characters中字符(缺省是个空白)的最长的字符串。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT rtrim('trimxxxx', 'x'); - rtrim - ------- - trim - (1 row) - ``` - -- substrb(text,int,int) - - 描述:提取子字符串,第一个int表示提取的起始位置,第二个表示提取几位字符。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT substrb('string',2,3); - substrb - --------- - tri - (1 row) - ``` - -- substrb(text,int) - - 描述:提取子字符串,int表示提取的起始位置。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT substrb('string',2); - substrb - --------- - tring - (1 row) - ``` - -- substr(bytea,from,count) - - 描述:从参数bytea中抽取子字符串。from表示抽取的起始位置,count表示抽取的子字符串长度。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT substr('string',2,3); - substr - -------- - tri - (1 row) - ``` - -- string || string - - 描述:连接字符串。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT 'MPP'||'DB' AS RESULT; - result - -------- - MPPDB - (1 row) - ``` - -- string || non-string或non-string || string - - 描述:连接字符串和非字符串。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT 'Value: '||42 AS RESULT; - result - ----------- - Value: 42 - (1 row) - ``` - -- split_part(string text, delimiter text, field int) - - 描述:根据delimiter分隔string返回生成的第field个子字符串(从出现第一个delimiter的text为基础)。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT split_part('abc~@~def~@~ghi', '~@~', 2); - split_part - ------------ - def - (1 row) - ``` - -- strpos(string, substring) - - 描述:指定的子字符串的位置。和position(substring in string)一样,不过参数顺序相反。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# SELECT strpos('source', 'rc'); - strpos - -------- - 4 - (1 row) - ``` - -- to_hex(number int or bigint) - - 描述:把number转换成十六进制表现形式。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT to_hex(2147483647); - to_hex - ---------- - 7fffffff - (1 row) - ``` - -- translate(string text, from text, to text) - - 描述:把在string中包含的任何匹配from中字符的字符转化为对应的在to中的字符。如果from比to长,删掉在from中出现的额外的字符。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT translate('12345', '143', 'ax'); - translate - ----------- - a2x5 - (1 row) - ``` - -- length(string) - - 描述:获取参数string中字符的数目。 - - 返回值类型:integer - - 示例: - - ```sql - MogDB=# SELECT length('abcd'); - length - -------- - 4 - (1 row) - ``` - -- lengthb(string) - - 描述:获取参数string中字节的数目。与字符集有关,同样的中文字符,在GBK与UTF8中,返回的字节数不同。 - - 返回值类型:integer - - 示例: - - ```sql - MogDB=# SELECT lengthb('Chinese'); - lengthb - --------- - 7 - (1 row) - ``` - -- substr(string,from) - - 描述: - - 从参数string中抽取子字符串。 - - from表示抽取的起始位置。 - - - from为0时,按1处理。 - - from为正数时,抽取从from到末尾的所有字符。 - - from为负数时,抽取字符串的后n个字符,n为from的绝对值。 - - 返回值类型:varchar - - 示例: - - from为正数时: - - ```sql - MogDB=# SELECT substr('ABCDEF',2); - substr - -------- - BCDEF - (1 row) - ``` - - from为负数时: - - ```sql - MogDB=# SELECT substr('ABCDEF',-2); - substr - -------- - EF - (1 row) - ``` - -- substr(string,from,count) - - 描述: - - 从参数string中抽取子字符串。 - - from表示抽取的起始位置。 - - count表示抽取的子字符串长度。 - - - from为0时,按1处理。 - - from为正数时,抽取从from开始的count个字符。 - - from为负数时,抽取从倒数第n个开始的count个字符,n为from的绝对值。 - - count小于1时,返回null。 - - 返回值类型:varchar - - 示例: - - from为正数时: - - ```sql - MogDB=# SELECT substr('ABCDEF',2,2); - substr - -------- - BC - (1 row) - ``` - - from为负数时: - - ```sql - MogDB=# SELECT substr('ABCDEF',-3,2); - substr - -------- - DE - (1 row) - ``` - -- substrb(string,from) - - 描述:该函数和SUBSTR(string,from)函数功能一致,但是计算单位为字节。 - - 返回值类型:bytea - - 示例: - - ```sql - MogDB=# SELECT substrb('ABCDEF',-2); - substrb - --------- - EF - (1 row) - ``` - -- substrb(string,from,count) - - 描述:该函数和SUBSTR(string,from,count)函数功能一致,但是计算单位为字节。 - - 返回值类型:bytea - - 示例: - - ```sql - MogDB=# SELECT substrb('ABCDEF',2,2); - substrb - --------- - BC - (1 row) - ``` - -- trim([leading |trailing |both] [characters] from string) - - 描述:从字符串string的开头、结尾或两边删除只包含characters中字符(缺省是一个空白)的最长的字符串。 - - 返回值类型:varchar - - 示例: - - ```sql - MogDB=# SELECT trim(BOTH 'x' FROM 'xTomxx'); - btrim - ------- - Tom - (1 row) - ``` - - ```sql - MogDB=# SELECT trim(LEADING 'x' FROM 'xTomxx'); - ltrim - ------- - Tomxx - (1 row) - ``` - - ```sql - MogDB=# SELECT trim(TRAILING 'x' FROM 'xTomxx'); - rtrim - ------- - xTom - (1 row) - ``` - -- rtrim(string [, characters]) - - 描述:从字符串string的结尾删除只包含characters中字符(缺省是个空白)的最长的字符串。 - - 返回值类型:varchar - - 示例: - - ```sql - MogDB=# SELECT rtrim('TRIMxxxx','x'); - rtrim - ------- - TRIM - (1 row) - ``` - -- ltrim(string [, characters]) - - 描述:从字符串string的开头删除只包含characters中字符(缺省是一个空白)的最长的字符串。 - - 返回值类型:varchar - - 示例: - - ```sql - MogDB=# SELECT ltrim('xxxxTRIM','x'); - ltrim - ------- - TRIM - (1 row) - ``` - -- upper(string) - - 描述:把字符串转化为大写。 - - 返回值类型:varchar - - 示例: - - ```sql - MogDB=# SELECT upper('tom'); - upper - ------- - TOM - (1 row) - ``` - -- lower(string) - - 描述:把字符串转化为小写。 - - 返回值类型:varchar - - 示例: - - ```sql - MogDB=# SELECT lower('TOM'); - lower - ------- - tom - (1 row) - ``` - -- rpad(string varchar, length int [, fill varchar]) - - 描述:使用填充字符fill(缺省时为空白),把string填充到length长度。如果string已经比length长则将其从尾部截断。 - - length参数在MogDB中表示字符长度。一个汉字长度计算为一个字符。 - - 返回值类型:varchar - - 示例: - - ```sql - MogDB=# SELECT rpad('hi',5,'xyza'); - rpad - ------- - hixyz - (1 row) - ``` - - ```sql - MogDB=# SELECT rpad('hi',5,'abcdefg'); - rpad - ------- - hiabc - (1 row) - ``` - -- instr(string,substring[,position,occurrence]) - - 描述:从字符串string的position(缺省时为1)所指的位置开始查找并返回第occurrence(缺省时为1)次出现子串substring的位置的值。 - - - 当position为0时,返回0。 - - 当position为负数时,从字符串倒数第n个字符往前逆向搜索。n为position的绝对值。 - - 本函数以字符为计算单位,如一个汉字为一个字符。 - - 返回值类型:integer - - 示例: - - ```sql - MogDB=# SELECT instr('corporate floor','or', 3); - instr - ------- - 5 - (1 row) - ``` - - ```sql - MogDB=# SELECT instr('corporate floor','or',-3,2); - instr - ------- - 2 - (1 row) - ``` - -- initcap(string) - - 描述:将字符串中的每个单词的首字母转化为大写,其他字母转化为小写。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT initcap('hi THOMAS'); - initcap - ----------- - Hi Thomas - (1 row) - ``` - -- ascii(string) - - 描述:参数string的第一个字符的ASCII码。 - - 返回值类型:integer - - 示例: - - ```sql - MogDB=# SELECT ascii('xyz'); - ascii - ------- - 120 - (1 row) - ``` - -- replace(string varchar, search_string varchar, replacement_string varchar) - - 描述:把字符串string中所有子字符串search_string替换成子字符串replacement_string。 - - 返回值类型:varchar - - 示例: - - ```sql - MogDB=# SELECT replace('jack and jue','j','bl'); - replace - ---------------- - black and blue - (1 row) - ``` - -- lpad(string varchar, length int[, repeat_string varchar]) - - 描述:在string的左侧添上一系列的repeat_string(缺省为空白)来组成一个总长度为n的新字符串。 - - 如果string本身的长度比指定的长度length长,则本函数将把string截断并把前面长度为length的字符串内容返回。 - - 返回值类型:varchar - - 示例: - - ```sql - MogDB=# SELECT lpad('PAGE 1',15,'*.'); - lpad - ----------------- - *.*.*.*.*PAGE 1 - (1 row) - ``` - - ```sql - MogDB=# SELECT lpad('hello world',5,'abcd'); - lpad - ------- - hello - (1 row) - ``` - -- concat(str1,str2) - - 描述:将字符串str1和str2连接并返回。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-notice.gif) **须知**:数据库SQL兼容模式设置为MY的情况下,参数str1或str2为NULL会导致返回结果为NULL。 - - 返回值类型:varchar - - 示例: - - ```sql - MogDB=# SELECT concat('Hello', ' World!'); - concat - -------------- - Hello World! - (1 row) - MogDB=# SELECT concat('Hello', NULL); - concat - -------- - Hello - (1 row) - ``` - -- chr(integer) - - 描述:给出ASCII码的字符。 - - 返回值类型:varchar - - 示例: - - ```sql - MogDB=# SELECT chr(65); - chr - ----- - A - (1 row) - ``` - -- regexp_substr(source_char, pattern) - - 描述:正则表达式的抽取子串函数。SQL语法兼容A和B的情况下,GUC参数behavior_compat_options的值包含aformat_regexp_match时,“.”不能匹配 '\n' 字符;不包含aformat_regexp_match时,“.”能够匹配'\n'字符。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT regexp_substr('500 Hello World, Redwood Shores, CA', ',[^,]+,') "REGEXPR_SUBSTR"; - REGEXPR_SUBSTR - ------------------- - , Redwood Shores, - (1 row) - ``` - -- regexp_replace(string, pattern, replacement [,flags ]) - - 描述:替换匹配POSIX正则表达式的子字符串。 如果没有匹配pattern,那么返回不加修改的string串。 如果有匹配,则返回的string串里面的匹配子串将被replacement串替换掉。 - - replacement串可以包含\\n, 其中\\n是1到9, 表明string串里匹配模式里第n个圆括号子表达式的子串应该被插入, 并且它可以包含\&表示应该插入匹配整个模式的子串。 - - 可选的flags参数包含零个或多个改变函数行为的单字母标记。i表示进行大小写无关的匹配,g表示替换每一个匹配的子字符串而不仅仅是第一个。m表示按照多行模式匹配。SQL语法兼容A和B的情况下,n选项在GUC参数behavior_compat_options的值包含aformat_regexp_match时,表示“.”能够匹配 '\n' 字符,flags中没有指定n时,默认“.”不能匹配 '\n' 字符;值不包含aformat_regexp_match时,“.”默认能匹配'\n'字符。n选项的含义与m选项一致。 - - 返回值类型:varchar - - 示例: - - ```sql - MogDB=# SELECT regexp_replace('Thomas', '.[mN]a.', 'M'); - regexp_replace - ---------------- - ThM - (1 row) - MogDB=# SELECT regexp_replace('foobarbaz','b(..)', E'X\\1Y', 'g') AS RESULT; - result - ------------- - fooXarYXazY - (1 row) - ``` - -- repexp_replace(string text, pattern text [, replacement text [, position int [, occurrence int [, flags text]]]]) - - 描述:替换匹配POSIX正则表达式的子字符串。 如果没有匹配pattern,那么返回不加修改的string串。 如果有匹配,则返回的string串里面的匹配子串将被replacement串替换掉。 - - 参数说明: - - − string:用于匹配的源字符串 - - − pattern:用于匹配的正则表达式模式串 - - − replacement:可选参数,用于替换匹配子串的字符串。如果不给定参数值或者为null, 表示用空串替换。 - - − position:可选参数,表示从源字符串的第几个字符开始匹配,默认值为1。 - - − occurrence:可选参数,表示替换第occurrence个匹配的子串。默认值为0,表示替换所有匹配到的子串。 - - − flags:可选参数,包含零个或多个改变函数匹配行为的单字母标记。其中:m表示按照多行模式匹配。SQL语法兼容A和B的情况下,n选项在GUC参数behavior_compat_options值包含aformat_regexp_match时,表示“.”能够匹配 '\n' 字符,flags中没有指定n时,默认“.”不能匹配 '\n' 字符;值不包含aformat_regexp_match时,“.”默认能匹配'\n'字符。n选项的含义与m选项一致。 - - 返回值类型:text - - 示例: - - ``` - MogDB=# SELECT regexp_replace('foobarbaz','b(..)', E'X\\1Y', 2, 2, 'n') AS RESULT; - result - ------------ - foobarXazY - (1 row) - ``` - -- concat_ws(sep text, str"any" [, str"any" [, …] ]) - - 描述:以第一个参数为分隔符,链接第二个以后的所有参数。NULL参数被忽略。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-notice.gif) **须知**: - > - > - 如果第一个参数值是NULL,会导致返回结果为NULL。 - > - 如果第一个参数值是空字符串("),且数据库SQL兼容模式设置为A的情况下,会导致返回结果为NULL。这是因为A兼容模式>将"作为NULL处理,避免此类行为,可以将数据库SQL兼容模式改为B、C或者PG。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT concat_ws(',', 'ABCDE', 2, NULL, 22); - concat_ws - ------------ - ABCDE,2,22 - (1 row) - ``` - -- nlssort(string text, sort_method text) - - 描述:以sort_method指定的排序方式返回字符串在该排序模式下的编码值,该编码值可用于排序,其决定了string在这种排序模式下的先后位置。目前支持的sort_method为'nls_sort=schinese_pinyin_m'和'nls_sort=generic_m_ci'。其中,'nls_sort=generic_m_ci'仅支持纯英文不区分大小写排序。 - - string类型:text - - sort_method类型:text - - 返回值类型:text - - 示例: - - ``` - MogDB=# SELECT nlssort('A', 'nls_sort=schinese_pinyin_m'); - nlssort - ---------------- - 01EA0000020006 - (1 row) - - MogDB=# SELECT nlssort('A', 'nls_sort=generic_m_ci'); - nlssort - ---------------- - 01EA000002 - (1 row) - ``` - -- convert(string bytea, src_encoding name, dest_encoding name) - - 描述:以dest_encoding指定的目标编码方式转化字符串bytea。src_encoding指定源编码方式,在该编码下,string必须是合法的。 - - 返回值类型:bytea - - 示例: - - ```sql - MogDB=# SELECT convert('text_in_utf8', 'UTF8', 'GBK'); - convert - ---------------------------- - \x746578745f696e5f75746638 - (1 row) - ``` - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: - > 如果源编码格式到目标编码格式的转化规则不存在,则字符串不进行任何转换直接返回,如GBK和LATIN1之间的转换规则是不存在的,具体转换规则可以通过查看系统表pg_conversion获得。 - > 示例: - > - > ```sql - > MogDB=# show server_encoding; - > server_encoding - > ----------------- - > LATIN1 - > (1 row) - > MogDB=# SELECT convert_from('some text', 'GBK'); - > convert_from - > -------------- - > some text - > (1 row) - > db_latin1=# SELECT convert_to('some text', 'GBK'); - > convert_to - > ---------------------- - > \x736f6d652074657874 - > (1 row) - > db_latin1=# SELECT convert('some text', 'GBK', 'LATIN1'); - > convert - > ---------------------- - > \x736f6d652074657874 - > (1 row) - > ``` - -- convert_from(string bytea, src_encoding name) - - 描述:以数据库的编码方式转化字符串bytea。 - - src_encoding指定源编码方式,在该编码下,string必须是合法的。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT convert_from('text_in_utf8', 'UTF8'); - convert_from - -------------- - text_in_utf8 - (1 row) - ``` - -- convert_to(string text, dest_encoding name) - - 描述:将字符串转化为dest_encoding的编码格式。 - - 返回值类型:bytea - - 示例: - - ```sql - MogDB=# SELECT convert_to('some text', 'UTF8'); - convert_to - ---------------------- - \x736f6d652074657874 - (1 row) - ``` - -- string [NOT] LIKE pattern [ESCAPE escape-character] - - 描述:模式匹配函数。 - - 如果pattern不包含百分号或者下划线,该模式只代表它本身,这时候LIKE的行为就像等号操作符。在pattern里的下划线(_)匹配任何单个字符;而一个百分号(%)匹配零或多个任何字符。 - - 要匹配下划线或者百分号本身,在pattern里相应的字符必须前导逃逸字符。缺省的逃逸字符是反斜杠,但是用户可以用ESCAPE子句指定一个。要匹配逃逸字符本身,写两个逃逸字符。 - - 返回值类型:Boolean - - 示例: - - ```sql - MogDB=# SELECT 'AA_BBCC' LIKE '%A@_B%' ESCAPE '@' AS RESULT; - result - -------- - t - (1 row) - ``` - - ```sql - MogDB=# SELECT 'AA_BBCC' LIKE '%A@_B%' AS RESULT; - result - -------- - f - (1 row) - ``` - - ```sql - MogDB=# SELECT 'AA@_BBCC' LIKE '%A@_B%' AS RESULT; - result - -------- - t - (1 row) - ``` - -- REGEXP_LIKE(source_string, pattern [, match_parameter]) - - 描述:正则表达式的模式匹配函数。 - - source_string为源字符串,pattern为正则表达式匹配模式。 match_parameter为匹配选项,可取值为: - - - 'i':大小写不敏感。 - - 'c':大小写敏感。 - - 'n':允许正则表达式元字符"."匹配换行符。 - - 'm':将source_string视为多行。 - - 若忽略match_parameter选项,默认为大小写敏感,"."不匹配换行符,source_string视为单行。 - - 返回值类型:Boolean - - 示例: - - ```sql - MogDB=# SELECT regexp_like('ABC', '[A-Z]'); - regexp_like - ------------- - t - (1 row) - ``` - - ```sql - MogDB=# SELECT regexp_like('ABC', '[D-Z]'); - regexp_like - ------------- - f - (1 row) - ``` - - ```sql - MogDB=# SELECT regexp_like('ABC', '[a-z]','i'); - regexp_like - ------------- - t - (1 row) - ``` - -- format(formatstr text [, str"any" [, …] ]) - - 描述:格式化字符串。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT format('Hello %s, %1$s', 'World'); - format - -------------------- - Hello World, World - (1 row) - ``` - -- md5(string) - - 描述:将string使用MD5加密,并以16进制数作为返回值。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: - > MD5加密算法安全性低,存在安全风险,不建议使用。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT md5('ABC'); - md5 - ---------------------------------- - 902fbdd2b1df0c4f70b4a5d23525e932 - (1 row) - ``` - -- decode(string text, format text) - - 描述:将二进制数据从文本数据中解码。 - - 返回值类型:bytea - - 示例: - - ```sql - MogDB=# SELECT decode('MTIzAAE=', 'base64'); - decode - -------------- - \x3132330001 - (1 row) - ``` - -- similar_escape(pat text, esc text) - - 描述:将一个 SQL:2008风格的正则表达式转换为POSIX风格。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# select similar_escape('\s+ab','2'); - similar_escape - ---------------- - ^(?:\\s+ab)$ - (1 row) - ``` - -- svals(hstore) - - 描述:获取hstore中的值。 - - 返回值类型:SETOF text - - 示例: - - ```sql - MogDB=# select svals('"aa"=>"bb"'); - svals - ------- - bb - (1 row) - ``` - -- tconvert(key text, value text) - - 描述:将字符串转换为hstore格式。 - - 返回值类型:hstore - - 示例: - - ```sql - MogDB=# select tconvert('aa', 'bb'); - tconvert - ------------ - "aa"=>"bb" - (1 row) - ``` - -- encode(data bytea, format text) - - 描述:将二进制数据编码为文本数据。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT encode(E'123\\000\\001', 'base64'); - encode - ---------- - MTIzAAE= - (1 row) - ``` - -> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: -> -> - 若字符串中存在换行符,如字符串由一个换行符和一个空格组成,在MogDB中LENGTH和LENGTHB的值为2。 -> -> - 对于CHAR(n) 类型,MogDB中n是指字符个数。因此,对于多字节编码的字符集, LENGTHB函数返回的长度可能大于n。 -> -> - MogDB支持多种类型的数据库,目前有4种,分别是A类型、B类型、C类型以及PG类型。在不指定数据库类型时,我们的数据库默认是A类型,A的词法分析器与另外三种不一样,在A中空字符串会被当作是NULL。所以,当使用A类型的数据库时,假如上述字符操作函数中有空字符串作为参数,会出现没有输出的情况。例如: -> -> ```sql -> MogDB=# SELECT translate('12345','123',''); -> translate -> ----------- -> (1 row) -> ``` -> -> 这是因为内核在调用相应的函数进行处理前,会判断所输入的参数中是否含有NULL,假如 有,则不会调用相应的函数,因此会没有输出。而在PG模式下,字符串的处理方式与PostgreSQL保持一致,因此不会有上述问题产生。 +--- +title: 字符处理函数和操作符 +summary: 字符处理函数和操作符 +author: Zhang Cuiping +date: 2021-04-20 +--- + +# 字符处理函数和操作符 + +MogDB提供的字符处理函数和操作符主要用于字符串与字符串、字符串与非字符串之间的连接,以及字符串的模式匹配操作。注意:字符串处理函数除了length相关函数,其他函数和操作符不支持大于1GB CLOB作为参数。 + +- bit_length(string) + + 描述:字符串的位数。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT bit_length('world'); + bit_length + ------------ + 40 + (1 row) + ``` + +- btrim(string text [, characters text]) + + 描述:从string开头和结尾删除只包含characters中字符(缺省是空白)的最长字符串。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT btrim('sring' , 'ing'); + btrim + ------- + sr + (1 row) + ``` + +- char_length(string)或character_length(string) + + 描述:字符串中的字符个数。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT char_length('hello'); + char_length + ------------- + 5 + (1 row) + ``` + +- instr(text,text,int,int) + + 描述:instr(string1,string2,int1,int2)返回在string1中从int1位置开始匹配到第int2次string2的位置,第一个int表示开始匹配起始位置,第二个int表示匹配的次数。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT instr( 'abcdabcdabcd', 'bcd', 2, 2 ); + instr + ------- + 6 + (1 row) + ``` + +- instrb(searchstr text, substring text, int64 position, int64 occurrence) + + 描述:返回字符串中指定出现的子字符串的第一个字节的位置。 + + 返回值类型:int64 + + 示例: + + ```sql + MogDB=# select INSTRB('123456123', '123', 4); + instrb + -------- + 7 + (1 row) + ``` + +- insert(str,pos,len,newstr) + + 描述:返回字符串str,开头在pos位置的子串,并且用newstr代替len个字符长的字符串。 + + 返回值类型:string + + 示例: + + ```sql + MogDB=# SELECT INSERT("begtut.com", 1, 6, "Example"); + -------- + Example.com + (1 row) + ``` + + > 注意:如果pos不在字符串的长度范围内,则返回原始字符串。如果len不在字符串的其余部分的长度范围内,从位置pos替换字符串的其余部分。如果参数为NULL返回NULL。 + +- lengthb(text/bpchar) + + 描述:获取指定字符串的字节数。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT lengthb('hello'); + lengthb + --------- + 5 + (1 row) + ``` + +- left(str text, n int) + + 描述:返回字符串的前n个字符。当n是负数时,返回除最后|n|个字符以外的所有字符。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT left('abcde', 2); + left + ------ + ab + (1 row) + ``` + +- length(string bytea, encoding name ) + + 描述:指定encoding编码格式的string的字符数。在这个编码格式中,string必须是有效的。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT length('jose', 'UTF8'); + length + -------- + 4 + (1 row) + ``` + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** + > + > 如果是查询bytea类型的长度,指定utf8编码时,最大长度只能为536870888。 + +- lpad(string text, length int [, fill text]) + + 描述:通过填充字符fill(缺省时为空白),把string填充为length长度。如果string已经比length长则将其尾部截断。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT lpad('hi', 5, 'xyza'); + lpad + ------- + xyzhi + (1 row) + ``` + +- nls_charset_id(p1 name, p2 name default 'SQL_ASCII', P3 name default "SQL_ASCII") + + 描述:返回指定字符集p1对应的ID。 + + 返回值类型:integer + + 示例: + + ```sql + MogDB=# SELECT NLS_CHARSET_ID('gbk'); + nls_charset_id + ---------------- + 6 + (1 row) + ``` + +- nls_charset_name(p1 integer, p2 integer default 0) + + 描述:返回ID对应的字符集名称。 + + 返回值类型:name + + 示例: + + ```sql + MogDB=# SELECT NLS_CHARSET_NAME(6); + nls_charset_name + ------------------ + GBK + (1 row) + ``` + +- nls_lower + + 描述:返回所有字母的小写。 + + 返回值类型:string + + 示例: + + ```sql + MogDB=# SET search_path to whale; + MogDB=# SELECT NLS_LOWER(‘AbC’) FROM dual; + ------- + abc + (1 row) + ``` + +- nls_upper + + 描述:返回所有字母的大写。 + + 返回值类型:string + + 示例: + + ```sql + MogDB=# SET search_path to whale; + MogDB=# SELECT NLS_UPPER(‘AbC’) FROM dual; + ------- + ABC + (1 row) + ``` + +- notlike(x bytea name text, y bytea text) + + 描述:比较x和y是否不一致。 + + 返回值类型:bool + + 示例: + + ```sql + MogDB=# SELECT notlike(1,2); + notlike + -------------- + t + (1 row) + MogDB=# SELECT notlike(1,1); + notlike + -------------- + f + (1 row) + ``` + +- octet_length(string) + + 描述:字符串中的字节数。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT octet_length('jose'); + octet_length + -------------- + 4 + (1 row) + ``` + +- overlay(string placing string FROM int [for int]) + + 描述:替换子字符串。FROM int表示从第一个string的第几个字符开始替换,for int表示替换第一个string的字符数目。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT overlay('hello' placing 'world' from 2 for 3 ); + overlay + --------- + hworldo + (1 row) + ``` + +- position(substring in string) + + 描述:指定子字符串的位置。字符串区分大小写。 + + 返回值类型:int,字符串不存在时返回0。 + + 示例: + + ```sql + MogDB=# SELECT position('ing' in 'string'); + position + ---------- + 4 + (1 row) + ``` + +- pg_client_encoding() + + 描述:当前客户端编码名称。 + + 返回值类型:name + + 示例: + + ```sql + MogDB=# SELECT pg_client_encoding(); + pg_client_encoding + -------------------- + UTF8 + (1 row) + ``` + +- quote_ident(string text) + + 描述:返回适用于SQL语句的标识符形式(使用适当的引号进行界定)。只有在必要的时候才会添加引号(字符串包含非标识符字符或者会转换大小写的字符)。返回值中嵌入的引号都写了两次。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT quote_ident('hello world'); + quote_ident + -------------- + "hello world" + (1 row) + ``` + +- quote_literal(string text) + + 描述:返回适用于在SQL语句里当作文本使用的形式(使用适当的引号进行界定)。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT quote_literal('hello'); + quote_literal + --------------- + 'hello' + (1 row) + ``` + + 如果出现如下写法,text文本将进行转义。 + + ```sql + MogDB=# SELECT quote_literal(E'O\'hello'); + quote_literal + --------------- + 'O''hello' + (1 row) + ``` + + 如果出现如下写法,反斜杠会写入两次。 + + ```sql + MogDB=# SELECT quote_literal('O\hello'); + quote_literal + --------------- + E'O\\hello' + (1 row) + ``` + + 如果参数为NULL,返回空。如果参数可能为null,通常使用函数quote_nullable更适用。 + + ```sql + MogDB=# SELECT quote_literal(NULL); + quote_literal + --------------- + + (1 row) + ``` + +- quote_literal(value anyelement) + + 描述:将给定的值强制转换为text,加上引号作为文本。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT quote_literal(42.5); + quote_literal + --------------- + '42.5' + (1 row) + ``` + + 如果出现如下写法,定值将进行转义。 + + ```sql + MogDB=# SELECT quote_literal(E'O\'42.5'); + quote_literal + --------------- + '0''42.5' + (1 row) + ``` + + 如果出现如下写法,反斜杠会写入两次。 + + ```sql + MogDB=# SELECT quote_literal('O\42.5'); + quote_literal + --------------- + E'O\\42.5' + (1 row) + ``` + +- quote_nullable(string text) + + 描述:返回适用于在SQL语句里当作字符串使用的形式(使用适当的引号进行界定)。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT quote_nullable('hello'); + quote_nullable + ---------------- + 'hello' + (1 row) + ``` + + 如果出现如下写法,text文本将进行转义。 + + ```sql + MogDB=# SELECT quote_nullable(E'O\'hello'); + quote_nullable + ---------------- + 'O''hello' + (1 row) + ``` + + 如果出现如下写法,反斜杠会写入两次。 + + ```sql + MogDB=# SELECT quote_nullable('O\hello'); + quote_nullable + ---------------- + E'O\\hello' + (1 row) + ``` + + 如果参数为NULL,返回NULL。 + + ```sql + MogDB=# SELECT quote_nullable(NULL); + quote_nullable + ---------------- + NULL + (1 row) + ``` + +- quote_nullable(value anyelement) + + 描述:将给定的参数值转化为text,加上引号作为文本。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT quote_nullable(42.5); + quote_nullable + ---------------- + '42.5' + (1 row) + ``` + + 如果出现如下写法,定值将进行转义。 + + ```sql + MogDB=# SELECT quote_nullable(E'O\'42.5'); + quote_nullable + ---------------- + 'O''42.5' + (1 row) + ``` + + 如果出现如下写法,反斜杠会写入两次。 + + ```sql + MogDB=# SELECT quote_nullable('O\42.5'); + quote_nullable + ---------------- + E'O\\42.5' + (1 row) + ``` + + 如果参数为NULL,返回NULL。 + + ```sql + MogDB=# SELECT quote_nullable(NULL); + quote_nullable + ---------------- + NULL + (1 row) + ``` + +- substring_inner(string [from int] [for int]) + + 描述:截取子字符串,from int表示从第几个字符开始截取,for int表示截取几个字节。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# select substring_inner('adcde', 2,3); + substring_inner + ----------------- + dcd + (1 row) + ``` + +- substring(string [from int] [for int]) + + 描述:截取子字符串,from int表示从第几个字符开始截取,for int表示截取几个字节。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT substring('Thomas' from 2 for 3); + substring + ----------- + hom + (1 row) + ``` + +- substring(string from *pattern*) + + 描述:截取匹配POSIX正则表达式的子字符串。如果没有匹配它返回空值,否则返回文本中匹配模式的那部分。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT substring('Thomas' from '...$'); + substring + ----------- + mas + (1 row) + MogDB=# SELECT substring('foobar' from 'o(.)b'); + result + -------- + o + (1 row) + MogDB=# SELECT substring('foobar' from '(o(.)b)'); + result + -------- + oob + (1 row) + ``` + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** + > 如果POSIX正则表达式模式包含任何圆括号,那么将返回匹配第一对子表达式(对应第一个左圆括号的) 的文本。如果你想在表达式里使用圆括号而又不想导致这个例外,那么你可以在整个表达式外边放上一对圆括号。 + +- substring(string from *pattern* for *escape*) + + 描述:截取匹配SQL正则表达式的子字符串。声明的模式必须匹配整个数据串,否则函数失败并返回空值。为了标识在成功的时候应该返回的模式部分,模式必须包含逃逸字符的两次出现,并且后面要跟上双引号(")。匹配这两个标记之间的模式的文本将被返回。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT substring('Thomas' from '%#"o_a#"_' for '#'); + substring + ----------- + oma + (1 row) + ``` + +- rawcat(raw,raw) + + 描述:字符串拼接函数。 + + 返回值类型:raw + + 示例: + + ```sql + MogDB=# SELECT rawcat('ab','cd'); + rawcat + -------- + ABCD + (1 row) + ``` + +- regexp_like(text,text,text) + + 描述:正则表达式的模式匹配函数。 + + 返回值类型:bool + + 示例: + + ```sql + MogDB=# SELECT regexp_like('str','[ac]'); + regexp_like + ------------- + f + (1 row) + ``` + +- regexp_substr(string text, pattern text [, position int [, occurrence int [, flags text]]]) + + 描述:正则表达式的抽取子串函数。与substr功能相似,正则表达式出现多个并列的括号时,也全部处理。 + + 参数说明: + + − string:用于匹配的源字符串。 + + − pattern:用于匹配的正则表达式模式串。 + + − position:可选参数,表示从源字符串的第几个字符开始匹配,默认值为1。 + + − occurrence:可选参数,表示抽取第几个满足匹配的子串,为,默认值为1。 + + − flags:可选参数,包含零个或多个改变函数匹配行为的单字母标记。其中:m表示按照多行模式匹配。SQL语法兼容A和B的情况下,n选项在GUC参数behavior_compat_options值包含aformat_regexp_match时,表示“.”能够匹配 '\n' 字符,flags中没有指定n时,默认“.”不能匹配 '\n' 字符;值不包含aformat_regexp_match时,“.”默认能匹配'\n'字符。n选项的含义与m选项一致。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT regexp_substr('str','[ac]'); + regexp_substr + --------------- + + (1 row) + + MogDB=# SELECT regexp_substr('foobarbaz', 'b(..)', 3, 2) AS RESULT; + result + -------- + baz + (1 row) + ``` + +- regexp_count(string text, pattern text [, position int [, flags text]]) + + 描述:获取满足匹配的子串个数。 + + 参数说明: + + − string:用于匹配的源字符串。 + + − pattern:用于匹配的正则表达式模式串。 + + − position:表示从源字符串的第几个字符开始匹配,为可选参数,默认值为1。 + + − flags:可选参数,包含零个或多个改变函数匹配行为的单字母标记。其中:m表示按照多行模式匹配。SQL语法兼容A和B的情况下,n选项在GUC参数behavior_compat_options值包含aformat_regexp_match时,表示“.”能够匹配 '\n' 字符,flags中没有指定n时,默认“.”不能匹配 '\n' 字符;值不包含aformat_regexp_match时,“.”默认能匹配'\n'字符。n选项的含义与m选项一致。 + + 返回值类型:int + + 示例: + + ``` + MogDB=# SELECT regexp_count('foobarbaz','b(..)', 5) AS RESULT; + result + -------- + 1 + (1 row) + ``` + +- regexp_instr(string text, pattern text [, position int [, occurrence int [, return_opt int [, flags text]]]]) + + 描述:获取满足匹配条件的子串位置(从1开始)。如果没有匹配的子串,则返回0。 + + 参数说明: + + - string:用于匹配的源字符串。 + + - pattern:用于匹配的正则表达式模式串。 + + - position:可选参数,表示从源字符串的第几个字符开始匹配,默认值为1。 + + - occurrence:可选参数,表示获取第occurrence个匹配子串的位置,默认值为1。 + + - return_opt:可选参数,用于控制返回匹配子串的首字符位置还是尾字符位置。取值为0时,返回匹配子串的第一个字符的位置(从1开始计算),取值为大于0的值时,返回匹配子串的尾字符的下一个字符的位置。默认值为0。 + + - flags:可选参数,包含零个或多个改变函数匹配行为的单字母标记。其中:m表示按照多行模式匹配。SQL语法兼容A和B的情况下,n选项在GUC参数behavior_compat_options值包含aformat_regexp_match时,表示“.”能够匹配 '\n' 字符,flags中没有指定n时,默认“.”不能匹配 '\n' 字符;值不包含aformat_regexp_match时,“.”默认能匹配'\n'字符。n选项的含义与m选项一致。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT regexp_instr('foobarbaz','b(..)', 1, 1, 0) AS RESULT; + result + -------- + 4 + (1 row) + + MogDB=# SELECT regexp_instr('foobarbaz','b(..)', 1, 2, 0) AS RESULT; + result + -------- + 7 + (1 row) + ``` + +- regexp_matches(string text, pattern text [, flags text]) + + 描述:返回string中所有匹配POSIX正则表达式的子字符串。如果pattern不匹配,该函数不返回行。如果模式不包含圆括号子表达式,则每一个被返回的行都是一个单一元素的文本数组,其中包括匹配整个模式的子串。如果模式包含圆括号子表达式,该函数返回一个文本数组,它的第n个元素是匹配模式的第n个圆括号子表达式的子串。 + + flags参数为可选参数,包含零个或多个改变函数行为的单字母标记。i表示进行大小写无关的匹配,g表示替换每一个匹配的子字符串而不仅仅是第一个。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-notice.gif) **须知:** + > 如果提供了最后一个参数,但参数值是空字符串("),且数据库SQL兼容模式设置为A的情况下,会导致返回结果为空集。这是因为A兼容模式将"作为NULL处理,避免此类行为的方式有如下几种: + > + > - 将数据库SQL兼容模式改为C; + > - 不提供最后一个参数,或最后一个参数不为空字符串。 + + 返回值类型:setof text[] + + 示例: + + ```sql + MogDB=# SELECT regexp_matches('foobarbequebaz', '(bar)(beque)'); + regexp_matches + ---------------- + {bar,beque} + (1 row) + MogDB=# SELECT regexp_matches('foobarbequebaz', 'barbeque'); + regexp_matches + ---------------- + {barbeque} + (1 row) + MogDB=# SELECT regexp_matches('foobarbequebazilbarfbonk', '(b[^b]+)(b[^b]+)', 'g'); + result + -------------- + {bar,beque} + {bazil,barf} + (2 rows) + ``` + +- regexp_split_to_array(string text, pattern text [, flags text ]) + + 描述:用POSIX正则表达式作为分隔符,分隔string。和regexp_split_to_table相同,不过regexp_split_to_array会把它的结果以一个text数组的形式返回。 + + 返回值类型:text[] + + 示例: + + ```sql + MogDB=# SELECT regexp_split_to_array('hello world', E'\\s+'); + regexp_split_to_array + ----------------------- + {hello,world} + (1 row) + ``` + +- regexp_split_to_table(string text, pattern text [, flags text]) + + 描述:用POSIX正则表达式作为分隔符,分隔string。如果没有与pattern的匹配,该函数返回string。如果有至少有一个匹配,对每一个匹配它都返回从上一个匹配的末尾(或者串的开头)到这次匹配开头之间的文本。当没有更多匹配时,它返回从上一次匹配的末尾到串末尾之间的文本。 + + flags参数包含零个或多个改变函数行为的单字母标记。i表示进行大小写无关的匹配。 + + 返回值类型:setof text + + 示例: + + ```sql + MogDB=# SELECT regexp_split_to_table('hello world', E'\\s+'); + regexp_split_to_table + ----------------------- + hello + world + (2 rows) + ``` + +- repeat(string text, number int ) + + 描述:将string重复number次。 + + 返回值类型:text。 + + 示例: + + ```sql + MogDB=# SELECT repeat('Pg', 4); + repeat + ---------- + PgPgPgPg + (1 row) + ``` + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** + > 由于数据库内存分配机制限制单次内存分配不可超过1GB,因此number最大值不应超过(1G-x)/lengthb(string) - 1。x为头信息长度,通常大于4字节,其具体值在不同的场景下存在差异。 + +- replace(string text, from text, to text) + + 描述:把字符串string里出现地所有子字符串from的内容替换成子字符串to的内容。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT replace('abcdefabcdef', 'cd', 'XXX'); + replace + ---------------- + abXXXefabXXXef + (1 row) + ``` + +- replace(string, substring) + + 描述:删除字符串string里出现的所有子字符串substring的内容。 + + string类型:text + + substring类型:text + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT replace('abcdefabcdef', 'cd'); + replace + ---------------- + abefabef + (1 row) + ``` + +- replace(string, null) + + 描述:返回原字符串。 + + string类型:text + + 返回值类型:text + + 示例: + + ```sql + MogDB=# select replace('abcd', null); + replace + --------- + abcd + (1 row) + ``` + +- reverse(str) + + 描述:返回颠倒的字符串。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT reverse('abcde'); + reverse + --------- + edcba + (1 row) + ``` + +- right(str text, n int) + + 描述:返回字符串中的后n个字符。当n是负值时,返回除前|n|个字符以外的所有字符。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT right('abcde', 2); + right + ------- + de + (1 row) + + MogDB=# SELECT right('abcde', -2); + right + ------- + cde + (1 row) + ``` + +- rpad(string text, length int [, fill text]) + + 描述:使用填充字符fill(缺省时为空白),把string填充到length长度。如果string已经比length长则将其从尾部截断。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT rpad('hi', 5, 'xy'); + rpad + ------- + hixyx + (1 row) + ``` + +- rtrim(string text [, characters text]) + + 描述:从字符串string的结尾删除只包含characters中字符(缺省是个空白)的最长的字符串。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT rtrim('trimxxxx', 'x'); + rtrim + ------- + trim + (1 row) + ``` + +- substrb(text,int,int) + + 描述:提取子字符串,第一个int表示提取的起始位置,第二个表示提取几位字符。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT substrb('string',2,3); + substrb + --------- + tri + (1 row) + ``` + +- substrb(text,int) + + 描述:提取子字符串,int表示提取的起始位置。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT substrb('string',2); + substrb + --------- + tring + (1 row) + ``` + +- substr(bytea,from,count) + + 描述:从参数bytea中抽取子字符串。from表示抽取的起始位置,count表示抽取的子字符串长度。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT substr('string',2,3); + substr + -------- + tri + (1 row) + ``` + +- string || string + + 描述:连接字符串。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT 'MPP'||'DB' AS RESULT; + result + -------- + MPPDB + (1 row) + ``` + +- string || non-string或non-string || string + + 描述:连接字符串和非字符串。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT 'Value: '||42 AS RESULT; + result + ----------- + Value: 42 + (1 row) + ``` + +- split_part(string text, delimiter text, field int) + + 描述:根据delimiter分隔string返回生成的第field个子字符串(从出现第一个delimiter的text为基础)。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT split_part('abc~@~def~@~ghi', '~@~', 2); + split_part + ------------ + def + (1 row) + ``` + +- strpos(string, substring) + + 描述:指定的子字符串的位置。和position(substring in string)一样,不过参数顺序相反。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT strpos('source', 'rc'); + strpos + -------- + 4 + (1 row) + ``` + +- to_hex(number int or bigint) + + 描述:把number转换成十六进制表现形式。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT to_hex(2147483647); + to_hex + ---------- + 7fffffff + (1 row) + ``` + +- translate(string text, from text, to text) + + 描述:把在string中包含的任何匹配from中字符的字符转化为对应的在to中的字符。如果from比to长,删掉在from中出现的额外的字符。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT translate('12345', '143', 'ax'); + translate + ----------- + a2x5 + (1 row) + ``` + +- length(string) + + 描述:获取参数string中字符的数目。 + + 返回值类型:integer + + 示例: + + ```sql + MogDB=# SELECT length('abcd'); + length + -------- + 4 + (1 row) + ``` + +- lengthb(string) + + 描述:获取参数string中字节的数目。与字符集有关,同样的中文字符,在GBK与UTF8中,返回的字节数不同。 + + 返回值类型:integer + + 示例: + + ```sql + MogDB=# SELECT lengthb('Chinese'); + lengthb + --------- + 7 + (1 row) + ``` + +- substr(string,from) + + 描述: + + 从参数string中抽取子字符串。 + + from表示抽取的起始位置。 + + - from为0时,按1处理。 + - from为正数时,抽取从from到末尾的所有字符。 + - from为负数时,抽取字符串的后n个字符,n为from的绝对值。 + + 返回值类型:varchar + + 示例: + + from为正数时: + + ```sql + MogDB=# SELECT substr('ABCDEF',2); + substr + -------- + BCDEF + (1 row) + ``` + + from为负数时: + + ```sql + MogDB=# SELECT substr('ABCDEF',-2); + substr + -------- + EF + (1 row) + ``` + +- substr(string,from,count) + + 描述: + + 从参数string中抽取子字符串。 + + from表示抽取的起始位置。 + + count表示抽取的子字符串长度。 + + - from为0时,按1处理。 + - from为正数时,抽取从from开始的count个字符。 + - from为负数时,抽取从倒数第n个开始的count个字符,n为from的绝对值。 + - count小于1时,返回null。 + + 返回值类型:varchar + + 示例: + + from为正数时: + + ```sql + MogDB=# SELECT substr('ABCDEF',2,2); + substr + -------- + BC + (1 row) + ``` + + from为负数时: + + ```sql + MogDB=# SELECT substr('ABCDEF',-3,2); + substr + -------- + DE + (1 row) + ``` + +- substrb(string,from) + + 描述:该函数和SUBSTR(string,from)函数功能一致,但是计算单位为字节。 + + 返回值类型:bytea + + 示例: + + ```sql + MogDB=# SELECT substrb('ABCDEF',-2); + substrb + --------- + EF + (1 row) + ``` + +- substrb(string,from,count) + + 描述:该函数和SUBSTR(string,from,count)函数功能一致,但是计算单位为字节。 + + 返回值类型:bytea + + 示例: + + ```sql + MogDB=# SELECT substrb('ABCDEF',2,2); + substrb + --------- + BC + (1 row) + ``` + +- trim([leading |trailing |both] [characters] from string) + + 描述:从字符串string的开头、结尾或两边删除只包含characters中字符(缺省是一个空白)的最长的字符串。 + + 返回值类型:varchar + + 示例: + + ```sql + MogDB=# SELECT trim(BOTH 'x' FROM 'xTomxx'); + btrim + ------- + Tom + (1 row) + ``` + + ```sql + MogDB=# SELECT trim(LEADING 'x' FROM 'xTomxx'); + ltrim + ------- + Tomxx + (1 row) + ``` + + ```sql + MogDB=# SELECT trim(TRAILING 'x' FROM 'xTomxx'); + rtrim + ------- + xTom + (1 row) + ``` + +- rtrim(string [, characters]) + + 描述:从字符串string的结尾删除只包含characters中字符(缺省是个空白)的最长的字符串。 + + 返回值类型:varchar + + 示例: + + ```sql + MogDB=# SELECT rtrim('TRIMxxxx','x'); + rtrim + ------- + TRIM + (1 row) + ``` + +- ltrim(string [, characters]) + + 描述:从字符串string的开头删除只包含characters中字符(缺省是一个空白)的最长的字符串。 + + 返回值类型:varchar + + 示例: + + ```sql + MogDB=# SELECT ltrim('xxxxTRIM','x'); + ltrim + ------- + TRIM + (1 row) + ``` + +- upper(string) + + 描述:把字符串转化为大写。 + + 返回值类型:varchar + + 示例: + + ```sql + MogDB=# SELECT upper('tom'); + upper + ------- + TOM + (1 row) + ``` + +- lower(string) + + 描述:把字符串转化为小写。 + + 返回值类型:varchar + + 示例: + + ```sql + MogDB=# SELECT lower('TOM'); + lower + ------- + tom + (1 row) + ``` + +- rpad(string varchar, length int [, fill varchar]) + + 描述:使用填充字符fill(缺省时为空白),把string填充到length长度。如果string已经比length长则将其从尾部截断。 + + length参数在MogDB中表示字符长度。一个汉字长度计算为一个字符。 + + 返回值类型:varchar + + 示例: + + ```sql + MogDB=# SELECT rpad('hi',5,'xyza'); + rpad + ------- + hixyz + (1 row) + ``` + + ```sql + MogDB=# SELECT rpad('hi',5,'abcdefg'); + rpad + ------- + hiabc + (1 row) + ``` + +- instr(string,substring[,position,occurrence]) + + 描述:从字符串string的position(缺省时为1)所指的位置开始查找并返回第occurrence(缺省时为1)次出现子串substring的位置的值。 + + - 当position为0时,返回0。 + - 当position为负数时,从字符串倒数第n个字符往前逆向搜索。n为position的绝对值。 + + 本函数以字符为计算单位,如一个汉字为一个字符。 + + 返回值类型:integer + + 示例: + + ```sql + MogDB=# SELECT instr('corporate floor','or', 3); + instr + ------- + 5 + (1 row) + ``` + + ```sql + MogDB=# SELECT instr('corporate floor','or',-3,2); + instr + ------- + 2 + (1 row) + ``` + +- initcap(string) + + 描述:将字符串中的每个单词的首字母转化为大写,其他字母转化为小写。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT initcap('hi THOMAS'); + initcap + ----------- + Hi Thomas + (1 row) + ``` + +- ascii(string) + + 描述:参数string的第一个字符的ASCII码。 + + 返回值类型:integer + + 示例: + + ```sql + MogDB=# SELECT ascii('xyz'); + ascii + ------- + 120 + (1 row) + ``` + +- replace(string varchar, search_string varchar, replacement_string varchar) + + 描述:把字符串string中所有子字符串search_string替换成子字符串replacement_string。 + + 返回值类型:varchar + + 示例: + + ```sql + MogDB=# SELECT replace('jack and jue','j','bl'); + replace + ---------------- + black and blue + (1 row) + ``` + +- lpad(string varchar, length int[, repeat_string varchar]) + + 描述:在string的左侧添上一系列的repeat_string(缺省为空白)来组成一个总长度为n的新字符串。 + + 如果string本身的长度比指定的长度length长,则本函数将把string截断并把前面长度为length的字符串内容返回。 + + 返回值类型:varchar + + 示例: + + ```sql + MogDB=# SELECT lpad('PAGE 1',15,'*.'); + lpad + ----------------- + *.*.*.*.*PAGE 1 + (1 row) + ``` + + ```sql + MogDB=# SELECT lpad('hello world',5,'abcd'); + lpad + ------- + hello + (1 row) + ``` + +- concat(str1,str2) + + 描述:将字符串str1和str2连接并返回。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-notice.gif) **须知:**数据库SQL兼容模式设置为MY的情况下,参数str1或str2为NULL会导致返回结果为NULL。 + + 返回值类型:varchar + + 示例: + + ```sql + MogDB=# SELECT concat('Hello', ' World!'); + concat + -------------- + Hello World! + (1 row) + MogDB=# SELECT concat('Hello', NULL); + concat + -------- + Hello + (1 row) + ``` + +- chr(integer) + + 描述:给出ASCII码的字符。 + + 返回值类型:varchar + + 示例: + + ```sql + MogDB=# SELECT chr(65); + chr + ----- + A + (1 row) + ``` + +- regexp_substr(source_char, pattern) + + 描述:正则表达式的抽取子串函数。SQL语法兼容A和B的情况下,GUC参数behavior_compat_options的值包含aformat_regexp_match时,“.”不能匹配 '\n' 字符;不包含aformat_regexp_match时,“.”能够匹配'\n'字符。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT regexp_substr('500 Hello World, Redwood Shores, CA', ',[^,]+,') "REGEXPR_SUBSTR"; + REGEXPR_SUBSTR + ------------------- + , Redwood Shores, + (1 row) + ``` + +- regexp_replace(string, pattern, replacement [,flags ]) + + 描述:替换匹配POSIX正则表达式的子字符串。 如果没有匹配pattern,那么返回不加修改的string串。 如果有匹配,则返回的string串里面的匹配子串将被replacement串替换掉。 + + replacement串可以包含\\n, 其中\\n是1到9, 表明string串里匹配模式里第n个圆括号子表达式的子串应该被插入, 并且它可以包含\&表示应该插入匹配整个模式的子串。 + + 可选的flags参数包含零个或多个改变函数行为的单字母标记。i表示进行大小写无关的匹配,g表示替换每一个匹配的子字符串而不仅仅是第一个。m表示按照多行模式匹配。SQL语法兼容A和B的情况下,n选项在GUC参数behavior_compat_options的值包含aformat_regexp_match时,表示“.”能够匹配 '\n' 字符,flags中没有指定n时,默认“.”不能匹配 '\n' 字符;值不包含aformat_regexp_match时,“.”默认能匹配'\n'字符。n选项的含义与m选项一致。 + + 返回值类型:varchar + + 示例: + + ```sql + MogDB=# SELECT regexp_replace('Thomas', '.[mN]a.', 'M'); + regexp_replace + ---------------- + ThM + (1 row) + MogDB=# SELECT regexp_replace('foobarbaz','b(..)', E'X\\1Y', 'g') AS RESULT; + result + ------------- + fooXarYXazY + (1 row) + ``` + +- repexp_replace(string text, pattern text [, replacement text [, position int [, occurrence int [, flags text]]]]) + + 描述:替换匹配POSIX正则表达式的子字符串。 如果没有匹配pattern,那么返回不加修改的string串。 如果有匹配,则返回的string串里面的匹配子串将被replacement串替换掉。 + + 参数说明: + + − string:用于匹配的源字符串 + + − pattern:用于匹配的正则表达式模式串 + + − replacement:可选参数,用于替换匹配子串的字符串。如果不给定参数值或者为null, 表示用空串替换。 + + − position:可选参数,表示从源字符串的第几个字符开始匹配,默认值为1。 + + − occurrence:可选参数,表示替换第occurrence个匹配的子串。默认值为0,表示替换所有匹配到的子串。 + + − flags:可选参数,包含零个或多个改变函数匹配行为的单字母标记。其中:m表示按照多行模式匹配。SQL语法兼容A和B的情况下,n选项在GUC参数behavior_compat_options值包含aformat_regexp_match时,表示“.”能够匹配 '\n' 字符,flags中没有指定n时,默认“.”不能匹配 '\n' 字符;值不包含aformat_regexp_match时,“.”默认能匹配'\n'字符。n选项的含义与m选项一致。 + + 返回值类型:text + + 示例: + + ``` + MogDB=# SELECT regexp_replace('foobarbaz','b(..)', E'X\\1Y', 2, 2, 'n') AS RESULT; + result + ------------ + foobarXazY + (1 row) + ``` + +- concat_ws(sep text, str"any" [, str"any" [, …] ]) + + 描述:以第一个参数为分隔符,链接第二个以后的所有参数。NULL参数被忽略。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-notice.gif) **须知:** + > + > - 如果第一个参数值是NULL,会导致返回结果为NULL。 + > - 如果第一个参数值是空字符串("),且数据库SQL兼容模式设置为A的情况下,会导致返回结果为NULL。这是因为A兼容模式>将"作为NULL处理,避免此类行为,可以将数据库SQL兼容模式改为B、C或者PG。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT concat_ws(',', 'ABCDE', 2, NULL, 22); + concat_ws + ------------ + ABCDE,2,22 + (1 row) + ``` + +- nlssort(string text, sort_method text) + + 描述:以sort_method指定的排序方式返回字符串在该排序模式下的编码值,该编码值可用于排序,其决定了string在这种排序模式下的先后位置。目前支持的sort_method为'nls_sort=schinese_pinyin_m'和'nls_sort=generic_m_ci'。其中,'nls_sort=generic_m_ci'仅支持纯英文不区分大小写排序。 + + string类型:text + + sort_method类型:text + + 返回值类型:text + + 示例: + + ``` + MogDB=# SELECT nlssort('A', 'nls_sort=schinese_pinyin_m'); + nlssort + ---------------- + 01EA0000020006 + (1 row) + + MogDB=# SELECT nlssort('A', 'nls_sort=generic_m_ci'); + nlssort + ---------------- + 01EA000002 + (1 row) + ``` + +- convert(string bytea, src_encoding name, dest_encoding name) + + 描述:以dest_encoding指定的目标编码方式转化字符串bytea。src_encoding指定源编码方式,在该编码下,string必须是合法的。 + + 返回值类型:bytea + + 示例: + + ```sql + MogDB=# SELECT convert('text_in_utf8', 'UTF8', 'GBK'); + convert + ---------------------------- + \x746578745f696e5f75746638 + (1 row) + ``` + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** + > 如果源编码格式到目标编码格式的转化规则不存在,则字符串不进行任何转换直接返回,如GBK和LATIN1之间的转换规则是不存在的,具体转换规则可以通过查看系统表pg_conversion获得。 + > 示例: + > + > ```sql + > MogDB=# show server_encoding; + > server_encoding + > ----------------- + > LATIN1 + > (1 row) + > MogDB=# SELECT convert_from('some text', 'GBK'); + > convert_from + > -------------- + > some text + > (1 row) + > db_latin1=# SELECT convert_to('some text', 'GBK'); + > convert_to + > ---------------------- + > \x736f6d652074657874 + > (1 row) + > db_latin1=# SELECT convert('some text', 'GBK', 'LATIN1'); + > convert + > ---------------------- + > \x736f6d652074657874 + > (1 row) + > ``` + +- convert_from(string bytea, src_encoding name) + + 描述:以数据库的编码方式转化字符串bytea。 + + src_encoding指定源编码方式,在该编码下,string必须是合法的。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT convert_from('text_in_utf8', 'UTF8'); + convert_from + -------------- + text_in_utf8 + (1 row) + ``` + +- convert_to(string text, dest_encoding name) + + 描述:将字符串转化为dest_encoding的编码格式。 + + 返回值类型:bytea + + 示例: + + ```sql + MogDB=# SELECT convert_to('some text', 'UTF8'); + convert_to + ---------------------- + \x736f6d652074657874 + (1 row) + ``` + +- string [NOT] LIKE pattern [ESCAPE escape-character] + + 描述:模式匹配函数。 + + 如果pattern不包含百分号或者下划线,该模式只代表它本身,这时候LIKE的行为就像等号操作符。在pattern里的下划线(_)匹配任何单个字符;而一个百分号(%)匹配零或多个任何字符。 + + 要匹配下划线或者百分号本身,在pattern里相应的字符必须前导逃逸字符。缺省的逃逸字符是反斜杠,但是用户可以用ESCAPE子句指定一个。要匹配逃逸字符本身,写两个逃逸字符。 + + 返回值类型:Boolean + + 示例: + + ```sql + MogDB=# SELECT 'AA_BBCC' LIKE '%A@_B%' ESCAPE '@' AS RESULT; + result + -------- + t + (1 row) + ``` + + ```sql + MogDB=# SELECT 'AA_BBCC' LIKE '%A@_B%' AS RESULT; + result + -------- + f + (1 row) + ``` + + ```sql + MogDB=# SELECT 'AA@_BBCC' LIKE '%A@_B%' AS RESULT; + result + -------- + t + (1 row) + ``` + +- REGEXP_LIKE(source_string, pattern [, match_parameter]) + + 描述:正则表达式的模式匹配函数。 + + source_string为源字符串,pattern为正则表达式匹配模式。 match_parameter为匹配选项,可取值为: + + - 'i':大小写不敏感。 + - 'c':大小写敏感。 + - 'n':允许正则表达式元字符"."匹配换行符。 + - 'm':将source_string视为多行。 + + 若忽略match_parameter选项,默认为大小写敏感,"."不匹配换行符,source_string视为单行。 + + 返回值类型:Boolean + + 示例: + + ```sql + MogDB=# SELECT regexp_like('ABC', '[A-Z]'); + regexp_like + ------------- + t + (1 row) + ``` + + ```sql + MogDB=# SELECT regexp_like('ABC', '[D-Z]'); + regexp_like + ------------- + f + (1 row) + ``` + + ```sql + MogDB=# SELECT regexp_like('ABC', '[a-z]','i'); + regexp_like + ------------- + t + (1 row) + ``` + +- format(formatstr text [, str"any" [, …] ]) + + 描述:格式化字符串。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT format('Hello %s, %1$s', 'World'); + format + -------------------- + Hello World, World + (1 row) + ``` + +- md5(string) + + 描述:将string使用MD5加密,并以16进制数作为返回值。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** + > MD5加密算法安全性低,存在安全风险,不建议使用。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT md5('ABC'); + md5 + ---------------------------------- + 902fbdd2b1df0c4f70b4a5d23525e932 + (1 row) + ``` + +- decode(string text, format text) + + 描述:将二进制数据从文本数据中解码。 + + 返回值类型:bytea + + 示例: + + ```sql + MogDB=# SELECT decode('MTIzAAE=', 'base64'); + decode + -------------- + \x3132330001 + (1 row) + ``` + +- similar_escape(pat text, esc text) + + 描述:将一个 SQL:2008风格的正则表达式转换为POSIX风格。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# select similar_escape('\s+ab','2'); + similar_escape + ---------------- + ^(?:\\s+ab)$ + (1 row) + ``` + +- svals(hstore) + + 描述:获取hstore中的值。 + + 返回值类型:SETOF text + + 示例: + + ```sql + MogDB=# select svals('"aa"=>"bb"'); + svals + ------- + bb + (1 row) + ``` + +- tconvert(key text, value text) + + 描述:将字符串转换为hstore格式。 + + 返回值类型:hstore + + 示例: + + ```sql + MogDB=# select tconvert('aa', 'bb'); + tconvert + ------------ + "aa"=>"bb" + (1 row) + ``` + +- encode(data bytea, format text) + + 描述:将二进制数据编码为文本数据。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT encode(E'123\\000\\001', 'base64'); + encode + ---------- + MTIzAAE= + (1 row) + ``` + +> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** +> +> - 若字符串中存在换行符,如字符串由一个换行符和一个空格组成,在MogDB中LENGTH和LENGTHB的值为2。 +> +> - 对于CHAR(n) 类型,MogDB中n是指字符个数。因此,对于多字节编码的字符集, LENGTHB函数返回的长度可能大于n。 +> +> - MogDB支持多种类型的数据库,目前有4种,分别是A类型、B类型、C类型以及PG类型。在不指定数据库类型时,我们的数据库默认是A类型,A的词法分析器与另外三种不一样,在A中空字符串会被当作是NULL。所以,当使用A类型的数据库时,假如上述字符操作函数中有空字符串作为参数,会出现没有输出的情况。例如: +> +> ```sql +> MogDB=# SELECT translate('12345','123',''); +> translate +> ----------- +> (1 row) +> ``` +> +> 这是因为内核在调用相应的函数进行处理前,会判断所输入的参数中是否含有NULL,假如 有,则不会调用相应的函数,因此会没有输出。而在PG模式下,字符串的处理方式与PostgreSQL保持一致,因此不会有上述问题产生。 diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/7-mathematical-functions-and-operators.md b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/7-mathematical-functions-and-operators.md index e452ae895b5489e0224ccc8d4bb47f3f7d278204..6c419ec1d88b67697e51c8a91362a4ba2ff98fcd 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/7-mathematical-functions-and-operators.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/7-mathematical-functions-and-operators.md @@ -1,1216 +1,1232 @@ ---- -title: 数字操作函数和操作符 -summary: 数字操作函数和操作符 -author: Zhang Cuiping -date: 2021-04-20 ---- - -# 数字操作函数和操作符 - -## 数字操作符 - -- \+ - - 描述:加 - - 示例: - - ```sql - MogDB=# SELECT 2+3 AS RESULT; - result - -------- - 5 - (1 row) - ``` - -- \- - - 描述:减 - - 示例: - - ```sql - MogDB=# SELECT 2-3 AS RESULT; - result - -------- - -1 - (1 row) - ``` - -- \* - - 描述:乘 - - 示例: - - ```sql - MogDB=# SELECT 2*3 AS RESULT; - result - -------- - 6 - (1 row) - ``` - -- / - - 描述:除(除法操作符不会取整) - - 示例: - - ```sql - MogDB=# SELECT 4/2 AS RESULT; - result - -------- - 2 - (1 row) - ``` - - ```sql - MogDB=# SELECT 4/3 AS RESULT; - result - ------------------ - 1.33333333333333 - (1 row) - ``` - -- +/- - - 描述:正/负 - - 示例: - - ```sql - MogDB=# SELECT -2 AS RESULT; - result - -------- - -2 - (1 row) - ``` - -- % - - 描述:模(求余) - - 示例: - - ```sql - MogDB=# SELECT 5%4 AS RESULT; - result - -------- - 1 - (1 row) - ``` - -- @ - - 描述:绝对值 - - 示例: - - ```sql - MogDB=# SELECT @ -5.0 AS RESULT; - result - -------- - 5.0 - (1 row) - ``` - -- \^ - - 描述:幂(指数运算) - - 示例: - - ```sql - MogDB=# SELECT 2.0^3.0 AS RESULT; - result - -------------------- - 8.0000000000000000 - (1 row) - ``` - -- |/ - - 描述:平方根 - - 示例: - - ```sql - MogDB=# SELECT |/ 25.0 AS RESULT; - result - -------- - 5 - (1 row) - ``` - -- ||/ - - 描述:立方根 - - 示例: - - ```sql - MogDB=# SELECT ||/ 27.0 AS RESULT; - result - -------- - 3 - (1 row) - ``` - -- ! - - 描述:阶乘 - - 示例: - - ```sql - MogDB=# SELECT 5! AS RESULT; - result - -------- - 120 - (1 row) - ``` - -- !! - - 描述:阶乘(前缀操作符) - - 示例: - - ```sql - MogDB=# SELECT !!5 AS RESULT; - result - -------- - 120 - (1 row) - ``` - -- & - - 描述:二进制AND - - 示例: - - ```sql - MogDB=# SELECT 91&15 AS RESULT; - result - -------- - 11 - (1 row) - ``` - -- | - - 描述:二进制OR - - 示例: - - ```sql - MogDB=# SELECT 32|3 AS RESULT; - result - -------- - 35 - (1 row) - ``` - -- \# - - 描述:二进制XOR - - 示例: - - ```sql - MogDB=# SELECT 17#5 AS RESULT; - result - -------- - 20 - (1 row) - ``` - -- ~ - - 描述:二进制NOT - - 示例: - - ```sql - MogDB=# SELECT ~1 AS RESULT; - result - -------- - -2 - (1 row) - ``` - -- << - - 描述:二进制左移 - - 示例: - - ```sql - MogDB=# SELECT 1<<4 AS RESULT; - result - -------- - 16 - (1 row) - ``` - -- >> - - 描述:二进制右移 - - 示例: - - ```sql - MogDB=# SELECT 8>>2 AS RESULT; - result - -------- - 2 - (1 row) - ``` - -## 数字操作函数 - -- abs(x) - - 描述:绝对值。 - - 返回值类型:和输入相同。 - - 示例: - - ```sql - MogDB=# SELECT abs(-17.4); - abs - ------ - 17.4 - (1 row) - ``` - -- acos(x) - - 描述:反余弦。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT acos(-1); - acos - ------------------ - 3.14159265358979 - (1 row) - ``` - -- asin(x) - - 描述:反正弦。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT asin(0.5); - asin - ------------------ - .523598775598299 - (1 row) - ``` - -- atan(x) - - 描述:反正切。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT atan(1); - atan - ------------------ - .785398163397448 - (1 row) - ``` - -- atan2(y, x) - - 描述:y/x的反正切。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT atan2(2, 1); - atan2 - ------------------ - 1.10714871779409 - (1 row) - ``` - -- bitand(integer, integer) - - 描述:计算两个数字与运算(&)的结果。 - - 返回值类型:bigint类型数字。 - - 示例: - - ```sql - MogDB=# SELECT bitand(127, 63); - bitand - -------- - 63 - (1 row) - ``` - -- cbrt(dp) - - 描述:立方根。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT cbrt(27.0); - cbrt - ------ - 3 - (1 row) - ``` - -- ceil(x) - - 描述:不小于参数的最小的整数。 - - 返回值类型:整数。 - - 示例: - - ```sql - MogDB=# SELECT ceil(-42.8); - ceil - ------ - -42 - (1 row) - ``` - -- ceiling(dp or numeric) - - 描述:不小于参数的最小整数(ceil的别名)。 - - 返回值类型:dp or numeric,不考虑隐式类型转换的情况下与输入相同。 - - 示例: - - ```sql - MogDB=# SELECT ceiling(-95.3); - ceiling - --------- - -95 - (1 row) - ``` - -- cos(x) - - 描述:余弦。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT cos(-3.1415927); - cos - ------------------- - -.999999999999999 - (1 row) - ``` - -- cot(x) - - 描述:余切。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT cot(1); - cot - ------------------ - .642092615934331 - (1 row) - ``` - -- degrees(dp) - - 描述:把弧度转为角度。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT degrees(0.5); - degrees - ------------------ - 28.6478897565412 - (1 row) - ``` - -- div(y numeric, x numeric) - - 描述:y除以x的商的整数部分。 - - 返回值类型:numeric - - 示例: - - ```sql - MogDB=# SELECT div(9,4); - div - ----- - 2 - (1 row) - ``` - -- exp(x) - - 描述:自然指数。 - - 返回值类型:dp or numeric,不考虑隐式类型转换的情况下与输入相同。 - - 示例: - - ```sql - MogDB=# SELECT exp(1.0); - exp - -------------------- - 2.7182818284590452 - (1 row) - ``` - -- floor(x) - - 描述:不大于参数的最大整数。 - - 返回值类型:与输入相同。 - - 示例: - - ```sql - MogDB=# SELECT floor(-42.8); - floor - ------- - -43 - (1 row) - ``` - -- int1(in) - - 描述:将传入的text参数转换为int1类型值并返回。 - - 返回值类型:int1 - - 示例: - - ```sql - MogDB=# select int1('123'); - int1 - ------ - 123 - (1 row) - MogDB=# select int1('a'); - int1 - ------ - 0 - (1 row) - ``` - -- int2(in) - - 描述:将传入参数转换为int2类型值并返回。 - - 支持的入参类型包括float4、float8、int16、numeric、text。 - - 返回值类型:int2 - - 示例: - - ```sql - MogDB=# select int2('1234'); - int2 - ------ - 1234 - (1 row) - MogDB=# select int2(25.3); - int2 - ------ - 25 - (1 row) - ``` - -- int4(in) - - 描述:将传入参数转换为int4类型值并返回。 - - 支持的入参类型包括bit、boolean、char、duoble precision、int16、numeric、real、smallint、text。 - - 返回值类型:int4 - - 示例: - - ```sql - MogDB=# select int4('789'); - int4 - ------ - 789 - (1 row) - MogDB=# select int4(99.9); - int4 - ------ - 99 - (1 row) - ``` - -- float4\(in\) - - 描述:将传入参数转换为float4类型值并返回。支持的入参类型包括:bigint、duoble precision、int16、integer、numeric、smallint、text。 - - 返回值类型:float4 - - 示例: - - ``` - MogDB=# select float4('789'); - float4 - -------- - 789 - (1 row) - - MogDB=# select float4(99.9); - float4 - -------- - 99.9 - (1 row) - ``` - -- float8\(in\) - - 描述:将传入参数转换为float8类型值并返回。支持的入参类型包括:bigint、int16、integer、numeric、real、smallint、text。 - - 返回值类型:float8 - - 示例: - - ``` - MogDB=# select float8('789'); - float8 - -------- - 789 - (1 row) - - MogDB=# select float8(99.9); - float8 - -------- - 99.9 - (1 row) - ``` - -- int16\(in\) - - 描述:将传入参数转换为int16类型值并返回。支持的入参类型包括:bigint、boolean、double precision、integer、numeric、oid、real、smallint、tinyint。 - - 返回值类型:int16 - - 示例: - - ``` - MogDB=# select int16('789'); - int16 - -------- - 789 - (1 row) - - MogDB=# select int16(99.9); - int16 - -------- - 99 - (1 row) - ``` - -- numeric\(in\) - - 描述:将传入参数转换为numeric类型值并返回。支持的入参类型包括:bigint、boolean、double precision、int16、integer、money、real、smallint。 - - 返回值类型:numeric - - 示例: - - ``` - MogDB=# select "numeric"('789'); - numeric - --------- - 789 - (1 row) - - MogDB=# select "numeric"(99.9); - numeric - --------- - 99.9 - (1 row) - ``` - -- oid\(in\) - - 描述:将传入参数转换为oid类型值并返回。支持的入参类型包括:bigint、int16。 - - 返回值类型:oid - -- radians(dp) - - 描述:把角度转为弧度。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT radians(45.0); - radians - ------------------ - .785398163397448 - (1 row) - ``` - -- random() - - 描述:0.0到1.0之间的随机数。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT random(); - random - ------------------ - .824823560658842 - (1 row) - ``` - -- multiply(x double precision or text, y double precision or text) - - 描述:x和y的乘积。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT multiply(9.0, '3.0'); - multiply - ------------------- - 27 - (1 row) - MogDB=# SELECT multiply('9.0', 3.0); - multiply - ------------------- - 27 - (1 row) - ``` - -- ln(x) - - 描述:自然对数。 - - 返回值类型:dp or numeric,不考虑隐式类型转换的情况下与输入相同。 - - 示例: - - ```sql - MogDB=# SELECT ln(2.0); - ln - ------------------- - .6931471805599453 - (1 row) - ``` - -- log(x) - - 描述:以10为底的对数。 - - 返回值类型:与输入相同。 - - 示例: - - ```sql - MogDB=# SELECT log(100.0); - log - -------------------- - 2.0000000000000000 - (1 row) - ``` - -- log(b numeric, x numeric) - - 描述:以b为底的对数。 - - 返回值类型:numeric - - 示例: - - ```sql - MogDB=# SELECT log(2.0, 64.0); - log - -------------------- - 6.0000000000000000 - (1 row) - ``` - -- mod(x,y) - - 描述:x/y的余数(模)。如果x是0,则返回0。 - - 返回值类型:与参数类型相同。 - - 示例: - - ```sql - MogDB=# SELECT mod(9,4); - mod - ----- - 1 - (1 row) - ``` - - ```sql - MogDB=# SELECT mod(9,0); - mod - ----- - 9 - (1 row) - ``` - -- pi() - - 描述:"π"常量。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT pi(); - pi - ------------------ - 3.14159265358979 - (1 row) - ``` - -- power(a double precision, b double precision) - - 描述:a的b次幂。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT power(9.0, 3.0); - power - ---------------------- - 729.0000000000000000 - (1 row) - ``` - -- round(x) - - 描述:离输入参数最近的整数。 - - 返回值类型:与输入相同。 - - 示例: - - ```sql - MogDB=# SELECT round(42.4); - round - ------- - 42 - (1 row) - - MogDB=# SELECT round(42.6); - round - ------- - 43 - (1 row) - ``` - -- round(v numeric, s int) - - 描述:保留小数点后s位,s后一位进行四舍五入。 - - 返回值类型:numeric - - 示例: - - ```sql - MogDB=# SELECT round(42.4382, 2); - round - ------- - 42.44 - (1 row) - ``` - -- setseed(dp) - - 描述:为随后的random()调用设置种子(-1.0到1.0之间,包含)。 - - 返回值类型:void - - 示例: - - ```sql - MogDB=# SELECT setseed(0.54823); - setseed - --------- - - (1 row) - ``` - -- sign(x) - - 描述:输出此参数的符号。 - - 返回值类型:-1表示负数,0表示0,1表示正数。 - - 示例: - - ```sql - MogDB=# SELECT sign(-8.4); - sign - ------ - -1 - (1 row) - ``` - -- sin(x) - - 描述:正弦。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT sin(1.57079); - sin - ------------------ - .999999999979986 - (1 row) - ``` - -- sqrt(x) - - 描述:平方根。 - - 返回值类型:dp or numeric,不考虑隐式类型转换的情况下与输入相同。 - - 示例: - - ```sql - MogDB=# SELECT sqrt(2.0); - sqrt - ------------------- - 1.414213562373095 - (1 row) - ``` - -- tan(x) - - 描述:正切。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT tan(20); - tan - ------------------ - 2.23716094422474 - (1 row) - ``` - -- trunc(x) - - 描述:截断(取整数部分)。 - - 返回值类型:与输入相同。 - - 示例: - - ```sql - MogDB=# SELECT trunc(42.8); - trunc - ------- - 42 - (1 row) - ``` - -- trunc(v numeric, s int) - - 描述:截断为s位小数。 - - 返回值类型:numeric - - 示例: - - ```sql - MogDB=# SELECT trunc(42.4382, 2); - trunc - ------- - 42.43 - (1 row) - ``` - -- smgrne(a smgr, b smgr) - - 描述:比较两个smgr类型整数是否不相等。 - - 返回值类型:bool - -- smgreq(a smgr, b smgr) - - 描述:比较两个smgr类型整数是否相等。 - - 返回值类型:bool - -- int1abs - - 描述:返回uint8类型数据的绝对值。 - - 参数:tinyint - - 返回值类型:tinyint - -- int1and - - 描述:返回两个uint8类型数据按位与的结果。 - - 参数:tinyint, tinyint - - 返回值类型:tinyint - -- int1cmp - - 描述:返回两个uint8类型数据比较的结果,若第一个参数大,则返回1;若第二个参数大,则返回-1;若相等,则返回0。 - - 参数:tinyint, tinyint - - 返回值类型:integer - -- int1div - - 描述:返回两个uint8类型数据相除的结果,结果为float8类型。 - - 参数:tinyint, tinyint - - 返回值类型:tinyint - -- int1eq - - 描述:比较两个uint8类型数据是否相等。 - - 参数:tinyint, tinyint - - 返回值类型:boolean - -- int1ge - - 描述:判断两个uint8类型数据是否第一个参数大于等于第二个参数。 - - 参数:tinyint, tinyint - - 返回值类型:boolean - -- int1gt - - 描述:无符号1字节整数做大于运算。 - - 参数:tinyint, tinyint - - 返回值类型:boolean - -- int1larger - - 描述:无符号1字节整数求最大值。 - - 参数:tinyint, tinyint - - 返回值类型:tinyint - -- int1le - - 描述:无符号1字节整数做小于等于运算。 - - 参数:tinyint, tinyint - - 返回值类型:boolean - -- int1lt - - 描述:无符号1字节整数做小于运算。 - - 参数:tinyint, tinyint - - 返回值类型:boolean - -- int1smaller - - 描述:无符号1字节整数求最小算。 - - 参数:tinyint, tinyint - - 返回值类型:tinyint - -- int1inc - - 描述:无符号1字节整数加一。 - - 参数:tinyint - - 返回值类型:tinyint - -- int1mi - - 描述:无符号一字节整数做差运算。 - - 参数:tinyint, tinyint - - 返回值类型:tinyint - -- int1mod - - 描述:无符号一字节整数做取余运算。 - - 参数:tinyint, tinyint - - 返回值类型:tinyint - -- int1mul - - 描述:无符号一字节整数做乘法运算。 - - 参数:tinyint, tinyint - - 返回值类型:tinyint - -- int1ne - - 描述:无符号一字节整数不等于运算。 - - 参数:tinyint, tinyint - - 返回值类型:boolean - -- int1pl - - 描述:无符号一字节整数加法。 - - 参数:tinyint, tinyint - - 返回值类型:tinyint - -- int1um - - 描述:无符号一字节数去相反数并返回有符号二字节整数。 - - 参数:tinyint - - 返回值类型:smallint - -- int1xor - - 描述:无符号一字节整数异或操作。 - - 参数:tinyint, tinyint - - 返回值类型:tinyint - -- cash_div_int1 - - 描述:对money类型进行除法运算。 - - 参数:money, tinyint - - 返回值类型:money - -- cash_mul_int1 - - 描述:对money类型进行乘法运算。 - - 参数:money, tinyint - - 返回值类型:money - -- int1not - - 描述:无符号一字节整数二进制位翻转。 - - 参数:tinyint - - 返回值类型:tinyint - -- int1or - - 描述:无符号一字节整数或运算。 - - 参数:tinyint, tinyint - - 返回值类型:tinyint - -- int1shl - - 描述:无符号一字节整数左移指定位数。 - - 参数:tinyint, integer - - 返回值类型:tinyint - -- width_bucket(op numeric, b1 numeric, b2 numeric, count int) - - 描述:返回一个桶,这个桶是在一个有count个桶,上界为b1下界为b2的等深柱图中operand将被赋予的那个桶。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# SELECT width_bucket(5.35, 0.024, 10.06, 5); - width_bucket - -------------- - 3 - (1 row) - ``` - -- width_bucket(op dp, b1 dp, b2 dp, count int) - - 描述:返回一个桶,这个桶是在一个有count个桶,上界为b1下界为b2的等深柱图中operand将被赋予的那个桶。 - - 返回值类型:int - - 示例: - - ```sql - MogDB=# SELECT width_bucket(5.35, 0.024, 10.06, 5); - width_bucket - -------------- - 3 - (1 row) - ``` +--- +title: 数字操作函数和操作符 +summary: 数字操作函数和操作符 +author: Zhang Cuiping +date: 2021-04-20 +--- + +# 数字操作函数和操作符 + +## 数字操作符 + +- \+ + + 描述:加 + + 示例: + + ```sql + MogDB=# SELECT 2+3 AS RESULT; + result + -------- + 5 + (1 row) + ``` + +- \- + + 描述:减 + + 示例: + + ```sql + MogDB=# SELECT 2-3 AS RESULT; + result + -------- + -1 + (1 row) + ``` + +- \* + + 描述:乘 + + 示例: + + ```sql + MogDB=# SELECT 2*3 AS RESULT; + result + -------- + 6 + (1 row) + ``` + +- / + + 描述:除(除法操作符不会取整) + + 示例: + + ```sql + MogDB=# SELECT 4/2 AS RESULT; + result + -------- + 2 + (1 row) + ``` + + ```sql + MogDB=# SELECT 4/3 AS RESULT; + result + ------------------ + 1.33333333333333 + (1 row) + ``` + +- +/- + + 描述:正/负 + + 示例: + + ```sql + MogDB=# SELECT -2 AS RESULT; + result + -------- + -2 + (1 row) + ``` + +- % + + 描述:模(求余) + + 示例: + + ```sql + MogDB=# SELECT 5%4 AS RESULT; + result + -------- + 1 + (1 row) + ``` + +- @ + + 描述:绝对值 + + 示例: + + ```sql + MogDB=# SELECT @ -5.0 AS RESULT; + result + -------- + 5.0 + (1 row) + ``` + +- \^ + + 描述:幂(指数运算) + + 示例: + + ```sql + MogDB=# SELECT 2.0^3.0 AS RESULT; + result + -------------------- + 8.0000000000000000 + (1 row) + ``` + +- |/ + + 描述:平方根 + + 示例: + + ```sql + MogDB=# SELECT |/ 25.0 AS RESULT; + result + -------- + 5 + (1 row) + ``` + +- ||/ + + 描述:立方根 + + 示例: + + ```sql + MogDB=# SELECT ||/ 27.0 AS RESULT; + result + -------- + 3 + (1 row) + ``` + +- ! + + 描述:阶乘 + + 示例: + + ```sql + MogDB=# SELECT 5! AS RESULT; + result + -------- + 120 + (1 row) + ``` + +- !! + + 描述:阶乘(前缀操作符) + + 示例: + + ```sql + MogDB=# SELECT !!5 AS RESULT; + result + -------- + 120 + (1 row) + ``` + +- & + + 描述:二进制AND + + 示例: + + ```sql + MogDB=# SELECT 91&15 AS RESULT; + result + -------- + 11 + (1 row) + ``` + +- | + + 描述:二进制OR + + 示例: + + ```sql + MogDB=# SELECT 32|3 AS RESULT; + result + -------- + 35 + (1 row) + ``` + +- \# + + 描述:二进制XOR + + 示例: + + ```sql + MogDB=# SELECT 17#5 AS RESULT; + result + -------- + 20 + (1 row) + ``` + +- ~ + + 描述:二进制NOT + + 示例: + + ```sql + MogDB=# SELECT ~1 AS RESULT; + result + -------- + -2 + (1 row) + ``` + +- << + + 描述:二进制左移 + + 示例: + + ```sql + MogDB=# SELECT 1<<4 AS RESULT; + result + -------- + 16 + (1 row) + ``` + +- >> + + 描述:二进制右移 + + 示例: + + ```sql + MogDB=# SELECT 8>>2 AS RESULT; + result + -------- + 2 + (1 row) + ``` + +## 数字操作函数 + +- abs(x) + + 描述:绝对值。 + + 返回值类型:和输入相同。 + + 示例: + + ```sql + MogDB=# SELECT abs(-17.4); + abs + ------ + 17.4 + (1 row) + ``` + +- acos(x) + + 描述:反余弦。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT acos(-1); + acos + ------------------ + 3.14159265358979 + (1 row) + ``` + +- asin(x) + + 描述:反正弦。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT asin(0.5); + asin + ------------------ + .523598775598299 + (1 row) + ``` + +- atan(x) + + 描述:反正切。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT atan(1); + atan + ------------------ + .785398163397448 + (1 row) + ``` + +- atan2(y, x) + + 描述:y/x的反正切。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT atan2(2, 1); + atan2 + ------------------ + 1.10714871779409 + (1 row) + ``` + +- bitand(integer, integer) + + 描述:计算两个数字与运算(&)的结果。 + + 返回值类型:bigint类型数字。 + + 示例: + + ```sql + MogDB=# SELECT bitand(127, 63); + bitand + -------- + 63 + (1 row) + ``` + +- cbrt(dp) + + 描述:立方根。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT cbrt(27.0); + cbrt + ------ + 3 + (1 row) + ``` + +- ceil(x) + + 描述:不小于参数的最小的整数。 + + 返回值类型:整数。 + + 示例: + + ```sql + MogDB=# SELECT ceil(-42.8); + ceil + ------ + -42 + (1 row) + ``` + +- ceiling(dp or numeric) + + 描述:不小于参数的最小整数(ceil的别名)。 + + 返回值类型:dp or numeric,不考虑隐式类型转换的情况下与输入相同。 + + 示例: + + ```sql + MogDB=# SELECT ceiling(-95.3); + ceiling + --------- + -95 + (1 row) + ``` + +- cos(x) + + 描述:余弦。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT cos(-3.1415927); + cos + ------------------- + -.999999999999999 + (1 row) + ``` + +- cot(x) + + 描述:余切。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT cot(1); + cot + ------------------ + .642092615934331 + (1 row) + ``` + +- degrees(dp) + + 描述:把弧度转为角度。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT degrees(0.5); + degrees + ------------------ + 28.6478897565412 + (1 row) + ``` + +- div(y numeric, x numeric) + + 描述:y除以x的商的整数部分。 + + 返回值类型:numeric + + 示例: + + ```sql + MogDB=# SELECT div(9,4); + div + ----- + 2 + (1 row) + ``` + +- exp(x) + + 描述:自然指数。 + + 返回值类型:dp or numeric,不考虑隐式类型转换的情况下与输入相同。 + + 示例: + + ```sql + MogDB=# SELECT exp(1.0); + exp + -------------------- + 2.7182818284590452 + (1 row) + ``` + +- floor(x) + + 描述:不大于参数的最大整数。 + + 返回值类型:与输入相同。 + + 示例: + + ```sql + MogDB=# SELECT floor(-42.8); + floor + ------- + -43 + (1 row) + ``` + +- int1(in) + + 描述:将传入的text参数转换为int1类型值并返回。 + + 返回值类型:int1 + + 示例: + + ```sql + MogDB=# select int1('123'); + int1 + ------ + 123 + (1 row) + MogDB=# select int1('a'); + int1 + ------ + 0 + (1 row) + ``` + +- int2(in) + + 描述:将传入参数转换为int2类型值并返回。 + + 支持的入参类型包括float4、float8、int16、numeric、text。 + + 返回值类型:int2 + + 示例: + + ```sql + MogDB=# select int2('1234'); + int2 + ------ + 1234 + (1 row) + MogDB=# select int2(25.3); + int2 + ------ + 25 + (1 row) + ``` + +- int4(in) + + 描述:将传入参数转换为int4类型值并返回。 + + 支持的入参类型包括bit、boolean、char、duoble precision、int16、numeric、real、smallint、text。 + + 返回值类型:int4 + + 示例: + + ```sql + MogDB=# select int4('789'); + int4 + ------ + 789 + (1 row) + MogDB=# select int4(99.9); + int4 + ------ + 99 + (1 row) + ``` + +- float4\(in\) + + 描述:将传入参数转换为float4类型值并返回。支持的入参类型包括:bigint、duoble precision、int16、integer、numeric、smallint、text。 + + 返回值类型:float4 + + 示例: + + ``` + MogDB=# select float4('789'); + float4 + -------- + 789 + (1 row) + + MogDB=# select float4(99.9); + float4 + -------- + 99.9 + (1 row) + ``` + +- float8\(in\) + + 描述:将传入参数转换为float8类型值并返回。支持的入参类型包括:bigint、int16、integer、numeric、real、smallint、text。 + + 返回值类型:float8 + + 示例: + + ``` + MogDB=# select float8('789'); + float8 + -------- + 789 + (1 row) + + MogDB=# select float8(99.9); + float8 + -------- + 99.9 + (1 row) + ``` + +- int16\(in\) + + 描述:将传入参数转换为int16类型值并返回。支持的入参类型包括:bigint、boolean、double precision、integer、numeric、oid、real、smallint、tinyint。 + + 返回值类型:int16 + + 示例: + + ``` + MogDB=# select int16('789'); + int16 + -------- + 789 + (1 row) + + MogDB=# select int16(99.9); + int16 + -------- + 99 + (1 row) + ``` + +- numeric\(in\) + + 描述:将传入参数转换为numeric类型值并返回。支持的入参类型包括:bigint、boolean、double precision、int16、integer、money、real、smallint。 + + 返回值类型:numeric + + 示例: + + ``` + MogDB=# select "numeric"('789'); + numeric + --------- + 789 + (1 row) + + MogDB=# select "numeric"(99.9); + numeric + --------- + 99.9 + (1 row) + ``` + +- oid\(in\) + + 描述:将传入参数转换为oid类型值并返回。支持的入参类型包括:bigint、int16。 + + 返回值类型:oid + +- radians(dp) + + 描述:把角度转为弧度。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT radians(45.0); + radians + ------------------ + .785398163397448 + (1 row) + ``` + +- random() + + 描述:0.0到1.0之间的随机数。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT random(); + random + ------------------ + .824823560658842 + (1 row) + ``` + +- multiply(x double precision or text, y double precision or text) + + 描述:x和y的乘积。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT multiply(9.0, '3.0'); + multiply + ------------------- + 27 + (1 row) + MogDB=# SELECT multiply('9.0', 3.0); + multiply + ------------------- + 27 + (1 row) + ``` + +- ln(x) + + 描述:自然对数。 + + 返回值类型:dp or numeric,不考虑隐式类型转换的情况下与输入相同。 + + 示例: + + ```sql + MogDB=# SELECT ln(2.0); + ln + ------------------- + .6931471805599453 + (1 row) + ``` + +- log(x) + + 描述:以10为底的对数。 + + 返回值类型:与输入相同。 + + 示例: + + ```sql + MogDB=# SELECT log(100.0); + log + -------------------- + 2.0000000000000000 + (1 row) + ``` + +- log(b numeric, x numeric) + + 描述:以b为底的对数。 + + 返回值类型:numeric + + 示例: + + ```sql + MogDB=# SELECT log(2.0, 64.0); + log + -------------------- + 6.0000000000000000 + (1 row) + ``` + +- mod(x,y) + + 描述:x/y的余数(模)。如果x是0,则返回0。 + + 返回值类型:与参数类型相同。 + + 示例: + + ```sql + MogDB=# SELECT mod(9,4); + mod + ----- + 1 + (1 row) + ``` + + ```sql + MogDB=# SELECT mod(9,0); + mod + ----- + 9 + (1 row) + ``` + +- pi() + + 描述:"π"常量。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT pi(); + pi + ------------------ + 3.14159265358979 + (1 row) + ``` + +- power(a double precision, b double precision) + + 描述:a的b次幂。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT power(9.0, 3.0); + power + ---------------------- + 729.0000000000000000 + (1 row) + ``` + +- remainder(n2 numeric,n1 numeric) + + 描述:返回n2 除以 n1 的余数。 + + 返回值类型:numeric + + 示例: + + ```sql + MogDB=# select REMAINDER(11,3); + remainder + ----------- + -1 + (1 row) + ``` + +- round(x) + + 描述:离输入参数最近的整数。 + + 返回值类型:与输入相同。 + + 示例: + + ```sql + MogDB=# SELECT round(42.4); + round + ------- + 42 + (1 row) + + MogDB=# SELECT round(42.6); + round + ------- + 43 + (1 row) + ``` + +- round(v numeric, s int) + + 描述:保留小数点后s位,s后一位进行四舍五入。 + + 返回值类型:numeric + + 示例: + + ```sql + MogDB=# SELECT round(42.4382, 2); + round + ------- + 42.44 + (1 row) + ``` + +- setseed(dp) + + 描述:为随后的random()调用设置种子(-1.0到1.0之间,包含)。 + + 返回值类型:void + + 示例: + + ```sql + MogDB=# SELECT setseed(0.54823); + setseed + --------- + + (1 row) + ``` + +- sign(x) + + 描述:输出此参数的符号。 + + 返回值类型:-1表示负数,0表示0,1表示正数。 + + 示例: + + ```sql + MogDB=# SELECT sign(-8.4); + sign + ------ + -1 + (1 row) + ``` + +- sin(x) + + 描述:正弦。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT sin(1.57079); + sin + ------------------ + .999999999979986 + (1 row) + ``` + +- sqrt(x) + + 描述:平方根。 + + 返回值类型:dp or numeric,不考虑隐式类型转换的情况下与输入相同。 + + 示例: + + ```sql + MogDB=# SELECT sqrt(2.0); + sqrt + ------------------- + 1.414213562373095 + (1 row) + ``` + +- tan(x) + + 描述:正切。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT tan(20); + tan + ------------------ + 2.23716094422474 + (1 row) + ``` + +- trunc(x) + + 描述:截断(取整数部分)。 + + 返回值类型:与输入相同。 + + 示例: + + ```sql + MogDB=# SELECT trunc(42.8); + trunc + ------- + 42 + (1 row) + ``` + +- trunc(v numeric, s int) + + 描述:截断为s位小数。 + + 返回值类型:numeric + + 示例: + + ```sql + MogDB=# SELECT trunc(42.4382, 2); + trunc + ------- + 42.43 + (1 row) + ``` + +- smgrne(a smgr, b smgr) + + 描述:比较两个smgr类型整数是否不相等。 + + 返回值类型:bool + +- smgreq(a smgr, b smgr) + + 描述:比较两个smgr类型整数是否相等。 + + 返回值类型:bool + +- int1abs + + 描述:返回uint8类型数据的绝对值。 + + 参数:tinyint + + 返回值类型:tinyint + +- int1and + + 描述:返回两个uint8类型数据按位与的结果。 + + 参数:tinyint, tinyint + + 返回值类型:tinyint + +- int1cmp + + 描述:返回两个uint8类型数据比较的结果,若第一个参数大,则返回1;若第二个参数大,则返回-1;若相等,则返回0。 + + 参数:tinyint, tinyint + + 返回值类型:integer + +- int1div + + 描述:返回两个uint8类型数据相除的结果,结果为float8类型。 + + 参数:tinyint, tinyint + + 返回值类型:tinyint + +- int1eq + + 描述:比较两个uint8类型数据是否相等。 + + 参数:tinyint, tinyint + + 返回值类型:boolean + +- int1ge + + 描述:判断两个uint8类型数据是否第一个参数大于等于第二个参数。 + + 参数:tinyint, tinyint + + 返回值类型:boolean + +- int1gt + + 描述:无符号1字节整数做大于运算。 + + 参数:tinyint, tinyint + + 返回值类型:boolean + +- int1larger + + 描述:无符号1字节整数求最大值。 + + 参数:tinyint, tinyint + + 返回值类型:tinyint + +- int1le + + 描述:无符号1字节整数做小于等于运算。 + + 参数:tinyint, tinyint + + 返回值类型:boolean + +- int1lt + + 描述:无符号1字节整数做小于运算。 + + 参数:tinyint, tinyint + + 返回值类型:boolean + +- int1smaller + + 描述:无符号1字节整数求最小算。 + + 参数:tinyint, tinyint + + 返回值类型:tinyint + +- int1inc + + 描述:无符号1字节整数加一。 + + 参数:tinyint + + 返回值类型:tinyint + +- int1mi + + 描述:无符号一字节整数做差运算。 + + 参数:tinyint, tinyint + + 返回值类型:tinyint + +- int1mod + + 描述:无符号一字节整数做取余运算。 + + 参数:tinyint, tinyint + + 返回值类型:tinyint + +- int1mul + + 描述:无符号一字节整数做乘法运算。 + + 参数:tinyint, tinyint + + 返回值类型:tinyint + +- int1ne + + 描述:无符号一字节整数不等于运算。 + + 参数:tinyint, tinyint + + 返回值类型:boolean + +- int1pl + + 描述:无符号一字节整数加法。 + + 参数:tinyint, tinyint + + 返回值类型:tinyint + +- int1um + + 描述:无符号一字节数去相反数并返回有符号二字节整数。 + + 参数:tinyint + + 返回值类型:smallint + +- int1xor + + 描述:无符号一字节整数异或操作。 + + 参数:tinyint, tinyint + + 返回值类型:tinyint + +- cash_div_int1 + + 描述:对money类型进行除法运算。 + + 参数:money, tinyint + + 返回值类型:money + +- cash_mul_int1 + + 描述:对money类型进行乘法运算。 + + 参数:money, tinyint + + 返回值类型:money + +- int1not + + 描述:无符号一字节整数二进制位翻转。 + + 参数:tinyint + + 返回值类型:tinyint + +- int1or + + 描述:无符号一字节整数或运算。 + + 参数:tinyint, tinyint + + 返回值类型:tinyint + +- int1shl + + 描述:无符号一字节整数左移指定位数。 + + 参数:tinyint, integer + + 返回值类型:tinyint + +- width_bucket(op numeric, b1 numeric, b2 numeric, count int) + + 描述:返回一个桶,这个桶是在一个有count个桶,上界为b1下界为b2的等深柱图中operand将被赋予的那个桶。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT width_bucket(5.35, 0.024, 10.06, 5); + width_bucket + -------------- + 3 + (1 row) + ``` + +- width_bucket(op dp, b1 dp, b2 dp, count int) + + 描述:返回一个桶,这个桶是在一个有count个桶,上界为b1下界为b2的等深柱图中operand将被赋予的那个桶。 + + 返回值类型:int + + 示例: + + ```sql + MogDB=# SELECT width_bucket(5.35, 0.024, 10.06, 5); + width_bucket + -------------- + 3 + (1 row) + ``` diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/8-date-and-time-processing-functions-and-operators.md b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/8-date-and-time-processing-functions-and-operators.md index 492d6e3098cba9b129114ca156d13c19b092b1fb..644785870671ac79ae5e197e9d37c7ed27f6be00 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/8-date-and-time-processing-functions-and-operators.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/functions-and-operators/8-date-and-time-processing-functions-and-operators.md @@ -1,1330 +1,1390 @@ ---- -title: 时间和日期处理函数和操作符 -summary: 时间和日期处理函数和操作符 -author: Zhang Cuiping -date: 2021-04-20 ---- - -# 时间和日期处理函数和操作符 - -## 时间日期操作符 - -> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-warning.gif) **警告:** -> 用户在使用时间和日期操作符时,对应的操作数请使用明确的类型前缀修饰,以确保数据库在解析操作数的时候能够与用户预期一致,不会产生用户非预期的结果。 -> 比如下面示例没有明确数据类型就会出现异常错误。 -> -> ```sql -> SELECT date '2001-10-01' - '7' AS RESULT; -> ``` - -**表 1** 时间和日期操作符 - -| 操作符 | 示例 | -| ------ | ------------------------------------------------------------ | -| + | MogDB=# SELECT date '2001-09-28' + integer '7' AS RESULT;
result
-----------------
2001-10-05
(1 row) | -| | MogDB=# SELECT date '2001-09-28' + interval '1 hour' AS RESULT;
result
-----------------------------
2001-09-28 01:00:00
(1 row) | -| | MogDB=# SELECT date '2001-09-28' + time '03:00' AS RESULT;
result
-------------------------------
2001-09-28 03:00:00
(1 row) | -| | MogDB=# SELECT interval '1 day' + interval '1 hour' AS RESULT;
result
----------------------
1 day 01:00:00
(1 row) | -| | MogDB=# SELECT timestamp '2001-09-28 01:00' + interval '23 hours' AS RESULT;
result
------------------------------
2001-09-29 00:00:00
(1 row) | -| | MogDB=# SELECT time '01:00' + interval '3 hours' AS RESULT;
result
-------------
04:00:00
(1 row) | -| - | MogDB=# SELECT date '2001-10-01' - date '2001-09-28' AS RESULT;
result
----------
3days
(1 row) | -| | MogDB=# SELECT date '2001-10-01' - integer '7' AS RESULT;
result
-------------------------------
2001-09-24 00:00:00
(1 row) | -| | MogDB=# SELECT date '2001-09-28' - interval '1 hour' AS RESULT;
result
--------------------------------
2001-09-27 23:00:00
(1 row) | -| | MogDB=# SELECT time '05:00' - time '03:00' AS RESULT;
result
-------------
02:00:00
(1 row) | -| | MogDB=# SELECT time '05:00' - interval '2 hours' AS RESULT;
result
-------------
03:00:00
(1 row) | -| | MogDB=# SELECT timestamp '2001-09-28 23:00' - interval '23 hours' AS RESULT;
result
-------------------------------
2001-09-28 00:00:00
(1 row) | -| | MogDB=# SELECT interval '1 day' - interval '1 hour' AS RESULT;
result
-------------
23:00:00
(1 row) | -| | MogDB=# SELECT timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' AS RESULT;
result
---------------------
1 day 15:00:00
(1 row) | -| * | MogDB=# SELECT 900 * interval '1 second' AS RESULT;
result
--------------
00:15:00
(1 row) | -| | MogDB=# SELECT 21 * interval '1 day' AS RESULT;
result
-------------
21 days
(1 row) | -| | MogDB=# SELECT double precision '3.5' * interval '1 hour' AS RESULT;
result
--------------
03:30:00
(1 row) | -| / | MogDB=# SELECT interval '1 hour' / double precision '1.5' AS RESULT;
result
-------------
00:40:00
(1 row) | - -## 时间/日期函数 - -- age(timestamp, timestamp) - - 描述:将两个参数相减,并以年、月、日作为返回值。若相减值为负,则函数返回亦为负,入参可以都带timezone或都不带timezone。 - - 返回值类型:interval - - 示例: - - ```sql - MogDB=# SELECT age(timestamp '2001-04-10', timestamp '1957-06-13'); - age - ------------------------- - 43 years 9 mons 27 days - (1 row) - ``` - -- age(timestamp) - - 描述:当前时间和参数相减,入参可以带或者不带timezone。 - - 返回值类型:interval - - 示例: - - ```sql - MogDB=# SELECT age(timestamp '1957-06-13'); - age - ------------------------- - 60 years 2 mons 18 days - (1 row) - ``` - -- clock_timestamp() - - 描述:实时时钟的当前时间戳。 - - 返回值类型:timestamp with time zone - - 示例: - - ```sql - MogDB=# SELECT clock_timestamp(); - clock_timestamp - ------------------------------- - 2017-09-01 16:57:36.636205+08 - (1 row) - ``` - -- current_date - - 描述:当前日期。 - - 返回值类型:date - - 示例: - - ```sql - MogDB=# SELECT current_date; - date - ------------ - 2017-09-01 - (1 row) - ``` - -- current_time - - 描述:当前时间。 - - 返回值类型:time with time zone - - 示例: - - ```sql - MogDB=# SELECT current_time; - timetz - -------------------- - 16:58:07.086215+08 - (1 row) - ``` - -- current_timestamp - - 描述:当前日期及时间。 - - 返回值类型:timestamp with time zone - - 示例: - - ```sql - MogDB=# SELECT current_timestamp; - pg_systimestamp - ------------------------------ - 2017-09-01 16:58:19.22173+08 - (1 row) - ``` - -- systimestamp - - 描述:返回数据库所在系统的系统日期,包括分数秒和时区。 - - 返回值类型:TIMESTAMP WITH TIME ZONE - - 示例: - - ```sql - MogDB=# select systimestamp; - pg_systimestamp - ----------------------------- - 2021-12-24 14:34:24.6903+08 - (1 row) - ``` - -- date_part(text, timestamp) - - 描述:获取日期/时间值中子域的值,例如年或者小时的值。等效于extract(field from timestamp)。 - - timestamp类型:abstime、date、interval、reltime、time with time zone、time without time zone、timestamp with time zone、timestamp without time zone。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT date_part('hour', timestamp '2001-02-16 20:38:40'); - date_part - 20 - (1 row) - ``` - -- date_part(text, interval) - - 描述:获取日期/时间值中子域的值。获取月份值时,如果月份值大于12,则取与12的模。等效于extract(field from timestamp)。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT date_part('month', interval '2 years 3 months'); - date_part - ----------- - 3 - (1 row) - ``` - -- date_trunc(text, timestamp) - - 描述:截取到参数text指定的精度。 - - 返回值类型:interval、timestamp with time zone、timestamp without time zone - - 示例: - - ```sql - MogDB=# SELECT date_trunc('hour', timestamp '2001-02-16 20:38:40'); - date_trunc - --------------------- - 2001-02-16 20:00:00 - (1 row) - ``` - -- trunc(timestamp) - - 描述:默认按天截取。 - - 示例: - - ```sql - MogDB=# SELECT trunc(timestamp '2001-02-16 20:38:40'); trunc - --------------------- - 2001-02-16 00:00:00 - (1 row) - ``` - -- daterange(arg1, arg2) - - 描述:获取时间边界信息。arg1和arg2的类型为date。 - - 返回值类型:daterange - - 示例: - - ```sql - MogDB=# select daterange('2000-05-06','2000-08-08'); - daterange - ------------------------- - [2000-05-06,2000-08-08) - (1 row) - ``` - -- daterange(arg1, arg2, text) - - 描述:获取时间边界信息。arg1和arg2的类型为date,text类型为text。 - - 返回值类型:daterange - - 示例: - - ```sql - MogDB=# select daterange('2000-05-06','2000-08-08','[]'); - daterange - ------------------------- - [2000-05-06,2000-08-09) - (1 row) - ``` - -- extract(field from timestamp) - - 描述:获取小时的值。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT extract(hour from timestamp '2001-02-16 20:38:40'); - date_part - ----------- - 20 - (1 row) - ``` - -- extract(field from interval) - - 描述:获取月份的值。如果大于12,则取与12的模。 - - 返回值类型:double precision - - 示例: - - ```sql - MogDB=# SELECT extract(month from interval '2 years 3 months'); - date_part - ----------- - 3 - (1 row) - ``` - -- isfinite(date) - - 描述:测试是否为有效日期。 - - 返回值类型:Boolean - - 示例: - - ```sql - MogDB=# SELECT isfinite(date '2001-02-16'); - isfinite - ---------- - t - (1 row) - ``` - -- isfinite(timestamp) - - 描述:测试判断是否为有效时间。 - - 返回值类型:Boolean - - 示例: - - ```sql - MogDB=# SELECT isfinite(timestamp '2001-02-16 21:28:30'); - isfinite - ---------- - t - (1 row) - ``` - -- isfinite(interval) - - 描述:测试是否为有效区间。 - - 返回值类型:Boolean - - 示例: - - ```sql - MogDB=# SELECT isfinite(interval '4 hours'); - isfinite - ---------- - t - (1 row) - ``` - -- justify_days(interval) - - 描述:将时间间隔以月(30天为一月)为单位。 - - 返回值类型:interval - - 示例: - - ```sql - MogDB=# SELECT justify_days(interval '35 days'); - justify_days - -------------- - 1 mon 5 days - (1 row) - ``` - -- justify_hours(interval) - - 描述:将时间间隔以天(24小时为一天)为单位。 - - 返回值类型:interval - - 示例: - - ```sql - MogDB=# SELECT JUSTIFY_HOURS(INTERVAL '27 HOURS'); - justify_hours - ---------------- - 1 day 03:00:00 - (1 row) - ``` - -- justify_interval(interval) - - 描述:结合justify_days和justify_hours,调整interval。 - - 返回值类型:interval - - 示例: - - ```sql - MogDB=# SELECT JUSTIFY_INTERVAL(INTERVAL '1 MON -1 HOUR'); - justify_interval - ------------------ - 29 days 23:00:00 - (1 row) - ``` - -- localtime - - 描述:当前时间。 - - 返回值类型:time - - 示例: - - ```sql - MogDB=# SELECT localtime AS RESULT; - result - ---------------- - 16:05:55.664681 - (1 row) - ``` - -- localtimestamp - - 描述:当前日期及时间。 - - 返回值类型:timestamp - - 示例: - - ```sql - MogDB=# SELECT localtimestamp; - timestamp - ---------------------------- - 2017-09-01 17:03:30.781902 - (1 row) - ``` - -- now() - - 描述:当前日期及时间。 - - 返回值类型:timestamp with time zone - - 示例: - - ```sql - MogDB=# SELECT now(); - now - ------------------------------- - 2017-09-01 17:03:42.549426+08 - (1 row) - ``` - -- timenow - - 描述:当前日期及时间。 - - 返回值类型:timestamp with time zone - - 示例: - - ```sql - MogDB=# select timenow(); - timenow - ------------------------ - 2020-06-23 20:36:56+08 - (1 row) - ``` - -- numtodsinterval(num, interval_unit) - - 描述:将数字转换为interval类型。num为numeric类型数字,interval_unit为固定格式字符串('DAY' | 'HOUR' | 'MINUTE' | 'SECOND')。 - - 可以通过设置参数IntervalStyle为a,兼容该函数interval输出格式。 - - 示例: - - ```sql - MogDB=# SELECT numtodsinterval(100, 'HOUR'); - numtodsinterval - ----------------- - 100:00:00 - (1 row) - - MogDB=# SET intervalstyle = a; - SET - MogDB=# SELECT numtodsinterval(100, 'HOUR'); - numtodsinterval - ------------------------------- - +000000004 04:00:00.000000000 - (1 row) - ``` - -- pg_sleep(seconds) - - 描述:服务器线程延迟时间,单位为秒。 - - 返回值类型:void - - 示例: - - ```sql - MogDB=# SELECT pg_sleep(10); - pg_sleep - ---------- - - (1 row) - ``` - -- statement_timestamp() - - 描述:当前日期及时间。 - - 返回值类型:timestamp with time zone - - 示例: - - ```sql - MogDB=# SELECT statement_timestamp(); - statement_timestamp - ------------------------------- - 2017-09-01 17:04:39.119267+08 - (1 row) - ``` - -- sysdate - - 描述:当前日期及时间。 - - 返回值类型:timestamp - - 示例: - - ```sql - MogDB=# SELECT sysdate; - sysdate - --------------------- - 2017-09-01 17:04:49 - (1 row) - ``` - -- timeofday() - - 描述:当前日期及时间(像clock_timestamp,但是返回时为text)。 - - 返回值类型:text - - 示例: - - ```sql - MogDB=# SELECT timeofday(); - timeofday - ------------------------------------- - Fri Sep 01 17:05:01.167506 2017 CST - (1 row) - ``` - -- transaction_timestamp() - - 描述:当前日期及时间,与current_timestamp等效。 - - 返回值类型:timestamp with time zone - - 示例: - - ```sql - MogDB=# SELECT transaction_timestamp(); - transaction_timestamp - ------------------------------- - 2017-09-01 17:05:13.534454+08 - (1 row) - ``` - -- add_months(d,n) - - 描述:用于计算时间点d再加上n个月的时间。 - - 返回值类型:timestamp - - 示例: - - ```sql - MogDB=# SELECT add_months(to_date('2017-5-29', 'yyyy-mm-dd'), 11) FROM dual; - add_months - --------------------- - 2018-04-29 00:00:00 - (1 row) - ``` - -- last_day(d) - - 描述:用于计算时间点d当月最后一天的时间。 - - 返回值类型:timestamp - - 示例: - - ```sql - MogDB=# select last_day(to_date('2017-01-01', 'YYYY-MM-DD')) AS cal_result; - cal_result - --------------------- - 2017-01-31 00:00:00 - (1 row) - ``` - -- next_day(x,y) - - 描述:用于计算时间点x开始的下一个星期几(y)的时间。 - - 返回值类型:timestamp - - 示例: - - ```sql - MogDB=# select next_day(timestamp '2017-05-25 00:00:00','Sunday')AS cal_result; - cal_result - --------------------- - 2017-05-28 00:00:00 - (1 row) - ``` - -- tinterval(abstime, abstime ) - - 描述:用两个绝对时间创建时间间隔。 - - 返回值类型:tinterval - - 示例: - - ```sql - MogDB=# call tinterval(abstime 'May 10, 1947 23:59:12', abstime 'Mon May 1 00:30:30 1995'); - tinterval - ----------------------------------------------------- - ["1947-05-10 23:59:12+09" "1995-05-01 00:30:30+08"] - (1 row) - ``` - -- tintervalend(tinterval) - - 描述:返回tinteval的结束时间。 - - 返回值类型:abstime - - 示例: - - ```sql - MogDB=# select tintervalend('["Sep 4, 1983 23:59:12" "Oct4, 1983 23:59:12"]'); - tintervalend - ------------------------ - 1983-10-04 23:59:12+08 - (1 row) - ``` - -- tintervalrel(tinterval) - - 描述:计算并返回tinterval的相对时间。 - - 返回值类型:reltime - - 示例: - - ```sql - MogDB=# select tintervalrel('["Sep 4, 1983 23:59:12" "Oct4, 1983 23:59:12"]'); - tintervalrel - -------------- - 1 mon - (1 row) - ``` - -- smalldatetime_ge - - 描述:判断是否第一个参数大于等于第二个参数。 - - 参数:smalldatetime, smalldatetime - - 返回值类型:boolean - -- smalldatetime_cmp - - 描述:对比smalldatetime是否相等。 - - 参数:smalldatetime, smalldatetime - - 返回值类型:integer - -- smalldatetime_eq - - 描述:对比smalldatetime是否相等。 - - 参数:smalldatetime, smalldatetime - - 返回值类型:boolean。 - -- smalldatetime_gt - - 描述:判断是否第一个参数大于第二个参数。 - - 参数:smalldatetime, smalldatetime - - 返回值类型:boolean - -- smalldatetime_hash - - 描述:计算timestamp对应的哈希值。 - - 参数:smalldatetime - - 返回值类型:integer - -- smalldatetime_in - - 描述:输入timestamp。 - - 参数:cstring, oid, integer - - 返回值类型:smalldatetime - -- smalldatetime_larger - - 描述:返回较大的timestamp。 - - 参数:smalldatetime, smalldatetime - - 返回值类型:smalldatetime - -- smalldatetime_le - - 描述:判断是否第一个参数小于等于第二个参数。 - - 参数:smalldatetime, smalldatetime - - 返回值类型:boolean - -- smalldatetime_lt - - 描述:判断是否第一个参数小于第二个参数。 - - 参数:smalldatetime, smalldatetime - - 返回值类型:boolean - -- smalldatetime_ne - - 描述:比较两个timestamp是否不相等。 - - 参数:smalldatetime, smalldatetime - - 返回值类型:boolean - -- smalldatetime_out - - 描述:timestamp转换为外部形式。 - - 参数:smalldatetime - - 返回值类型:cstring - -- smalldatetime_send - - 描述:timestamp转换为二进制格式。 - - 参数:smalldatetime - - 返回值类型:bytea - -- smalldatetime_smaller - - 描述:返回较小的一个smalldatetime。 - - 参数:smalldatetime, smalldatetime - - 返回值类型:smalldatetime - -- smalldatetime_to_abstime - - 描述:smalldatetime转换为abstime。 - - 参数:smalldatetime - - 返回值类型:abstime - -- smalldatetime_to_time - - 描述:smalldatetime转换为time。 - - 参数:smalldatetime - - 返回值类型:time without time zone - -- smalldatetime_to_timestamp - - 描述:smalldatetime转换为timestamp。 - - 参数:smalldatetime - - 返回值类型:timestamp without time zone - -- smalldatetime_to_timestamptz - - 描述:smalldatetime转换为timestamptz。 - - 参数:smalldatetime - - 返回值类型:timestamp with time zone - -- smalldatetime_to_varchar2 - - 描述:smalldatetime转换为varchar2。 - - 参数:smalldatetime - - 返回值类型:character varying - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: - > - > 获取当前时间有多种方式,请根据实际业务从场景选择合适的接口: - > - > 1. 以下接口按照当前事务的开始时刻返回值: - > - > ```sql - > CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_TIME(precision) CURRENT_TIMESTAMP(precision) LOCALTIME LOCALTIMESTAMP LOCALTIME(precision) LOCALTIMESTAMP(precision) - > ``` - > - > 其中CURRENT_TIME和CURRENT_TIMESTAMP传递带有时区的值;LOCALTIME和LOCALTIMESTAMP传递的值不带时区。CURRENT_TIME、CURRENT_TIMESTAMP、LOCALTIME和 LOCALTIMESTAMP可以有选择地接受一个精度参数, 该精度导致结果的秒域被园整为指定小数位。如果没有精度参数,结果将被给予所能得到的全部精度。 - > - > 因为这些函数全部都按照当前事务的开始时刻返回结果,所以它们的值在事务运行的整个期间内都不改变。 我们认为这是一个特性:目的是为了允许一个事务在“当前”时间上有一致的概念, 这样在同一个事务里的多个修改可以保持同样的时间戳。 - > - > 2. 以下接口返回当前语句开始时间: - > - > ```sql - > transaction_timestamp() statement_timestamp() now() - > ``` - > - > 其中transaction_timestamp()等价于CURRENT_TIMESTAMP,但是其命名清楚地反映了它的返回值。statement_timestamp()返回当前语句的开始时刻(更准确的说是收到 客户端最后一条命令的时间)。statement_timestamp()和transaction_timestamp()在一个事务的第一条命令期间返回值相同,但是在随后的命令中却不一定相同。 - > - > now()等效于transaction_timestamp()。 - > - > 3. 以下接口返回函数被调用时的真实当前时间: - > - > ```sql - > clock_timestamp() timeofday() - > ``` - > - > clock_timestamp()返回真正的当前时间,因此它的值甚至在同一条 SQL 命令中都会变化。timeofday()和clock_timestamp()相似,timeofday()也返回真实的当前时间,但是它的结果是一个格式化的text串,而不是timestamp with time zone值。 - -## TIMESTAMPDIFF - -- **TIMESTAMPDIFF(unit , timestamp_expr1, timestamp_expr2)** - -timestampdiff函数是计算两个日期时间之间(timestamp_expr2-timestamp_expr1)的差值,并以unit形式返回结果。timestamp_expr1,timestamp_expr2必须是一个timestamp、timestamptz、date类型的值表达式。unit表示的是两个日期差的单位。 - -> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** -> 该函数仅在MogDB兼容MY类型时(即dbcompatibility = 'B')有效,其他类型不支持该函数。 - -- year - - 年份。 - - ```sql - MogDB=# SELECT TIMESTAMPDIFF(YEAR, '2018-01-01', '2020-01-01'); - timestamp_diff - ---------------- - 2 - (1 row) - ``` - -- quarter - - 季度。 - - ```sql - MogDB=# SELECT TIMESTAMPDIFF(QUARTER, '2018-01-01', '2020-01-01'); - timestamp_diff - ---------------- - 8 - (1 row) - ``` - -- month - - 月份。 - - ```sql - MogDB=# SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2020-01-01'); - timestamp_diff - ---------------- - 24 - (1 row) - ``` - -- week - - 星期。 - - ```sql - MogDB=# SELECT TIMESTAMPDIFF(WEEK, '2018-01-01', '2020-01-01'); - timestamp_diff - ---------------- - 104 - (1 row) - ``` - -- day - - 天。 - - ```sql - MogDB=# SELECT TIMESTAMPDIFF(DAY, '2018-01-01', '2020-01-01'); - timestamp_diff - ---------------- - 730 - (1 row) - ``` - -- hour - - 小时。 - - ```sql - MogDB=# SELECT TIMESTAMPDIFF(HOUR, '2020-01-01 10:10:10', '2020-01-01 11:11:11'); - timestamp_diff - ---------------- - 1 - (1 row) - - ``` - -- minute - - 分钟。 - - ```sql - MogDB=# SELECT TIMESTAMPDIFF(MINUTE, '2020-01-01 10:10:10', '2020-01-01 11:11:11'); - timestamp_diff - ---------------- - 61 - (1 row) - - ``` - -- second - - 秒。 - - ```sql - MogDB=# SELECT TIMESTAMPDIFF(SECOND, '2020-01-01 10:10:10', '2020-01-01 11:11:11'); - timestamp_diff - ---------------- - 3661 - (1 row) - - ``` - -- microseconds - - 秒域(包括小数部分)乘以1,000,000。 - - ```sql - MogDB=# SELECT TIMESTAMPDIFF(MICROSECOND, '2020-01-01 10:10:10.000000', '2020-01-01 10:10:10.111111'); - timestamp_diff - ---------------- - 111111 - (1 row) - - ``` - -- timestamp_expr含有时区 - - ```sql - MogDB=# SELECT TIMESTAMPDIFF(HOUR,'2020-05-01 10:10:10-01','2020-05-01 10:10:10-03'); - timestamp_diff - ---------------- - 2 - (1 row) - ``` - -## EXTRACT - -- **EXTRACT**(field **FROM** source) - - extract函数从日期或时间的数值里抽取子域,比如年、小时等。source必须是一个timestamp、time或interval类型的值表达式(类型为date的表达式转换为timestamp,因此也可以用)。field是一个标识符或者字符串,它指定从源数据中抽取的域。extract函数返回类型为double precision的数值。field的取值范围如下所示。 - -- century - - 世纪。 - - 第一个世纪从0001-01-01 00:00:00 AD开始。这个定义适用于所有使用阳历的国家。没有0世纪,直接从公元前1世纪到公元1世纪。 - - 示例: - - ```sql - MogDB=# SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); - date_part - ----------- - 20 - (1 row) - ``` - -- day - - - 如果source为timestamp,表示月份里的日期(1-31)。 - - ```sql - MogDB=# SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40'); - date_part - ----------- - 16 - (1 row) - ``` - - - 如果source为interval,表示天数。 - - ```sql - MogDB=# SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute'); - date_part - ----------- - 40 - (1 row) - ``` - -- decade - - 年份除以10。 - - ```sql - MogDB=# SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40'); - date_part - ----------- - 200 - (1 row) - ``` - -- dow - - 每周的星期几,星期天(0)到星期六(6)。 - - ```sql - MogDB=# SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); - date_part - ----------- - 5 - (1 row) - ``` - -- doy - - 一年的第几天(1~365/366)。 - - ```sql - MogDB=# SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40'); - date_part - ----------- - 47 - (1 row) - ``` - -- epoch - - - 如果source为timestamp with time zone,表示自1970-01-01 00:00:00-00 UTC以来的秒数(结果可能是负数); - - 如果source为date和timestamp,表示自1970-01-01 00:00:00-00当地时间以来的秒数; - - 如果source为interval,表示时间间隔的总秒数。 - - ```sql - MogDB=# SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08'); - date_part - -------------- - 982384720.12 - (1 row) - ``` - - ```sql - MogDB=# SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); - date_part - ----------- - 442800 - (1 row) - ``` - - - 将epoch值转换为时间戳的方法。 - - ```sql - MogDB=# SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720.12 * INTERVAL '1 second' AS RESULT; - result - --------------------------- - 2001-02-17 12:38:40.12+08 - (1 row) - ``` - -- hour - - 小时域(0-23)。 - - ```sql - MogDB=# SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40'); - date_part - ----------- - 20 - (1 row) - ``` - -- isodow - - 一周的第几天(1-7)。 - - 星期一为1,星期天为7。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** - > 除了星期天外,都与dow相同。 - - ```sql - MogDB=# SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40'); - date_part - ----------- - 7 - (1 row) - ``` - -- isoyear - - 日期中的ISO 8601标准年(不适用于间隔)。 - - 每个带有星期一开始的周中包含1月4日的ISO年,所以在年初的1月或12月下旬的ISO年可能会不同于阳历的年。详细信息请参见后续的week描述。 - - ```sql - MogDB=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01'); - date_part - ----------- - 2005 - (1 row) - ``` - - ```sql - MogDB=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); - date_part - ----------- - 2006 - (1 row) - ``` - -- microseconds - - 秒域(包括小数部分)乘以1,000,000。 - - ```sql - MogDB=# SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5'); - date_part - ----------- - 28500000 - (1 row) - ``` - -- millennium - - 千年。 - - 20世纪(19xx年)里面的年份在第二个千年里。第三个千年从2001年1月1日零时开始。 - - ```sql - MogDB=# SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40'); - date_part - ----------- - 3 - (1 row) - ``` - -- milliseconds - - 秒域(包括小数部分)乘以1000。请注意它包括完整的秒。 - - ```sql - MogDB=# SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5'); - date_part - ----------- - 28500 - (1 row) - ``` - -- minute - - 分钟域(0-59)。 - - ```sql - MogDB=# SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40'); - date_part - ----------- - 38 - (1 row) - ``` - -- month - - 如果source为timestamp,表示一年里的月份数(1-12)。 - - ```sql - MogDB=# SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40'); - date_part - ----------- - 2 - (1 row) - ``` - - 如果source为interval,表示月的数目,然后对12取模(0-11)。 - - ```sql - MogDB=# SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months'); - date_part - ----------- - 1 - (1 row) - ``` - -- quarter - - 该天所在的该年的季度(1-4)。 - - ```sql - MogDB=# SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40'); - date_part - ----------- - 1 - (1 row) - ``` - -- second - - 秒域,包括小数部分(0-59)。 - - ```sql - MogDB=# SELECT EXTRACT(SECOND FROM TIME '17:12:28.5'); - date_part - ----------- - 28.5 - (1 row) - ``` - -- timezone - - 与UTC的时区偏移量,单位为秒。正数对应UTC东边的时区,负数对应UTC西边的时区。 - -- timezone_hour - - 时区偏移量的小时部分。 - -- timezone_minute - - 时区偏移量的分钟部分。 - -- week - - 该天在所在的年份里是第几周。ISO 8601定义一年的第一周包含该年的一月四日(ISO-8601 的周从星期一开始)。换句话说,一年的第一个星期四在第一周。 - - 在ISO定义里,一月的头几天可能是前一年的第52或者第53周,十二月的后几天可能是下一年第一周。比如,2005-01-01是2004年的第53周,而2006-01-01是2005年的第52周,2012-12-31是2013年的第一周。建议isoyear字段和week一起使用以得到一致的结果。 - - ```sql - MogDB=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40'); - date_part - ----------- - 7 - (1 row) - ``` - -- year - - 年份域。 - - ```sql - MogDB=# SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40'); - date_part - ----------- - 2001 - (1 row) - ``` - -## date_part - -date_part函数是在传统的Ingres函数的基础上制作的(该函数等效于SQL标准函数extract): - -- **date_part('field', source)** - -这里的field参数必须是一个字符串,而不是一个名称。有效的field与extract一样,详细信息请参见[EXTRACT](#EXTRACT)。 - -示例: - -```sql -MogDB=# SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40'); - date_part ------------ - 16 -(1 row) -MogDB=# SELECT date_part('hour', INTERVAL '4 hours 3 minutes'); - date_part ------------ - 4 -(1 row) -``` - -表2显示了可以用于格式化日期和时间值的模版。 - -**表 2** 用于日期/时间格式化的模式 - -| 类别 | 模式 | 描述 | -| -------- | --------------------- | ------------------------------------------------------------ | -| 小时 | HH | 一天的小时数(01-12) | -| | HH12 | 一天的小时数(01-12) | -| | HH24 | 一天的小时数(00-23) | -| 分钟 | MI | 分钟(00-59) | -| 秒 | SS | 秒(00-59) | -| | FF | 微秒(000000-999999) | -| | SSSSS | 午夜后的秒(0-86399) | -| 上、下午 | AM或A.M. | 上午标识 | -| | PM或P.M. | 下午标识 | -| 年 | Y,YYY | 带逗号的年(4和更多位) | -| | SYYYY | 公元前四位年 | -| | YYYY | 年(4和更多位) | -| | YYY | 年的后三位 | -| | YY | 年的后两位 | -| | Y | 年的最后一位 | -| | IYYY | ISO年(4位或更多位) | -| | IYY | ISO年的最后三位 | -| | IY | ISO年的最后两位 | -| | I | ISO年的最后一位 | -| | RR | 年的后两位(可在21世纪存储20世纪的年份) | -| | RRRR | 可接收4位年或两位年。若是两位,则和RR的返回值相同,若是四位,则和YYYY相同。 | -| | BC或B.C.
AD或A.D. | 纪元标识。BC(公元前),AD(公元后)。 | -| 月 | MONTH | 全长大写月份名(空白填充为9字符) | -| | MON | 大写缩写月份名(3字符) | -| | MM | 月份数(01-12) | -| | RM | 罗马数字的月份(I-XII ;I=JAN)(大写) | -| 天 | DAY | 全长大写日期名(空白填充为9字符) | -| | DY | 缩写大写日期名(3字符) | -| | DDD | 一年里的日(001-366) | -| | DD | 一个月里的日(01-31) | -| | D | 一周里的日(1-7 ;周日是 1) | -| 周 | W | 一个月里的周数(1-5)(第一周从该月第一天开始) | -| | WW | 一年里的周数(1-53)(第一周从该年的第一天开始) | -| | IW | ISO一年里的周数(第一个星期四在第一周里) | -| 世纪 | CC | 世纪(2位)(21 世纪从 2001-01-01 开始) | -| 儒略日 | J | 儒略日(自公元前 4712 年 1 月 1 日来的天数) | -| 季度 | Q | 季度 | - -> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: -> -> 上表中RR计算年的规则如下: -> -> - 输入的两位年份在00~49之间: -> -> 当前年份的后两位在00~49之间,返回值年份的前两位和当前年份的前两位相同; -> -> 当前年份的后两位在50~99之间,返回值年份的前两位是当前年份的前两位加1。 -> -> - 输入的两位年份在50~99之间: -> -> 当前年份的后两位在00\~49之间,返回值年份的前两位是当前年份的前两位减1; -> -> 当前年份的后两位在50~99之间,返回值年份的前两位和当前年份的前两位相同。 +--- +title: 时间和日期处理函数和操作符 +summary: 时间和日期处理函数和操作符 +author: Zhang Cuiping +date: 2021-04-20 +--- + +# 时间和日期处理函数和操作符 + +## 时间日期操作符 + +> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-warning.gif) **警告:** +> 用户在使用时间和日期操作符时,对应的操作数请使用明确的类型前缀修饰,以确保数据库在解析操作数的时候能够与用户预期一致,不会产生用户非预期的结果。 +> 比如下面示例没有明确数据类型就会出现异常错误。 +> +> ```sql +> SELECT date '2001-10-01' - '7' AS RESULT; +> ``` + +**表 1** 时间和日期操作符 + +| 操作符 | 示例 | +| ------ | ------------------------------------------------------------ | +| + | MogDB=# SELECT date '2001-09-28' + integer '7' AS RESULT;
result
-----------------
2001-10-05
(1 row) | +| | MogDB=# SELECT date '2001-09-28' + interval '1 hour' AS RESULT;
result
-----------------------------
2001-09-28 01:00:00
(1 row) | +| | MogDB=# SELECT date '2001-09-28' + time '03:00' AS RESULT;
result
-------------------------------
2001-09-28 03:00:00
(1 row) | +| | MogDB=# SELECT interval '1 day' + interval '1 hour' AS RESULT;
result
----------------------
1 day 01:00:00
(1 row) | +| | MogDB=# SELECT timestamp '2001-09-28 01:00' + interval '23 hours' AS RESULT;
result
------------------------------
2001-09-29 00:00:00
(1 row) | +| | MogDB=# SELECT time '01:00' + interval '3 hours' AS RESULT;
result
-------------
04:00:00
(1 row) | +| - | MogDB=# SELECT date '2001-10-01' - date '2001-09-28' AS RESULT;
result
----------
3days
(1 row) | +| | MogDB=# SELECT date '2001-10-01' - integer '7' AS RESULT;
result
-------------------------------
2001-09-24 00:00:00
(1 row) | +| | MogDB=# SELECT date '2001-09-28' - interval '1 hour' AS RESULT;
result
--------------------------------
2001-09-27 23:00:00
(1 row) | +| | MogDB=# SELECT time '05:00' - time '03:00' AS RESULT;
result
-------------
02:00:00
(1 row) | +| | MogDB=# SELECT time '05:00' - interval '2 hours' AS RESULT;
result
-------------
03:00:00
(1 row) | +| | MogDB=# SELECT timestamp '2001-09-28 23:00' - interval '23 hours' AS RESULT;
result
-------------------------------
2001-09-28 00:00:00
(1 row) | +| | MogDB=# SELECT interval '1 day' - interval '1 hour' AS RESULT;
result
-------------
23:00:00
(1 row) | +| | MogDB=# SELECT timestamp '2001-09-29 03:00' - timestamp '2001-09-27 12:00' AS RESULT;
result
---------------------
1 day 15:00:00
(1 row) | +| * | MogDB=# SELECT 900 * interval '1 second' AS RESULT;
result
--------------
00:15:00
(1 row) | +| | MogDB=# SELECT 21 * interval '1 day' AS RESULT;
result
-------------
21 days
(1 row) | +| | MogDB=# SELECT double precision '3.5' * interval '1 hour' AS RESULT;
result
--------------
03:30:00
(1 row) | +| / | MogDB=# SELECT interval '1 hour' / double precision '1.5' AS RESULT;
result
-------------
00:40:00
(1 row) | + +## 时间/日期函数 + +- age(timestamp, timestamp) + + 描述:将两个参数相减,并以年、月、日作为返回值。若相减值为负,则函数返回亦为负,入参可以都带timezone或都不带timezone。 + + 返回值类型:interval + + 示例: + + ```sql + MogDB=# SELECT age(timestamp '2001-04-10', timestamp '1957-06-13'); + age + ------------------------- + 43 years 9 mons 27 days + (1 row) + ``` + +- age(timestamp) + + 描述:当前时间和参数相减,入参可以带或者不带timezone。 + + 返回值类型:interval + + 示例: + + ```sql + MogDB=# SELECT age(timestamp '1957-06-13'); + age + ------------------------- + 60 years 2 mons 18 days + (1 row) + ``` + +- clock_timestamp() + + 描述:实时时钟的当前时间戳。 + + 返回值类型:timestamp with time zone + + 示例: + + ```sql + MogDB=# SELECT clock_timestamp(); + clock_timestamp + ------------------------------- + 2017-09-01 16:57:36.636205+08 + (1 row) + ``` + +- current_date + + 描述:当前日期。 + + 返回值类型:date + + 示例: + + ```sql + MogDB=# SELECT current_date; + date + ------------ + 2017-09-01 + (1 row) + ``` + +- current_time + + 描述:当前时间。 + + 返回值类型:time with time zone + + 示例: + + ```sql + MogDB=# SELECT current_time; + timetz + -------------------- + 16:58:07.086215+08 + (1 row) + ``` + +- current_timestamp + + 描述:当前日期及时间。 + + 返回值类型:timestamp with time zone + + 示例: + + ```sql + MogDB=# SELECT current_timestamp; + pg_systimestamp + ------------------------------ + 2017-09-01 16:58:19.22173+08 + (1 row) + ``` + +- systimestamp + + 描述:返回数据库所在系统的系统日期,包括分数秒和时区。 + + 返回值类型:TIMESTAMP WITH TIME ZONE + + 示例: + + ```sql + MogDB=# select systimestamp; + pg_systimestamp + ----------------------------- + 2021-12-24 14:34:24.6903+08 + (1 row) + ``` + +- date_part(text, timestamp) + + 描述:获取日期/时间值中子域的值,例如年或者小时的值。等效于extract(field from timestamp)。 + + timestamp类型:abstime、date、interval、reltime、time with time zone、time without time zone、timestamp with time zone、timestamp without time zone。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT date_part('hour', timestamp '2001-02-16 20:38:40'); + date_part + 20 + (1 row) + ``` + +- date_part(text, interval) + + 描述:获取日期/时间值中子域的值。获取月份值时,如果月份值大于12,则取与12的模。等效于extract(field from timestamp)。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT date_part('month', interval '2 years 3 months'); + date_part + ----------- + 3 + (1 row) + ``` + +- date_trunc(text, timestamp) + + 描述:截取到参数text指定的精度。 + + 返回值类型:interval、timestamp with time zone、timestamp without time zone + + 示例: + + ```sql + MogDB=# SELECT date_trunc('hour', timestamp '2001-02-16 20:38:40'); + date_trunc + --------------------- + 2001-02-16 20:00:00 + (1 row) + ``` + +- trunc(timestamp) + + 描述:默认按天截取。 + + 示例: + + ```sql + MogDB=# SELECT trunc(timestamp '2001-02-16 20:38:40'); trunc + --------------------- + 2001-02-16 00:00:00 + (1 row) + ``` + +- daterange(arg1, arg2) + + 描述:获取时间边界信息。arg1和arg2的类型为date。 + + 返回值类型:daterange + + 示例: + + ```sql + MogDB=# select daterange('2000-05-06','2000-08-08'); + daterange + ------------------------- + [2000-05-06,2000-08-08) + (1 row) + ``` + +- daterange(arg1, arg2, text) + + 描述:获取时间边界信息。arg1和arg2的类型为date,text类型为text。 + + 返回值类型:daterange + + 示例: + + ```sql + MogDB=# select daterange('2000-05-06','2000-08-08','[]'); + daterange + ------------------------- + [2000-05-06,2000-08-09) + (1 row) + ``` + +- extract(field from timestamp) + + 描述:获取小时的值。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT extract(hour from timestamp '2001-02-16 20:38:40'); + date_part + ----------- + 20 + (1 row) + ``` + +- extract(field from interval) + + 描述:获取月份的值。如果大于12,则取与12的模。 + + 返回值类型:double precision + + 示例: + + ```sql + MogDB=# SELECT extract(month from interval '2 years 3 months'); + date_part + ----------- + 3 + (1 row) + ``` + +- isfinite(date) + + 描述:测试是否为有效日期。 + + 返回值类型:Boolean + + 示例: + + ```sql + MogDB=# SELECT isfinite(date '2001-02-16'); + isfinite + ---------- + t + (1 row) + ``` + +- isfinite(timestamp) + + 描述:测试判断是否为有效时间。 + + 返回值类型:Boolean + + 示例: + + ```sql + MogDB=# SELECT isfinite(timestamp '2001-02-16 21:28:30'); + isfinite + ---------- + t + (1 row) + ``` + +- isfinite(interval) + + 描述:测试是否为有效区间。 + + 返回值类型:Boolean + + 示例: + + ```sql + MogDB=# SELECT isfinite(interval '4 hours'); + isfinite + ---------- + t + (1 row) + ``` + +- justify_days(interval) + + 描述:将时间间隔以月(30天为一月)为单位。 + + 返回值类型:interval + + 示例: + + ```sql + MogDB=# SELECT justify_days(interval '35 days'); + justify_days + -------------- + 1 mon 5 days + (1 row) + ``` + +- justify_hours(interval) + + 描述:将时间间隔以天(24小时为一天)为单位。 + + 返回值类型:interval + + 示例: + + ```sql + MogDB=# SELECT JUSTIFY_HOURS(INTERVAL '27 HOURS'); + justify_hours + ---------------- + 1 day 03:00:00 + (1 row) + ``` + +- justify_interval(interval) + + 描述:结合justify_days和justify_hours,调整interval。 + + 返回值类型:interval + + 示例: + + ```sql + MogDB=# SELECT JUSTIFY_INTERVAL(INTERVAL '1 MON -1 HOUR'); + justify_interval + ------------------ + 29 days 23:00:00 + (1 row) + ``` + +- localtime + + 描述:当前时间。 + + 返回值类型:time + + 示例: + + ```sql + MogDB=# SELECT localtime AS RESULT; + result + ---------------- + 16:05:55.664681 + (1 row) + ``` + +- localtimestamp + + 描述:当前日期及时间。 + + 返回值类型:timestamp + + 示例: + + ```sql + MogDB=# SELECT localtimestamp; + timestamp + ---------------------------- + 2017-09-01 17:03:30.781902 + (1 row) + ``` + +- now() + + 描述:当前日期及时间。 + + 返回值类型:timestamp with time zone + + 示例: + + ```sql + MogDB=# SELECT now(); + now + ------------------------------- + 2017-09-01 17:03:42.549426+08 + (1 row) + ``` + +- timenow + + 描述:当前日期及时间。 + + 返回值类型:timestamp with time zone + + 示例: + + ```sql + MogDB=# select timenow(); + timenow + ------------------------ + 2020-06-23 20:36:56+08 + (1 row) + ``` + +- numtodsinterval(num, interval_unit) + + 描述:将数字转换为interval类型。num为numeric类型数字,interval_unit为固定格式字符串('DAY' | 'HOUR' | 'MINUTE' | 'SECOND')。 + + 可以通过设置参数IntervalStyle为a,兼容该函数interval输出格式。 + + 示例: + + ```sql + MogDB=# SELECT numtodsinterval(100, 'HOUR'); + numtodsinterval + ----------------- + 100:00:00 + (1 row) + + MogDB=# SET intervalstyle = a; + SET + MogDB=# SELECT numtodsinterval(100, 'HOUR'); + numtodsinterval + ------------------------------- + +000000004 04:00:00.000000000 + (1 row) + ``` + +- pg_sleep(seconds) + + 描述:服务器线程延迟时间,单位为秒。 + + 返回值类型:void + + 示例: + + ```sql + MogDB=# SELECT pg_sleep(10); + pg_sleep + ---------- + + (1 row) + ``` + +- statement_timestamp() + + 描述:当前日期及时间。 + + 返回值类型:timestamp with time zone + + 示例: + + ```sql + MogDB=# SELECT statement_timestamp(); + statement_timestamp + ------------------------------- + 2017-09-01 17:04:39.119267+08 + (1 row) + ``` + +- sysdate + + 描述:当前日期及时间。 + + 返回值类型:timestamp + + 示例: + + ```sql + MogDB=# SELECT sysdate; + sysdate + --------------------- + 2017-09-01 17:04:49 + (1 row) + ``` + +- timeofday() + + 描述:当前日期及时间(像clock_timestamp,但是返回时为text)。 + + 返回值类型:text + + 示例: + + ```sql + MogDB=# SELECT timeofday(); + timeofday + ------------------------------------- + Fri Sep 01 17:05:01.167506 2017 CST + (1 row) + ``` + +- transaction_timestamp() + + 描述:当前日期及时间,与current_timestamp等效。 + + 返回值类型:timestamp with time zone + + 示例: + + ```sql + MogDB=# SELECT transaction_timestamp(); + transaction_timestamp + ------------------------------- + 2017-09-01 17:05:13.534454+08 + (1 row) + ``` + +- add_months(d,n) + + 描述:用于计算时间点d再加上n个月的时间。 + + 返回值类型:timestamp + + 示例: + + ```sql + MogDB=# SELECT add_months(to_date('2017-5-29', 'yyyy-mm-dd'), 11) FROM dual; + add_months + --------------------- + 2018-04-29 00:00:00 + (1 row) + ``` + +- last_day(d) + + 描述:用于计算时间点d当月最后一天的时间。 + + 返回值类型:timestamp + + 示例: + + ```sql + MogDB=# select last_day(to_date('2017-01-01', 'YYYY-MM-DD')) AS cal_result; + cal_result + --------------------- + 2017-01-31 00:00:00 + (1 row) + ``` + +- next_day(x,y) + + 描述:用于计算时间点x开始的下一个星期几(y)的时间。 + + 返回值类型:timestamp + + 示例: + + ```sql + MogDB=# select next_day(timestamp '2017-05-25 00:00:00','Sunday')AS cal_result; + cal_result + --------------------- + 2017-05-28 00:00:00 + (1 row) + ``` + +- tinterval(abstime, abstime ) + + 描述:用两个绝对时间创建时间间隔。 + + 返回值类型:tinterval + + 示例: + + ```sql + MogDB=# call tinterval(abstime 'May 10, 1947 23:59:12', abstime 'Mon May 1 00:30:30 1995'); + tinterval + ----------------------------------------------------- + ["1947-05-10 23:59:12+09" "1995-05-01 00:30:30+08"] + (1 row) + ``` + +- tintervalend(tinterval) + + 描述:返回tinteval的结束时间。 + + 返回值类型:abstime + + 示例: + + ```sql + MogDB=# select tintervalend('["Sep 4, 1983 23:59:12" "Oct4, 1983 23:59:12"]'); + tintervalend + ------------------------ + 1983-10-04 23:59:12+08 + (1 row) + ``` + +- tintervalrel(tinterval) + + 描述:计算并返回tinterval的相对时间。 + + 返回值类型:reltime + + 示例: + + ```sql + MogDB=# select tintervalrel('["Sep 4, 1983 23:59:12" "Oct4, 1983 23:59:12"]'); + tintervalrel + -------------- + 1 mon + (1 row) + ``` + +- to_timestamp + + 描述:将入参的字符串的时间转换成不带时区的TIMESTAMP。 + + 返回值类型:timestamp,输出格式由GUC变量 nls_timestamp_format控制 + + 示例: + + ```sql + MogDB=# SELECT to_timestamp('1997/Feb/16 --> 08:14:30', 'YYYY/Mon/DD --> HH:MI:SS'); + to_timestamp + --------------------- + 1997-02-16 08:14:30 + (1 row) + ``` + +- to_yminterval + + 描述:将入参转换为包含年月的interval。 + + 返回值类型:interval,输出格式由GUC变量IntervalStyle控制 + + 示例: + + ```sql + MogDB=# SELECT TO_YMINTERVAL('15-11'); + to_yminterval + ------------------ + 15 years 11 mons + (1 row) + + MogDB=# SELECT TO_YMINTERVAL('P15Y11M'); + to_yminterval + ------------------ + 15 years 11 mons + (1 row) + ``` + +- TZ_OFFSET(var) + + 描述:返回入参地址的时区偏移量。 + + 返回值类型:interval + + 示例: + + ```sql + MogDB=# SELECT TZ_OFFSET('Asia/Hong_Kong') FROM dual; + tz_offset + ----------- + 08:00:00 + (1 row) + + MogDB=# SELECT TZ_OFFSET('+14:00') FROM dual; + tz_offset + ----------- + 14:00 + (1 row) + ``` + +- smalldatetime_ge + + 描述:判断是否第一个参数大于等于第二个参数。 + + 参数:smalldatetime, smalldatetime + + 返回值类型:boolean + +- smalldatetime_cmp + + 描述:对比smalldatetime是否相等。 + + 参数:smalldatetime, smalldatetime + + 返回值类型:integer + +- smalldatetime_eq + + 描述:对比smalldatetime是否相等。 + + 参数:smalldatetime, smalldatetime + + 返回值类型:boolean。 + +- smalldatetime_gt + + 描述:判断是否第一个参数大于第二个参数。 + + 参数:smalldatetime, smalldatetime + + 返回值类型:boolean + +- smalldatetime_hash + + 描述:计算timestamp对应的哈希值。 + + 参数:smalldatetime + + 返回值类型:integer + +- smalldatetime_in + + 描述:输入timestamp。 + + 参数:cstring, oid, integer + + 返回值类型:smalldatetime + +- smalldatetime_larger + + 描述:返回较大的timestamp。 + + 参数:smalldatetime, smalldatetime + + 返回值类型:smalldatetime + +- smalldatetime_le + + 描述:判断是否第一个参数小于等于第二个参数。 + + 参数:smalldatetime, smalldatetime + + 返回值类型:boolean + +- smalldatetime_lt + + 描述:判断是否第一个参数小于第二个参数。 + + 参数:smalldatetime, smalldatetime + + 返回值类型:boolean + +- smalldatetime_ne + + 描述:比较两个timestamp是否不相等。 + + 参数:smalldatetime, smalldatetime + + 返回值类型:boolean + +- smalldatetime_out + + 描述:timestamp转换为外部形式。 + + 参数:smalldatetime + + 返回值类型:cstring + +- smalldatetime_send + + 描述:timestamp转换为二进制格式。 + + 参数:smalldatetime + + 返回值类型:bytea + +- smalldatetime_smaller + + 描述:返回较小的一个smalldatetime。 + + 参数:smalldatetime, smalldatetime + + 返回值类型:smalldatetime + +- smalldatetime_to_abstime + + 描述:smalldatetime转换为abstime。 + + 参数:smalldatetime + + 返回值类型:abstime + +- smalldatetime_to_time + + 描述:smalldatetime转换为time。 + + 参数:smalldatetime + + 返回值类型:time without time zone + +- smalldatetime_to_timestamp + + 描述:smalldatetime转换为timestamp。 + + 参数:smalldatetime + + 返回值类型:timestamp without time zone + +- smalldatetime_to_timestamptz + + 描述:smalldatetime转换为timestamptz。 + + 参数:smalldatetime + + 返回值类型:timestamp with time zone + +- smalldatetime_to_varchar2 + + 描述:smalldatetime转换为varchar2。 + + 参数:smalldatetime + + 返回值类型:character varying + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** + > + > 获取当前时间有多种方式,请根据实际业务从场景选择合适的接口: + > + > 1. 以下接口按照当前事务的开始时刻返回值: + > + > ```sql + > CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP CURRENT_TIME(precision) CURRENT_TIMESTAMP(precision) LOCALTIME LOCALTIMESTAMP LOCALTIME(precision) LOCALTIMESTAMP(precision) + > ``` + > + > 其中CURRENT_TIME和CURRENT_TIMESTAMP传递带有时区的值;LOCALTIME和LOCALTIMESTAMP传递的值不带时区。CURRENT_TIME、CURRENT_TIMESTAMP、LOCALTIME和 LOCALTIMESTAMP可以有选择地接受一个精度参数, 该精度导致结果的秒域被园整为指定小数位。如果没有精度参数,结果将被给予所能得到的全部精度。 + > + > 因为这些函数全部都按照当前事务的开始时刻返回结果,所以它们的值在事务运行的整个期间内都不改变。 我们认为这是一个特性:目的是为了允许一个事务在“当前”时间上有一致的概念, 这样在同一个事务里的多个修改可以保持同样的时间戳。 + > + > 2. 以下接口返回当前语句开始时间: + > + > ```sql + > transaction_timestamp() statement_timestamp() now() + > ``` + > + > 其中transaction_timestamp()等价于CURRENT_TIMESTAMP,但是其命名清楚地反映了它的返回值。statement_timestamp()返回当前语句的开始时刻(更准确的说是收到 客户端最后一条命令的时间)。statement_timestamp()和transaction_timestamp()在一个事务的第一条命令期间返回值相同,但是在随后的命令中却不一定相同。 + > + > now()等效于transaction_timestamp()。 + > + > 3. 以下接口返回函数被调用时的真实当前时间: + > + > ```sql + > clock_timestamp() timeofday() + > ``` + > + > clock_timestamp()返回真正的当前时间,因此它的值甚至在同一条 SQL 命令中都会变化。timeofday()和clock_timestamp()相似,timeofday()也返回真实的当前时间,但是它的结果是一个格式化的text串,而不是timestamp with time zone值。 + +## TIMESTAMPDIFF + +- **TIMESTAMPDIFF(unit , timestamp_expr1, timestamp_expr2)** + +timestampdiff函数是计算两个日期时间之间(timestamp_expr2-timestamp_expr1)的差值,并以unit形式返回结果。timestamp_expr1,timestamp_expr2必须是一个timestamp、timestamptz、date类型的值表达式。unit表示的是两个日期差的单位。 + +> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** +> 该函数仅在MogDB兼容MY类型时(即dbcompatibility = 'B')有效,其他类型不支持该函数。 + +- year + + 年份。 + + ```sql + MogDB=# SELECT TIMESTAMPDIFF(YEAR, '2018-01-01', '2020-01-01'); + timestamp_diff + ---------------- + 2 + (1 row) + ``` + +- quarter + + 季度。 + + ```sql + MogDB=# SELECT TIMESTAMPDIFF(QUARTER, '2018-01-01', '2020-01-01'); + timestamp_diff + ---------------- + 8 + (1 row) + ``` + +- month + + 月份。 + + ```sql + MogDB=# SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2020-01-01'); + timestamp_diff + ---------------- + 24 + (1 row) + ``` + +- week + + 星期。 + + ```sql + MogDB=# SELECT TIMESTAMPDIFF(WEEK, '2018-01-01', '2020-01-01'); + timestamp_diff + ---------------- + 104 + (1 row) + ``` + +- day + + 天。 + + ```sql + MogDB=# SELECT TIMESTAMPDIFF(DAY, '2018-01-01', '2020-01-01'); + timestamp_diff + ---------------- + 730 + (1 row) + ``` + +- hour + + 小时。 + + ```sql + MogDB=# SELECT TIMESTAMPDIFF(HOUR, '2020-01-01 10:10:10', '2020-01-01 11:11:11'); + timestamp_diff + ---------------- + 1 + (1 row) + + ``` + +- minute + + 分钟。 + + ```sql + MogDB=# SELECT TIMESTAMPDIFF(MINUTE, '2020-01-01 10:10:10', '2020-01-01 11:11:11'); + timestamp_diff + ---------------- + 61 + (1 row) + + ``` + +- second + + 秒。 + + ```sql + MogDB=# SELECT TIMESTAMPDIFF(SECOND, '2020-01-01 10:10:10', '2020-01-01 11:11:11'); + timestamp_diff + ---------------- + 3661 + (1 row) + + ``` + +- microseconds + + 秒域(包括小数部分)乘以1,000,000。 + + ```sql + MogDB=# SELECT TIMESTAMPDIFF(MICROSECOND, '2020-01-01 10:10:10.000000', '2020-01-01 10:10:10.111111'); + timestamp_diff + ---------------- + 111111 + (1 row) + + ``` + +- timestamp_expr含有时区 + + ```sql + MogDB=# SELECT TIMESTAMPDIFF(HOUR,'2020-05-01 10:10:10-01','2020-05-01 10:10:10-03'); + timestamp_diff + ---------------- + 2 + (1 row) + ``` + +## EXTRACT + +- **EXTRACT**(field **FROM** source) + + extract函数从日期或时间的数值里抽取子域,比如年、小时等。source必须是一个timestamp、time或interval类型的值表达式(类型为date的表达式转换为timestamp,因此也可以用)。field是一个标识符或者字符串,它指定从源数据中抽取的域。extract函数返回类型为double precision的数值。field的取值范围如下所示。 + +- century + + 世纪。 + + 第一个世纪从0001-01-01 00:00:00 AD开始。这个定义适用于所有使用阳历的国家。没有0世纪,直接从公元前1世纪到公元1世纪。 + + 示例: + + ```sql + MogDB=# SELECT EXTRACT(CENTURY FROM TIMESTAMP '2000-12-16 12:21:13'); + date_part + ----------- + 20 + (1 row) + ``` + +- day + + - 如果source为timestamp,表示月份里的日期(1-31)。 + + ```sql + MogDB=# SELECT EXTRACT(DAY FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 16 + (1 row) + ``` + + - 如果source为interval,表示天数。 + + ```sql + MogDB=# SELECT EXTRACT(DAY FROM INTERVAL '40 days 1 minute'); + date_part + ----------- + 40 + (1 row) + ``` + +- decade + + 年份除以10。 + + ```sql + MogDB=# SELECT EXTRACT(DECADE FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 200 + (1 row) + ``` + +- dow + + 每周的星期几,星期天(0)到星期六(6)。 + + ```sql + MogDB=# SELECT EXTRACT(DOW FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 5 + (1 row) + ``` + +- doy + + 一年的第几天(1~365/366)。 + + ```sql + MogDB=# SELECT EXTRACT(DOY FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 47 + (1 row) + ``` + +- epoch + + - 如果source为timestamp with time zone,表示自1970-01-01 00:00:00-00 UTC以来的秒数(结果可能是负数); + + 如果source为date和timestamp,表示自1970-01-01 00:00:00-00当地时间以来的秒数; + + 如果source为interval,表示时间间隔的总秒数。 + + ```sql + MogDB=# SELECT EXTRACT(EPOCH FROM TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40.12-08'); + date_part + -------------- + 982384720.12 + (1 row) + ``` + + ```sql + MogDB=# SELECT EXTRACT(EPOCH FROM INTERVAL '5 days 3 hours'); + date_part + ----------- + 442800 + (1 row) + ``` + + - 将epoch值转换为时间戳的方法。 + + ```sql + MogDB=# SELECT TIMESTAMP WITH TIME ZONE 'epoch' + 982384720.12 * INTERVAL '1 second' AS RESULT; + result + --------------------------- + 2001-02-17 12:38:40.12+08 + (1 row) + ``` + +- hour + + 小时域(0-23)。 + + ```sql + MogDB=# SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 20 + (1 row) + ``` + +- isodow + + 一周的第几天(1-7)。 + + 星期一为1,星期天为7。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** + > 除了星期天外,都与dow相同。 + + ```sql + MogDB=# SELECT EXTRACT(ISODOW FROM TIMESTAMP '2001-02-18 20:38:40'); + date_part + ----------- + 7 + (1 row) + ``` + +- isoyear + + 日期中的ISO 8601标准年(不适用于间隔)。 + + 每个带有星期一开始的周中包含1月4日的ISO年,所以在年初的1月或12月下旬的ISO年可能会不同于阳历的年。详细信息请参见后续的week描述。 + + ```sql + MogDB=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-01'); + date_part + ----------- + 2005 + (1 row) + ``` + + ```sql + MogDB=# SELECT EXTRACT(ISOYEAR FROM DATE '2006-01-02'); + date_part + ----------- + 2006 + (1 row) + ``` + +- microseconds + + 秒域(包括小数部分)乘以1,000,000。 + + ```sql + MogDB=# SELECT EXTRACT(MICROSECONDS FROM TIME '17:12:28.5'); + date_part + ----------- + 28500000 + (1 row) + ``` + +- millennium + + 千年。 + + 20世纪(19xx年)里面的年份在第二个千年里。第三个千年从2001年1月1日零时开始。 + + ```sql + MogDB=# SELECT EXTRACT(MILLENNIUM FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 3 + (1 row) + ``` + +- milliseconds + + 秒域(包括小数部分)乘以1000。请注意它包括完整的秒。 + + ```sql + MogDB=# SELECT EXTRACT(MILLISECONDS FROM TIME '17:12:28.5'); + date_part + ----------- + 28500 + (1 row) + ``` + +- minute + + 分钟域(0-59)。 + + ```sql + MogDB=# SELECT EXTRACT(MINUTE FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 38 + (1 row) + ``` + +- month + + 如果source为timestamp,表示一年里的月份数(1-12)。 + + ```sql + MogDB=# SELECT EXTRACT(MONTH FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 2 + (1 row) + ``` + + 如果source为interval,表示月的数目,然后对12取模(0-11)。 + + ```sql + MogDB=# SELECT EXTRACT(MONTH FROM INTERVAL '2 years 13 months'); + date_part + ----------- + 1 + (1 row) + ``` + +- quarter + + 该天所在的该年的季度(1-4)。 + + ```sql + MogDB=# SELECT EXTRACT(QUARTER FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 1 + (1 row) + ``` + +- second + + 秒域,包括小数部分(0-59)。 + + ```sql + MogDB=# SELECT EXTRACT(SECOND FROM TIME '17:12:28.5'); + date_part + ----------- + 28.5 + (1 row) + ``` + +- timezone + + 与UTC的时区偏移量,单位为秒。正数对应UTC东边的时区,负数对应UTC西边的时区。 + +- timezone_hour + + 时区偏移量的小时部分。 + +- timezone_minute + + 时区偏移量的分钟部分。 + +- week + + 该天在所在的年份里是第几周。ISO 8601定义一年的第一周包含该年的一月四日(ISO-8601 的周从星期一开始)。换句话说,一年的第一个星期四在第一周。 + + 在ISO定义里,一月的头几天可能是前一年的第52或者第53周,十二月的后几天可能是下一年第一周。比如,2005-01-01是2004年的第53周,而2006-01-01是2005年的第52周,2012-12-31是2013年的第一周。建议isoyear字段和week一起使用以得到一致的结果。 + + ```sql + MogDB=# SELECT EXTRACT(WEEK FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 7 + (1 row) + ``` + +- year + + 年份域。 + + ```sql + MogDB=# SELECT EXTRACT(YEAR FROM TIMESTAMP '2001-02-16 20:38:40'); + date_part + ----------- + 2001 + (1 row) + ``` + +## date_part + +date_part函数是在传统的Ingres函数的基础上制作的(该函数等效于SQL标准函数extract): + +- **date_part('field', source)** + +这里的field参数必须是一个字符串,而不是一个名称。有效的field与extract一样,详细信息请参见[EXTRACT](#EXTRACT)。 + +示例: + +```sql +MogDB=# SELECT date_part('day', TIMESTAMP '2001-02-16 20:38:40'); + date_part +----------- + 16 +(1 row) +MogDB=# SELECT date_part('hour', INTERVAL '4 hours 3 minutes'); + date_part +----------- + 4 +(1 row) +``` + +表2显示了可以用于格式化日期和时间值的模版。 + +**表 2** 用于日期/时间格式化的模式 + +| 类别 | 模式 | 描述 | +| -------- | --------------------- | ------------------------------------------------------------ | +| 小时 | HH | 一天的小时数(01-12) | +| | HH12 | 一天的小时数(01-12) | +| | HH24 | 一天的小时数(00-23) | +| 分钟 | MI | 分钟(00-59) | +| 秒 | SS | 秒(00-59) | +| | FF | 微秒(000000-999999) | +| | SSSSS | 午夜后的秒(0-86399) | +| 上、下午 | AM或A.M. | 上午标识 | +| | PM或P.M. | 下午标识 | +| 年 | Y,YYY | 带逗号的年(4和更多位) | +| | SYYYY | 公元前四位年 | +| | YYYY | 年(4和更多位) | +| | YYY | 年的后三位 | +| | YY | 年的后两位 | +| | Y | 年的最后一位 | +| | IYYY | ISO年(4位或更多位) | +| | IYY | ISO年的最后三位 | +| | IY | ISO年的最后两位 | +| | I | ISO年的最后一位 | +| | RR | 年的后两位(可在21世纪存储20世纪的年份) | +| | RRRR | 可接收4位年或两位年。若是两位,则和RR的返回值相同,若是四位,则和YYYY相同。 | +| | BC或B.C.
AD或A.D. | 纪元标识。BC(公元前),AD(公元后)。 | +| 月 | MONTH | 全长大写月份名(空白填充为9字符) | +| | MON | 大写缩写月份名(3字符) | +| | MM | 月份数(01-12) | +| | RM | 罗马数字的月份(I-XII ;I=JAN)(大写) | +| 天 | DAY | 全长大写日期名(空白填充为9字符) | +| | DY | 缩写大写日期名(3字符) | +| | DDD | 一年里的日(001-366) | +| | DD | 一个月里的日(01-31) | +| | D | 一周里的日(1-7 ;周日是 1) | +| 周 | W | 一个月里的周数(1-5)(第一周从该月第一天开始) | +| | WW | 一年里的周数(1-53)(第一周从该年的第一天开始) | +| | IW | ISO一年里的周数(第一个星期四在第一周里) | +| 世纪 | CC | 世纪(2位)(21 世纪从 2001-01-01 开始) | +| 儒略日 | J | 儒略日(自公元前 4712 年 1 月 1 日来的天数) | +| 季度 | Q | 季度 | + +> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** +> +> 上表中RR计算年的规则如下: +> +> - 输入的两位年份在00~49之间: +> +> 当前年份的后两位在00~49之间,返回值年份的前两位和当前年份的前两位相同; +> +> 当前年份的后两位在50~99之间,返回值年份的前两位是当前年份的前两位加1。 +> +> - 输入的两位年份在50~99之间: +> +> 当前年份的后两位在00\~49之间,返回值年份的前两位是当前年份的前两位减1; +> +> 当前年份的后两位在50~99之间,返回值年份的前两位和当前年份的前两位相同。 diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/guc-parameters/20-MogDB-transaction.md b/product/zh/docs-mogdb/v3.0/reference-guide/guc-parameters/20-MogDB-transaction.md index 69609bd32f8622210204495cf41e3fa52446f04d..e604482937d58bab04349c532047598ce8cebd9b 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/guc-parameters/20-MogDB-transaction.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/guc-parameters/20-MogDB-transaction.md @@ -137,3 +137,15 @@ date: 2021-04-20 - off表示实时计算快照xmin和oldestxmin。 **默认值**: on + +## async_submit + +**参数说明**:可以在session级别控制是否使用事务异步提交。该开关仅在“[enable_threadpool](32-thread-pool#enable_thread_pool) = on”和“[synchronous_commit](1-settings#synchronous_commit)”不为“off”时有效。 + +**取值范围**:布尔型。 + +- on:表示打开事务异步提交,该session上所有事务提交将异步完成。 + +- off:该session上所有事务按照原有的逻辑提交。 + +**默认值**:off \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/guc-parameters/SQL-mode.md b/product/zh/docs-mogdb/v3.0/reference-guide/guc-parameters/SQL-mode.md new file mode 100644 index 0000000000000000000000000000000000000000..32af6d683e3bfd1ceb68c8bd61d827073d380a1d --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/reference-guide/guc-parameters/SQL-mode.md @@ -0,0 +1,38 @@ +--- +title: SQL模式 +summary: SQL模式 +author: Zhang Cuiping +date: 2022-06-21 +--- + +# SQL模式 + +当了避免数据库出现非法数据影响变更周期或者代码迁移过程中避免修改老代码时,可以设置以下参数实现。 + +## sql_mode + +**参数说明**:设置SQL模式。 + +**取值范围**:string 或者null + +- **sql_mode_strict**:如果数据不合法或缺失指定值时则会报错 + + > 在非sql_mode_strict模式下支持以下四种场景: + > + > - 插入不符合当前列类型的值时,进行数据转换,分俩种:insert into table values(…) 和insert into table select … + > + > 主要涉及到各种数据类型之间的互相转换,目前涉及的类型有tinyint(tinyint由于数据范围和mysql有差别,暂时不 + > 考虑),smallint,int,bigint,float,double,numeric,clob,char和varchar + > + > - 插入的列值长度超过此列所限定的长度时,赋予该列最大或最小值(涉及的类型有tinyint,smallint,int,bigint,float,double,numeric,clob,char和 + > varchar) + > - insert时,属性是非空且没有默认值的列,且没有在insert的列表中,则为其添加默认值(涉及的类型有tinyint,smallint,int,bigint,float,double,numeric,clob,char和 + > varchar) + > - 支持对属性是非空且没有默认值的列显式插入default(涉及的类型有tinyint,smallint,int,bigint,float,double,numeric,clob,char和 + > varchar) + +- **sql_mode_full_group**:不允许非group by的列在select列中(除非是作为聚合函数的参数) + + > 注意:如果select列表中的列没有使用聚合函数,也没有出现在group by子句,则会报错。 + +**默认值**: **sql_mode_strict**, **sql_mode_full_group** \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/guc-parameters/guc-parameter-list.md b/product/zh/docs-mogdb/v3.0/reference-guide/guc-parameters/guc-parameter-list.md index 3d21985349b65494c1bc80761beffd0ad5540aff..8d932bd4a82a647b73c07e102df8f7d7b3dfeba2 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/guc-parameters/guc-parameter-list.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/guc-parameters/guc-parameter-list.md @@ -579,6 +579,7 @@ date: 2022-05-26 | [sql_beta_feature](4-other-optimizer-options#sql_beta_feature) | | [sql_compatibility](2-platform-and-client-compatibility#sql_compatibility) | | [sql_inheritance](1-compatibility-with-earlier-versions#sql_inheritance) | +| [sql_mode](SQL-mode#sql_mode) | | [sql_use_spacelimit](2-disk-space#sql_use_spacelimit) | | [ssl](2-security-and-authentication#ssl) | | [ssl_ca_file](2-security-and-authentication#ssl_ca_file) | diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/schema/DBE_PERF/session-thread/LOCAL_ACTIVE_SESSION.md b/product/zh/docs-mogdb/v3.0/reference-guide/schema/DBE_PERF/session-thread/LOCAL_ACTIVE_SESSION.md index e27c67c5bb7f60cfc6d4d30ef98874127ba01b2c..a0ebbf8fa94b4be06c23904b1cfc6f73123a4a30 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/schema/DBE_PERF/session-thread/LOCAL_ACTIVE_SESSION.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/schema/DBE_PERF/session-thread/LOCAL_ACTIVE_SESSION.md @@ -41,3 +41,4 @@ LOCAL_ACTIVE_SESSION视图显示本节点上的ACTIVE SESSION PROFILE内存中 | final_block_sessionid | bigint | 表示源头阻塞会话ID。 | | wait_status | text | 描述event列的更多详细信息。 | | global_sessionid | text | 全局会话ID。 | +| plan_node_id | int | 执行计划树的算子id | diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/schema/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md b/product/zh/docs-mogdb/v3.0/reference-guide/schema/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md index 96991973aeeca02a018bd7c345d450bdd89b20ad..ea69281085f1fe051fcdd4c27485a224ca510e8a 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/schema/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/schema/DBE_PERF/session-thread/LOCAL_THREADPOOL_STATUS.md @@ -18,5 +18,7 @@ LOCAL_THREADPOOL_STATUS视图显示线程池下工作线程及会话的状态信 | bind_numa_id | integer | 该线程池组绑定的NUMA ID。 | | bind_cpu_number | integer | 该线程池组绑定的CPU信息。如果未绑定CPU,该值为NULL。 | | listener | integer | 该线程池组的Listener线程数量。 | -| worker_info | text | 线程池中线程相关信息,包括以下信息:
- default: 该线程池组中的初始线程数量。
- new: 该线程池组中新增线程的数量。
- expect: 该线程池组中预期线程的数量。
- actual: 该线程池组中实际线程的数量。
- idle: 该线程池组中空闲线程的数量。
- pending: 该线程池组中等待线程的数量。 | +| worker_info | text | 线程池中worker线程相关信息,包括以下信息:
- default: 该线程池组中的初始线程数量。
- new: 该线程池组中新增线程的数量。
- expect: 该线程池组中预期线程的数量。
- actual: 该线程池组中实际线程的数量。
- idle: 该线程池组中空闲线程的数量。
- pending: 该线程池组中等待线程的数量。 | | session_info | text | 线程池中会话相关信息,包括以下信息:
- total: 该线程池组中所有的会话数量。
- waiting: 该线程池组中等待调度的会话数量。
- running: 该线程池中正在执行的会话数量。
- idle: 该线程池组中空闲的会话数量。 | +| stream_info | text | 线程池中stream线程相关信息,包括以下信息:
- total: 该线程池组中所有的stream线程数量。
- running: 该线程池中正在执行的stream线程数量。
- idle: 该线程池组中空闲的stream线程数量 | +| committer_info | text | 线程池中committer线程相关信息,包括以下信息:
- total: 该线程池组中所有的committer线程数量。
- running: 该线程池中正在执行的committer线程数量。
- idle: 该线程池组中空闲的committer线程数量 | diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/ALTER-TABLE.md b/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/ALTER-TABLE.md index 71d5d66ad285904ada6d05119d870824db8ebc73..a2395f99fc653fb76d6598e45143c122eab1728d 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/ALTER-TABLE.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/ALTER-TABLE.md @@ -1,457 +1,461 @@ ---- -title: ALTER TABLE -summary: ALTER TABLE -author: Zhang Cuiping -date: 2021-05-17 ---- - -# ALTER TABLE - -## 功能描述 - -修改表,包括修改表的定义、重命名表、重命名表中指定的列、重命名表的约束、设置表的所属模式、添加/更新多个列、打开/关闭行访问控制开关。 - -## 注意事项 - -- 表的所有者被授予了表ALTER权限的用户或被授予ALTER ANY TABLE的用户有权限执行ALTER TABLE命令,系统管理员默认拥有此权限。但要修改表的所有者或者修改表的模式,当前用户必须是该表的所有者或者系统管理员,且该用户是新所有者角色的成员。 -- 不能修改分区表的tablespace,但可以修改分区的tablespace。 -- 不支持修改存储参数ORIENTATION。 -- SET SCHEMA操作不支持修改为系统内部模式,当前仅支持用户模式之间的修改。 -- 列存表只支持PARTIAL CLUSTER KEY、UNIQUE、PRIMARY KEY表级约束,不支持外键等表级约束。 -- 列存表只支持添加字段ADD COLUMN、修改字段的数据类型ALTER TYPE、设置单个字段的收集目标SET STATISTICS、支持更改表名称、支持更改表空间,支持删除字段DROP COLUMN。对于添加的字段和修改的字段类型要求是列存[支持的数据类型](1-numeric-data-types)。ALTER TYPE的USING选项只支持常量表达式和涉及本字段的表达式,暂不支持涉及其他字段的表达式。 -- 列存表支持的字段约束包括NULL、NOT NULL、DEFAULT常量值、UNIQUE和PRIMARY KEY;对字段约束的修改当前只支持对DEFAULT值的修改(SET DEFAULT)和删除(DROP DEFAULT),暂不支持对非空约束NULL/NOT NULL的修改。 -- 不支持增加自增列,或者增加DEFAULT值中包含nextval()表达式的列。 -- 不支持对外表、临时表开启行访问控制开关。 -- 通过约束名删除PRIMARY KEY约束时,不会删除NOT NULL约束,如果有需要,请手动删除NOT NULL约束。 -- 使用JDBC时,支持通过PrepareStatement对DEFAUTL值进行参数化设置。 - -## 语法格式 - -- 修改表的定义。 - - ```ebnf+diagram - AlterTable ::= ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) } - action [, ... ]; - ``` - - 其中具体表操作action可以是以下子句之一: - - ```ebnf+diagram - action ::= column_clause - | ADD table_constraint [ NOT VALID ] - | ADD table_constraint_using_index - | VALIDATE CONSTRAINT constraint_name - | DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ] - | CLUSTER ON index_name - | SET WITHOUT CLUSTER - | SET ( {storage_parameter = value} [, ... ] ) - | RESET ( storage_parameter [, ... ] ) - | OWNER TO new_owner - | SET TABLESPACE new_tablespace - | SET {COMPRESS|NOCOMPRESS} - | TO { GROUP groupname | NODE ( nodename [, ... ] ) } - | ADD NODE ( nodename [, ... ] ) - | DELETE NODE ( nodename [, ... ] ) - | DISABLE TRIGGER [ trigger_name | ALL | USER ] - | ENABLE TRIGGER [ trigger_name | ALL | USER ] - | ENABLE REPLICA TRIGGER trigger_name - | ENABLE ALWAYS TRIGGER trigger_name - | DISABLE '/' ENABLE [ REPLICA | ALWAYS ] RULE - | DISABLE ROW LEVEL SECURITY - | ENABLE ROW LEVEL SECURITY - | FORCE ROW LEVEL SECURITY - | NO FORCE ROW LEVEL SECURITY - | ENCRYPTION KEY ROTATION - | SET WITH OIDS - | SET WITHOUT OIDS - | INHERIT parents - | NO INHERIT parents - | OF type_name - | NOT OF - | REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING } - ``` - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: - > - > - **ADD table_constraint [ NOT VALID ]** 给表增加一个新的约束。 - > - **ADD table_constraint_using_index** 根据已有唯一索引为表增加主键约束或唯一约束。 - > - **VALIDATE CONSTRAINT constraint_name** 验证一个使用NOT VALID选项创建的检查类约束,通过扫描全表来保证所有记录都符合约束条件。如果约束已标记为有效时,什么操作也不会发生。 - > - **DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ]** 删除一个表上的约束。 - > - **CLUSTER ON index_name** 为将来的CLUSTER(聚簇)操作选择默认索引。实际上并没有重新盘簇化处理该表。 - > - **SET WITHOUT CLUSTER** 从表中删除最新使用的CLUSTER索引。这样会影响将来那些没有声明索引的CLUSTER(聚簇)操作。 - > - **SET ( {storage_parameter = value} [, ... ] )** 修改表的一个或多个存储参数。 - > - **RESET ( storage_parameter [, ... ] )** 重置表的一个或多个存储参数。与SET一样,根据参数的不同可能需要重写表才能获得想要的效果。 - > - **OWNER TO new_owner** 将表、序列、视图的属主改变成指定的用户。 - > - **SET TABLESPACE new_tablespace** 这种形式将表空间修改为指定的表空间并将相关的数据文件移动到新的表空间。但是表上的所有索引都不会被移动,索引可以通过ALTER INDEX语法的SET TABLESPACE选项来修改索引的表空间。 - > - **SET {COMPRESS|NOCOMPRESS}** 修改表的压缩特性。表压缩特性的改变只会影响后续批量插入的数据的存储方式,对已有数据的存储毫无影响。也就是说,表压缩特性的修改会导致该表中同时存在着已压缩和未压缩的数据。 - > - **TO { GROUP groupname | NODE ( nodename [, ... ] ) }** 此语法仅在扩展模式(GUC参数support_extended_features为on时)下可用。该模式谨慎打开,主要供内部扩容工具使用,一般用户不应使用该模式。 - > - **ADD NODE ( nodename [, ... ] )** 此语法主要供内部扩容工具使用,一般用户不建议使用。 - > - **DELETE NODE ( nodename [, ... ] )** 此语法主要供内部缩容工具使用,一般用户不建议使用。 - > - **DISABLE TRIGGER [ trigger_name | ALL | USER ]** 禁用trigger_name所表示的单个触发器,或禁用所有触发器,或仅禁用用户触发器(此选项不包括内部生成的约束触发器,例如,可延迟唯一性和排除约束的约束触发器)。 应谨慎使用此功能,因为如果不执行触发器,则无法保证原先期望的约束的完整性。 - > - **| ENABLE TRIGGER [ trigger_name | ALL | USER ]** 启用trigger_name所表示的单个触发器,或启用所有触发器,或仅启用用户触发器。 - > - **| ENABLE REPLICA TRIGGER trigger_name** 触发器触发机制受配置变量[session_replication_role](1-statement-behavior)的影响,当复制角色为“origin”(默认值)或“local”时,将触发简单启用的触发器。 配置为ENABLE REPLICA的触发器仅在会话处于“replica”模式时触发。 - > - **| ENABLE ALWAYS TRIGGER trigger_name** 无论当前复制模式如何,配置为ENABLE ALWAYS的触发器都将触发。 - > - **| DISABLE/ENABLE [ REPLICA | ALWAYS ] RULE** 配置属于表的重写规则,已禁用的规则对系统来说仍然是可见的,只是在查询重写期间不被应用。语义为关闭/启动规则。由于关系到视图的实现,ON SELECT规则不可禁用。 配置为ENABLE REPLICA的规则将会仅在会话为”replica” 模式时启动,而配置为ENABLE ALWAYS的触发器将总是会启动,不考虑当前复制模式。规则触发机制也受配置变量[session_replication_role](1-statement-behavior)的影响,类似于上述触发器。 - > - **| DISABLE/ENABLE ROW LEVEL SECURITY** 开启或关闭表的行访问控制开关。 当开启行访问控制开关时,如果未在该数据表定义相关行访问控制策略,数据表的行级访问将不受影响;如果关闭表的行访问控制开关,即使定义了行访问控制策略,数据表的行访问也不受影响。详细信息参见[CREATE ROW LEVEL SECURITY POLICY](CREATE-ROW-LEVEL-SECURITY-POLICY)章节。 - > - **| NO FORCE/FORCE ROW LEVEL SECURITY** 强制开启或关闭表的行访问控制开关。 默认情况,表所有者不受行访问控制特性影响,但当强制开启表的行访问控制开关时,表的所有者(不包含系统管理员用户)会受影响。系统管理员可以绕过所有的行访问控制策略,不受影响。 - > - **| REPLICA IDENTITY {DEFAULT | USING INDEX index_name | FULL | NOTHING}** 调整逻辑复制时写入WAL日志中的信息量,该选项仅在wal_level配置为logical时才有效。 当原数据表发生更新时,默认的逻辑复制流只包含主键的历史记录,如果需要输出所需字段更新或删除的历史记录,可修改本参数。“DEFAULT”(非系统表的默认值)会记录主键字段的旧值。“USING INDEX”会记录名为index_name索引包含的字段的旧值,索引的所有列必须NOT NULL。“FULL”记录了所有列的旧值。“NOTHING”(系统表默认值)不记录旧值的信息。 - > - **SET WITH OIDS** 在资料表中增加了一个OID系统栏位。如果资料表中已经有OID,则此语法什么都不改变。 - > - **SET WITHOUT OIDS** 从资料表中一处OID系统栏位。如果资料表中没有OID,则此语法什么都不改变。 - > - **INHERIT parent_table** 将目标资料表加到指定的父资料表中成为新的子资料表。之后,针对父资料表的查询将会包含目标资料表的资料。要作为子资料表加入前,目标资料表必须已经包含父资料表的所有栏位。这些栏位必须具有可匹配的资料类别,并且如果他们在父资料表中具有NOT NULL的限制条件,那么他们必须在子资料表中也具有NOT NULL的限制条件。对于父资料表的所有CHECK限制条件,必须还有相对应的子资料表限制条件,除非父资料表中标记为不可继承。 - > - **NO INHERIT parent_table** 从指定的父资料表的子资料表中产出目标资料表。针对父资料表的查询将不再包含从目标资料表中所产生的记录。 - > - **OF type_name** 将表连接至一种复合类型,与CREATE TABLE OF选项创建表一样。表的字段的名称和类型必须精确匹配复合类型中的定义,不过oid系统字段允许不一样。表不能是从任何其他表继承的。这些限制确保CREATE TABLE OF选项允许一个相同的表定义。 - > - **NOT OF** 将一个与某类型进行关联的表进行关联的解除。 - > - **REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING }** DEFAULT记录主键的列的旧值。USING INDEX记录命名索引覆盖的列的旧值,这些值必须是唯一的,不局部的,不可延迟的,并且仅包括标记为NOT NULL的列。FULL记录该行中所有列的旧值。NOTHING不记录有关旧行的信息。在所有情况下,除非该行的新旧版本中至少要记录的列之一不同,否则不会记录任何旧值。 - - - 其中列相关的操作column_clause可以是以下子句之一: - - ```ebnf+diagram - column_clause ::= ADD [ COLUMN ] column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] - | MODIFY column_name data_type - | MODIFY column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] - | MODIFY column_name [ CONSTRAINT constraint_name ] NULL - | DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ] - | ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ] - | ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT } - | ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL - | ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer - | ADD STATISTICS (( column_1_name, column_2_name [, ...] )) - | DELETE STATISTICS (( column_1_name, column_2_name [, ...] )) - | ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] ) - | ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] ) - | ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } - ``` - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: - > - > - **ADD [ COLUMN ] column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]** 向表中增加一个新的字段。用ADD COLUMN增加一个字段,所有表中现有行都初始化为该字段的缺省值(如果没有声明DEFAULT子句,值为NULL)。 - > - > - **ADD ( { column_name data_type [ compress_mode ] } [, ... ] )** 向表中增加多列。 - > - > - **MODIFY ( { column_name data_type | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ... ] )** 修改表已存在字段的数据类型。 - > - > - **DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]** 从表中删除一个字段,和这个字段相关的索引和表约束也会被自动删除。如果任何表之外的对象依赖于这个字段,必须声明CASCADE ,比如视图。 DROP COLUMN命令并不是物理上把字段删除,而只是简单地把它标记为对SQL操作不可见。随后对该表的插入和更新将在该字段存储一个NULL。因此,删除一个字段是很快的,但是它不会立即释放表在磁盘上的空间,因为被删除了的字段占据的空间还没有回收。这些空间将在执行VACUUM时而得到回收。 - > - > - **ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]** 改变表字段的数据类型。该字段涉及的索引和简单的表约束将被自动地转换为使用新的字段类型,方法是重新分析最初提供的表达式。 ALTER TYPE要求重写整个表的特性有时候是一个优点,因为重写的过程消除了表中没用的空间。比如,要想立刻回收被一个已经删除的字段占据的空间,最快的方法是 - > - > ```sql - > ALTER TABLE table ALTER COLUMN anycol TYPE anytype; - > ``` - > - > 这里的anycol是任何在表中还存在的字段,而anytype是和该字段的原类型一样的类型。这样的结果是在表上没有任何可见的语意的变化,但是这个命令强制重写,这样就删除了不再使用的数据。 - > - > - **ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT }** 为一个字段设置或者删除缺省值。请注意缺省值只应用于随后的INSERT命令,它们不会修改表中已经存在的行。也可以为视图创建缺省,这个时候它们是在视图的ON INSERT规则应用之前插入到INSERT句中的。 - > - > - **ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL** 修改一个字段是否允许NULL值或者拒绝NULL值。如果表在字段中包含非NULL,则只能使用SET NOT NULL。 - > - > - **ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer** 为随后的ANALYZE操作设置针对每个字段的统计收集目标。目标的范围可以在0到10000之内设置。设置为-1时表示重新恢复到使用系统缺省的统计目标。 - > - > - **{ADD | DELETE} STATISTICS ((column_1_name, column_2_name [, ... ]))** 用于添加和删除多列统计信息声明(不实际进行多列统计信息收集),以便在后续进行全表或全库analyze时进行多列统计信息收集。每组多列统计信息最多支持32列。不支持添加/删除多列统计信息声明的表:系统表、外表。 - > - > - **ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] )** **ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )** 设置/重置属性选项。 目前,属性选项只定义了n_distinct和n_distinct_inherited。n_distinct影响表本身的统计值,而n_distinct_inherited影响表及其继承子表的统计。目前,只支持SET/RESET n_distinct参数,禁止SET/RESET n_distinct_inherited参数。 - > - > - **ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }** 为一个字段设置存储模式。这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。仅支持对行存表的设置;对列存表没有意义,执行时报错。SET STORAGE本身并不改变表上的任何东西,只是设置将来的表操作时,建议使用的策略。 - - - 其中列约束column_constraint为: - - ```ebnf+diagram - column_constraint ::= [ CONSTRAINT constraint_name ] - { NOT NULL | - NULL | - CHECK ( expression ) | - DEFAULT default_expr | - UNIQUE index_parameters | - PRIMARY KEY index_parameters | - ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) | - REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] - [ ON DELETE action ] [ ON UPDATE action ] } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] - ``` - - - 其中压缩可选项compress_mode为: - - ```ebnf+diagram - compress_mode ::= [ DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS ] - ``` - - - 其中根据已有唯一索引为表增加主键约束或唯一约束table_constraint_using_index为: - - ```ebnf+diagram - table_constraint_using_index ::= [ CONSTRAINT constraint_name ] - { UNIQUE | PRIMARY KEY } USING INDEX index_name - [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] - ``` - - - 其中表约束table_constraint为: - - ```ebnf+diagram - table_constraint ::= [ CONSTRAINT constraint_name ] - { CHECK ( expression ) | - UNIQUE ( column_name [, ... ] ) index_parameters | - PRIMARY KEY ( column_name [, ... ] ) index_parameters | - PARTIAL CLUSTER KEY ( column_name [, ... ] ) - FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] - [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } - [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] - ``` - - 其中索引参数index_parameters为: - - ```ebnf+diagram - index_parameters ::= [ WITH ( {storage_parameter = value} [, ... ] ) ] - [ USING INDEX TABLESPACE tablespace_name ] - ``` - -- 重命名表。对名称的修改不会影响所存储的数据。 - - ```ebnf+diagram - AlterTable ::= ALTER TABLE [ IF EXISTS ] table_name - RENAME TO new_table_name; - ``` - -- 重命名表中指定的列。 - - ```ebnf+diagram - AlterTable ::= ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} - RENAME [ COLUMN ] column_name TO new_column_name; - ``` - -- 重命名表的约束。 - - ```ebnf+diagram - AlterTable ::= ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) } - RENAME CONSTRAINT constraint_name TO new_constraint_name; - ``` - -- 设置表的所属模式。 - - ```ebnf+diagram - AlterTable ::= ALTER TABLE [ IF EXISTS ] table_name - SET SCHEMA new_schema; - ``` - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: - > - > - 这种形式把表移动到另外一个模式。相关的索引、约束都跟着移动。目前序列不支持改变schema。 若该表拥有序列,需要将序列删除,重建,或者取消拥有关系, 才能将表schema更改成功。 - > - 要修改一个表的模式,用户必须在新模式上拥有CREATE权限。要把该表添加为一个父表的新子表,用户必须同时又是父表的所有者。要修改所有者,用户还必须是新的所有角色的直接或间接成员,并且该成员必须在此表的模式上有CREATE权限。这些限制规定了该用户不能做出了重建和删除表之外的事情。不过,系统管理员可以以任何方式修改任意表的所有权限。 - > - 除了RENAME和SET SCHEMA之外所有动作都可以捆绑在一个经过多次修改的列表中并行使用。比如,可以在一个命令里增加几个字段或修改几个字段的类型。对于大表,此种操作带来的效率提升更明显,原因在于只需要对该大表做一次处理。 - > - 增加一个CHECK或NOT NULL约束将会扫描该表,以保证现有的行符合约束要求。 - > - 用一个非空缺省值增加一个字段或者改变一个字段的现有类型会重写整个表。对于大表来说,这个操作可能会花很长时间,并且它还临时需要两倍的磁盘空间。 - -- 添加多个列。 - - ```ebnf+diagram - AlterTable ::= ALTER TABLE [ IF EXISTS ] table_name - ADD ( { column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]} [, ...] ); - ``` - -- 更新多个列。 - - ```ebnf+diagram - AlterTable ::= ALTER TABLE [ IF EXISTS ] table_name - MODIFY ( { column_name data_type | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ...] ); - ``` - -## 参数说明 - -- **IF EXISTS** - - 如果不存在相同名称的表,不会抛出一个错误,而会发出一个通知,告知表不存在。 - -- **table_name [\*] | ONLY table_name | ONLY ( table_name )** - - table_name是需要修改的表名。 - - 若声明了ONLY选项,则只有那个表被更改。若未声明ONLY,该表及其所有子表都将会被更改。另外,可以在表名称后面显示地增加*选项来指定包括子表,即表示所有后代表都被扫描,这是默认行为。 - -- **constraint_name** - - 要删除的现有约束的名称。 - -- **index_name** - - 索引名称。 - -- **storage_parameter** - - 表的存储参数的名称。 - - 创建索引新增一个选项: - - - parallel_workers(int类型) - - 取值范围: [0,32],0表示关闭并发。 - - 表示创建索引时起的bgworker线程数量,例如2就表示将会起2个bgworker线程并发创建索引。 - - 如果未设置,启动bgworker线程数量与表大小相关,一般不超过4个线程。 - - - hasuids(bool类型) - - 默认值:off - - 参数开启:更新表元组时,为元组分配表级唯一标识id。 - -- **new_owner** - - 表新拥有者的名称。 - -- **new_tablespace** - - 表所属新的表空间名称。 - -- **column_name**,**column_1_name, column_2_name** - - 现存的或新字段的名称。 - -- **data_type** - - 新字段的类型,或者现存字段的新类型。 - -- **compress_mode** - - 表字段的压缩可选项。该子句指定该字段优先使用的压缩算法。 - -- **collation** - - 字段排序规则名称。可选字段COLLATE指定了新字段的排序规则,如果省略,排序规则为新字段的默认类型。排序规则可以使用“select * from pg_collation;”命令从pg_collation系统表中查询,默认的排序规则为查询结果中以default开始的行。 - -- **USING expression** - - USING子句声明如何从旧的字段值里计算新的字段值;如果省略,缺省从旧类型向新类型的赋值转换。如果从旧数据类型到新类型没有隐含或者赋值的转换,则必须提供一个USING子句。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: - > - > ALTER TYPE的USING选项实际上可以声明涉及该行旧值的任何表达式,即它可以引用除了正在被转换的字段之外其他的字段。这样,就可以用ALTER TYPE语法做非常普遍性的转换。因为这个灵活性,USING表达式并没有作用于该字段的缺省值(如果有的话),结果可能不是缺省表达式要求的常量表达式。这就意味着如果从旧类型到新类型没有隐含或者赋值转换的话,即使存在USING子句,ALTER TYPE也可能无法把缺省值转换成新的类型。在这种情况下,应该用DROP DEFAULT先删除缺省,执行ALTER TYPE,然后使用SET DEFAULT增加一个合适的新缺省值。类似的考虑也适用于涉及该字段的索引和约束。 - -- **NOT NULL | NULL** - - 设置列是否允许空值。 - -- **integer** - - 带符号的整数常值。当使用PERCENT时表示按照表数据的百分比收集统计信息,integer的取值范围为0-100。 - -- **attribute_option** - - 属性选项。 - -- **PLAIN | EXTERNAL | EXTENDED | MAIN** - - 字段存储模式。 - - - PLAIN必需用于定长的数值(比如integer)并且是内联的、不压缩的。 - - MAIN用于内联、可压缩的数据。 - - EXTERNAL用于外部保存、不压缩的数据。使用EXTERNAL将令在text和bytea字段上的子字符串操作更快,但付出的代价是增加了存储空间。 - - EXTENDED用于外部的压缩数据,EXTENDED是大多数支持非PLAIN存储的数据的缺省。 - -- **CHECK ( expression )** - - 每次将要插入的新行或者将要被更新的行必须使表达式结果为真才能成功,否则会抛出一个异常并且不会修改数据库。 - - 声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段。 - - 目前,CHECK表达式不能包含子查询也不能引用除当前行字段之外的变量。 - -- **DEFAULT default_expr** - - 给字段指定缺省值。 - - 缺省表达式的数据类型必须和字段类型匹配。 - - 缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。 - -- **UNIQUE index_parameters** - - **UNIQUE ( column_name [, ... ] ) index_parameters** - - UNIQUE约束表示表里的一个或多个字段的组合必须在全表范围内唯一。 - -- **PRIMARY KEY index_parameters** - - **PRIMARY KEY ( column_name [, ... ] ) index_parameters** - - 主键约束表明表中的一个或者一些字段只能包含唯一(不重复)的非NULL值。 - -- **REFERENCES reftable [ ( refcolum ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (column constraint)** - - **FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (table constraint)** - - 外键约束要求新表中一列或多列构成的组应该只包含、匹配被参考表中被参考字段值。若省略refcolum,则将使用reftable的主键。被参考列应该是被参考表中的唯一字段或主键。外键约束不能被定义在临时表和永久表之间。 - - 参考字段与被参考字段之间存在三种类型匹配,分别是: - - - MATCH FULL:不允许一个多字段外键的字段为NULL,除非全部外键字段都是NULL。 - - MATCH SIMPLE(缺省):允许任意外键字段为NULL。 - - MATCH PARTIAL:目前暂不支持。 - - 另外,当被参考表中的数据发生改变时,某些操作也会在新表对应字段的数据上执行。ON DELETE子句声明当被参考表中的被参考行被删除时要执行的操作。ON UPDATE子句声明当被参考表中的被参考字段数据更新时要执行的操作。对于ON DELETE子句、ON UPDATE子句的可能动作: - - - NO ACTION(缺省):删除或更新时,创建一个表明违反外键约束的错误。若约束可推迟,且若仍存在任何引用行,那这个错误将会在检查约束的时候产生。 - - RESTRICT:删除或更新时,创建一个表明违反外键约束的错误。与NO ACTION相同,只是动作不可推迟。 - - CASCADE:删除新表中任何引用了被删除行的行,或更新新表中引用行的字段值为被参考字段的新值。 - - SET NULL:设置引用字段为NULL。 - - SET DEFAULT:设置引用字段为它们的缺省值。 - -- **DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE** - - 设置该约束是否可推迟。 - - - DEFERRABLE:可以推迟到事务结尾使用SET CONSTRAINTS命令检查。 - - NOT DEFERRABLE:在每条命令之后马上检查。 - - INITIALLY IMMEDIATE:那么每条语句之后就立即检查它。 - - INITIALLY DEFERRED:只有在事务结尾才检查它。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif)**说明**: Ustore表不支持新增DEFERRABLE以及INITIALLY DEFERRED约束。 - -- **PARTIAL CLUSTER KEY** - - 局部聚簇存储,列存表导入数据时按照指定的列(单列或多列),进行局部排序。 - -- **WITH ( {storage_parameter = value} [, ... ] )** - - 为表或索引指定一个可选的存储参数。 - -- **tablespace_name** - - 索引所在表空间的名称。 - -- **COMPRESS|NOCOMPRESS** - - - NOCOMPRESS:如果指定关键字NOCOMPRESS则不会修改表的现有压缩特性。 - - COMPRESS:如果指定COMPRESS关键字,则对该表进行批量插入元组时触发该特性。 - -- **new_table_name** - - 修改后新的表名称。 - -- **new_column_name** - - 表中指定列修改后新的列名称。 - -- **new_constraint_name** - - 修改后表约束的新名称。 - -- **new_schema** - - 修改后新的模式名称。 - -- **CASCADE** - - 级联删除依赖于被依赖字段或者约束的对象(比如引用该字段的视图)。 - -- **RESTRICT** - - 如果字段或者约束还有任何依赖的对象,则拒绝删除该字段。这是缺省行为。 - -- **schema_name** - - 表所在的模式名称。 - -## 示例 - -请参考[CREATE TABLE](CREATE-TABLE)的示例。 - -## 相关链接 - -[CREATE TABLE](CREATE-TABLE),[DROP TABLE](DROP-TABLE) +--- +title: ALTER TABLE +summary: ALTER TABLE +author: Zhang Cuiping +date: 2021-05-17 +--- + +# ALTER TABLE + +## 功能描述 + +修改表,包括修改表的定义、重命名表、重命名表中指定的列、重命名表的约束、设置表的所属模式、添加/更新多个列、打开/关闭行访问控制开关。 + +## 注意事项 + +- 表的所有者被授予了表ALTER权限的用户或被授予ALTER ANY TABLE的用户有权限执行ALTER TABLE命令,系统管理员默认拥有此权限。但要修改表的所有者或者修改表的模式,当前用户必须是该表的所有者或者系统管理员,且该用户是新所有者角色的成员。 +- 不能修改分区表的tablespace,但可以修改分区的tablespace。 +- 不支持修改存储参数ORIENTATION。 +- SET SCHEMA操作不支持修改为系统内部模式,当前仅支持用户模式之间的修改。 +- 列存表只支持PARTIAL CLUSTER KEY、UNIQUE、PRIMARY KEY表级约束,不支持外键等表级约束。 +- 列存表只支持添加字段ADD COLUMN、修改字段的数据类型ALTER TYPE、设置单个字段的收集目标SET STATISTICS、支持更改表名称、支持更改表空间,支持删除字段DROP COLUMN。对于添加的字段和修改的字段类型要求是列存[支持的数据类型](1-numeric-data-types)。ALTER TYPE的USING选项只支持常量表达式和涉及本字段的表达式,暂不支持涉及其他字段的表达式。 +- 列存表支持的字段约束包括NULL、NOT NULL、DEFAULT常量值、UNIQUE和PRIMARY KEY;对字段约束的修改当前只支持对DEFAULT值的修改(SET DEFAULT)和删除(DROP DEFAULT),暂不支持对非空约束NULL/NOT NULL的修改。 +- 不支持增加自增列,或者增加DEFAULT值中包含nextval()表达式的列。 +- 不支持对外表、临时表开启行访问控制开关。 +- 通过约束名删除PRIMARY KEY约束时,不会删除NOT NULL约束,如果有需要,请手动删除NOT NULL约束。 +- 使用JDBC时,支持通过PrepareStatement对DEFAUTL值进行参数化设置。 + +## 语法格式 + +- 修改表的定义。 + + ```ebnf+diagram + AlterTable ::= ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) } + action [, ... ]; + ``` + + 其中具体表操作action可以是以下子句之一: + + ```ebnf+diagram + action ::= column_clause + | ADD table_constraint [ NOT VALID ] + | ADD table_constraint_using_index + | VALIDATE CONSTRAINT constraint_name + | DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ] + | CLUSTER ON index_name + | SET WITHOUT CLUSTER + | SET ( {storage_parameter = value} [, ... ] ) + | RESET ( storage_parameter [, ... ] ) + | OWNER TO new_owner + | SET TABLESPACE new_tablespace + | SET {COMPRESS|NOCOMPRESS} + | TO { GROUP groupname | NODE ( nodename [, ... ] ) } + | ADD NODE ( nodename [, ... ] ) + | DELETE NODE ( nodename [, ... ] ) + | DISABLE TRIGGER [ trigger_name | ALL | USER ] + | ENABLE TRIGGER [ trigger_name | ALL | USER ] + | ENABLE REPLICA TRIGGER trigger_name + | ENABLE ALWAYS TRIGGER trigger_name + | DISABLE '/' ENABLE [ REPLICA | ALWAYS ] RULE + | DISABLE ROW LEVEL SECURITY + | ENABLE ROW LEVEL SECURITY + | FORCE ROW LEVEL SECURITY + | NO FORCE ROW LEVEL SECURITY + | ENCRYPTION KEY ROTATION + | SET WITH OIDS + | SET WITHOUT OIDS + | INHERIT parents + | NO INHERIT parents + | OF type_name + | NOT OF + | REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING } + ``` + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** + > + > - **ADD table_constraint [ NOT VALID ]** 给表增加一个新的约束。 + > - **ADD table_constraint_using_index** 根据已有唯一索引为表增加主键约束或唯一约束。 + > - **VALIDATE CONSTRAINT constraint_name** 验证一个使用NOT VALID选项创建的检查类约束,通过扫描全表来保证所有记录都符合约束条件。如果约束已标记为有效时,什么操作也不会发生。 + > - **DROP CONSTRAINT [ IF EXISTS ] constraint_name [ RESTRICT | CASCADE ]** 删除一个表上的约束。 + > - **CLUSTER ON index_name** 为将来的CLUSTER(聚簇)操作选择默认索引。实际上并没有重新盘簇化处理该表。 + > - **SET WITHOUT CLUSTER** 从表中删除最新使用的CLUSTER索引。这样会影响将来那些没有声明索引的CLUSTER(聚簇)操作。 + > - **SET ( {storage_parameter = value} [, ... ] )** 修改表的一个或多个存储参数。 + > - **RESET ( storage_parameter [, ... ] )** 重置表的一个或多个存储参数。与SET一样,根据参数的不同可能需要重写表才能获得想要的效果。 + > - **OWNER TO new_owner** 将表、序列、视图的属主改变成指定的用户。 + > - **SET TABLESPACE new_tablespace** 这种形式将表空间修改为指定的表空间并将相关的数据文件移动到新的表空间。但是表上的所有索引都不会被移动,索引可以通过ALTER INDEX语法的SET TABLESPACE选项来修改索引的表空间。 + > - **SET {COMPRESS|NOCOMPRESS}** 修改表的压缩特性。表压缩特性的改变只会影响后续批量插入的数据的存储方式,对已有数据的存储毫无影响。也就是说,表压缩特性的修改会导致该表中同时存在着已压缩和未压缩的数据。 + > - **TO { GROUP groupname | NODE ( nodename [, ... ] ) }** 此语法仅在扩展模式(GUC参数support_extended_features为on时)下可用。该模式谨慎打开,主要供内部扩容工具使用,一般用户不应使用该模式。 + > - **ADD NODE ( nodename [, ... ] )** 此语法主要供内部扩容工具使用,一般用户不建议使用。 + > - **DELETE NODE ( nodename [, ... ] )** 此语法主要供内部缩容工具使用,一般用户不建议使用。 + > - **DISABLE TRIGGER [ trigger_name | ALL | USER ]** 禁用trigger_name所表示的单个触发器,或禁用所有触发器,或仅禁用用户触发器(此选项不包括内部生成的约束触发器,例如,可延迟唯一性和排除约束的约束触发器)。 应谨慎使用此功能,因为如果不执行触发器,则无法保证原先期望的约束的完整性。 + > - **| ENABLE TRIGGER [ trigger_name | ALL | USER ]** 启用trigger_name所表示的单个触发器,或启用所有触发器,或仅启用用户触发器。 + > - **| ENABLE REPLICA TRIGGER trigger_name** 触发器触发机制受配置变量[session_replication_role](1-statement-behavior)的影响,当复制角色为“origin”(默认值)或“local”时,将触发简单启用的触发器。 配置为ENABLE REPLICA的触发器仅在会话处于“replica”模式时触发。 + > - **| ENABLE ALWAYS TRIGGER trigger_name** 无论当前复制模式如何,配置为ENABLE ALWAYS的触发器都将触发。 + > - **| DISABLE/ENABLE [ REPLICA | ALWAYS ] RULE** 配置属于表的重写规则,已禁用的规则对系统来说仍然是可见的,只是在查询重写期间不被应用。语义为关闭/启动规则。由于关系到视图的实现,ON SELECT规则不可禁用。 配置为ENABLE REPLICA的规则将会仅在会话为”replica” 模式时启动,而配置为ENABLE ALWAYS的触发器将总是会启动,不考虑当前复制模式。规则触发机制也受配置变量[session_replication_role](1-statement-behavior)的影响,类似于上述触发器。 + > - **| DISABLE/ENABLE ROW LEVEL SECURITY** 开启或关闭表的行访问控制开关。 当开启行访问控制开关时,如果未在该数据表定义相关行访问控制策略,数据表的行级访问将不受影响;如果关闭表的行访问控制开关,即使定义了行访问控制策略,数据表的行访问也不受影响。详细信息参见[CREATE ROW LEVEL SECURITY POLICY](CREATE-ROW-LEVEL-SECURITY-POLICY)章节。 + > - **| NO FORCE/FORCE ROW LEVEL SECURITY** 强制开启或关闭表的行访问控制开关。 默认情况,表所有者不受行访问控制特性影响,但当强制开启表的行访问控制开关时,表的所有者(不包含系统管理员用户)会受影响。系统管理员可以绕过所有的行访问控制策略,不受影响。 + > - **| REPLICA IDENTITY {DEFAULT | USING INDEX index_name | FULL | NOTHING}** 调整逻辑复制时写入WAL日志中的信息量,该选项仅在wal_level配置为logical时才有效。 当原数据表发生更新时,默认的逻辑复制流只包含主键的历史记录,如果需要输出所需字段更新或删除的历史记录,可修改本参数。“DEFAULT”(非系统表的默认值)会记录主键字段的旧值。“USING INDEX”会记录名为index_name索引包含的字段的旧值,索引的所有列必须NOT NULL。“FULL”记录了所有列的旧值。“NOTHING”(系统表默认值)不记录旧值的信息。 + > - **SET WITH OIDS** 在资料表中增加了一个OID系统栏位。如果资料表中已经有OID,则此语法什么都不改变。 + > - **SET WITHOUT OIDS** 从资料表中一处OID系统栏位。如果资料表中没有OID,则此语法什么都不改变。 + > - **INHERIT parent_table** 将目标资料表加到指定的父资料表中成为新的子资料表。之后,针对父资料表的查询将会包含目标资料表的资料。要作为子资料表加入前,目标资料表必须已经包含父资料表的所有栏位。这些栏位必须具有可匹配的资料类别,并且如果他们在父资料表中具有NOT NULL的限制条件,那么他们必须在子资料表中也具有NOT NULL的限制条件。对于父资料表的所有CHECK限制条件,必须还有相对应的子资料表限制条件,除非父资料表中标记为不可继承。 + > - **NO INHERIT parent_table** 从指定的父资料表的子资料表中产出目标资料表。针对父资料表的查询将不再包含从目标资料表中所产生的记录。 + > - **OF type_name** 将表连接至一种复合类型,与CREATE TABLE OF选项创建表一样。表的字段的名称和类型必须精确匹配复合类型中的定义,不过oid系统字段允许不一样。表不能是从任何其他表继承的。这些限制确保CREATE TABLE OF选项允许一个相同的表定义。 + > - **NOT OF** 将一个与某类型进行关联的表进行关联的解除。 + > - **REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING }** DEFAULT记录主键的列的旧值。USING INDEX记录命名索引覆盖的列的旧值,这些值必须是唯一的,不局部的,不可延迟的,并且仅包括标记为NOT NULL的列。FULL记录该行中所有列的旧值。NOTHING不记录有关旧行的信息。在所有情况下,除非该行的新旧版本中至少要记录的列之一不同,否则不会记录任何旧值。 + + - 其中列相关的操作column_clause可以是以下子句之一: + + ```ebnf+diagram + column_clause ::= ADD [ COLUMN ] column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] + | MODIFY column_name data_type [ ON UPDATE update_expr ] + | MODIFY column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] + | MODIFY column_name [ CONSTRAINT constraint_name ] NULL + | DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ] + | ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ] + | ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT } + | ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL + | ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer + | ADD STATISTICS (( column_1_name, column_2_name [, ...] )) + | DELETE STATISTICS (( column_1_name, column_2_name [, ...] )) + | ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] ) + | ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] ) + | ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN } + ``` + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** + > + > - **ADD [ COLUMN ] column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]** 向表中增加一个新的字段。用ADD COLUMN增加一个字段,所有表中现有行都初始化为该字段的缺省值(如果没有声明DEFAULT子句,值为NULL)。 + > + > - **ADD ( { column_name data_type [ compress_mode ] } [, ... ] )** 向表中增加多列。 + > + > - **MODIFY ( { column_name data_type [ ON UPDATE update_expr ] | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ... ] )** 修改表已存在字段的数据类型和约束属性。ON UPDATE expr只能在MySQL兼容性下使用。 + > + > - **DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]** 从表中删除一个字段,和这个字段相关的索引和表约束也会被自动删除。如果任何表之外的对象依赖于这个字段,必须声明CASCADE ,比如视图。 DROP COLUMN命令并不是物理上把字段删除,而只是简单地把它标记为对SQL操作不可见。随后对该表的插入和更新将在该字段存储一个NULL。因此,删除一个字段是很快的,但是它不会立即释放表在磁盘上的空间,因为被删除了的字段占据的空间还没有回收。这些空间将在执行VACUUM时而得到回收。 + > + > - **ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]** 改变表字段的数据类型。该字段涉及的索引和简单的表约束将被自动地转换为使用新的字段类型,方法是重新分析最初提供的表达式。 ALTER TYPE要求重写整个表的特性有时候是一个优点,因为重写的过程消除了表中没用的空间。比如,要想立刻回收被一个已经删除的字段占据的空间,最快的方法是 + > + > ```sql + > ALTER TABLE table ALTER COLUMN anycol TYPE anytype; + > ``` + > + > 这里的anycol是任何在表中还存在的字段,而anytype是和该字段的原类型一样的类型。这样的结果是在表上没有任何可见的语意的变化,但是这个命令强制重写,这样就删除了不再使用的数据。 + > + > - **ALTER [ COLUMN ] column_name { SET DEFAULT expression | DROP DEFAULT }** 为一个字段设置或者删除缺省值。请注意缺省值只应用于随后的INSERT命令,它们不会修改表中已经存在的行。也可以为视图创建缺省,这个时候它们是在视图的ON INSERT规则应用之前插入到INSERT句中的。 + > + > - **ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL** 修改一个字段是否允许NULL值或者拒绝NULL值。如果表在字段中包含非NULL,则只能使用SET NOT NULL。 + > + > - **ALTER [ COLUMN ] column_name SET STATISTICS [PERCENT] integer** 为随后的ANALYZE操作设置针对每个字段的统计收集目标。目标的范围可以在0到10000之内设置。设置为-1时表示重新恢复到使用系统缺省的统计目标。 + > + > - **{ADD | DELETE} STATISTICS ((column_1_name, column_2_name [, ... ]))** 用于添加和删除多列统计信息声明(不实际进行多列统计信息收集),以便在后续进行全表或全库analyze时进行多列统计信息收集。每组多列统计信息最多支持32列。不支持添加/删除多列统计信息声明的表:系统表、外表。 + > + > - **ALTER [ COLUMN ] column_name SET ( {attribute_option = value} [, ... ] )** **ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )** 设置/重置属性选项。 目前,属性选项只定义了n_distinct和n_distinct_inherited。n_distinct影响表本身的统计值,而n_distinct_inherited影响表及其继承子表的统计。目前,只支持SET/RESET n_distinct参数,禁止SET/RESET n_distinct_inherited参数。 + > + > - **ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }** 为一个字段设置存储模式。这个设置控制这个字段是内联保存还是保存在一个附属的表里,以及数据是否要压缩。仅支持对行存表的设置;对列存表没有意义,执行时报错。SET STORAGE本身并不改变表上的任何东西,只是设置将来的表操作时,建议使用的策略。 + + - 其中列约束column_constraint为: + + ```ebnf+diagram + column_constraint ::= [ CONSTRAINT constraint_name ] + { NOT NULL | + NULL | + CHECK ( expression ) | + DEFAULT default_expr | + UNIQUE index_parameters | + PRIMARY KEY index_parameters | + ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value ) | + REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] + [ ON DELETE action ] [ ON UPDATE action ] } [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + ``` + + - 其中压缩可选项compress_mode为: + + ```ebnf+diagram + compress_mode ::= [ DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS ] + ``` + + - 其中根据已有唯一索引为表增加主键约束或唯一约束table_constraint_using_index为: + + ```ebnf+diagram + table_constraint_using_index ::= [ CONSTRAINT constraint_name ] + { UNIQUE | PRIMARY KEY } USING INDEX index_name + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + ``` + + - 其中表约束table_constraint为: + + ```ebnf+diagram + table_constraint ::= [ CONSTRAINT constraint_name ] + { CHECK ( expression ) | + UNIQUE ( column_name [, ... ] ) index_parameters | + PRIMARY KEY ( column_name [, ... ] ) index_parameters | + PARTIAL CLUSTER KEY ( column_name [, ... ] ) + FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] + [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + ``` + + 其中索引参数index_parameters为: + + ```ebnf+diagram + index_parameters ::= [ WITH ( {storage_parameter = value} [, ... ] ) ] + [ USING INDEX TABLESPACE tablespace_name ] + ``` + +- 重命名表。对名称的修改不会影响所存储的数据。 + + ```ebnf+diagram + AlterTable ::= ALTER TABLE [ IF EXISTS ] table_name + RENAME TO new_table_name; + ``` + +- 重命名表中指定的列。 + + ```ebnf+diagram + AlterTable ::= ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name )} + RENAME [ COLUMN ] column_name TO new_column_name; + ``` + +- 重命名表的约束。 + + ```ebnf+diagram + AlterTable ::= ALTER TABLE [ IF EXISTS ] { table_name [*] | ONLY table_name | ONLY ( table_name ) } + RENAME CONSTRAINT constraint_name TO new_constraint_name; + ``` + +- 设置表的所属模式。 + + ```ebnf+diagram + AlterTable ::= ALTER TABLE [ IF EXISTS ] table_name + SET SCHEMA new_schema; + ``` + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** + > + > - 这种形式把表移动到另外一个模式。相关的索引、约束都跟着移动。目前序列不支持改变schema。 若该表拥有序列,需要将序列删除,重建,或者取消拥有关系, 才能将表schema更改成功。 + > - 要修改一个表的模式,用户必须在新模式上拥有CREATE权限。要把该表添加为一个父表的新子表,用户必须同时又是父表的所有者。要修改所有者,用户还必须是新的所有角色的直接或间接成员,并且该成员必须在此表的模式上有CREATE权限。这些限制规定了该用户不能做出了重建和删除表之外的事情。不过,系统管理员可以以任何方式修改任意表的所有权限。 + > - 除了RENAME和SET SCHEMA之外所有动作都可以捆绑在一个经过多次修改的列表中并行使用。比如,可以在一个命令里增加几个字段或修改几个字段的类型。对于大表,此种操作带来的效率提升更明显,原因在于只需要对该大表做一次处理。 + > - 增加一个CHECK或NOT NULL约束将会扫描该表,以保证现有的行符合约束要求。 + > - 用一个非空缺省值增加一个字段或者改变一个字段的现有类型会重写整个表。对于大表来说,这个操作可能会花很长时间,并且它还临时需要两倍的磁盘空间。 + +- 添加多个列。 + + ```ebnf+diagram + AlterTable ::= ALTER TABLE [ IF EXISTS ] table_name + ADD ( { column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]} [, ...] ); + ``` + +- 更新多个列。 + + ```ebnf+diagram + AlterTable ::= ALTER TABLE [ IF EXISTS ] table_name + MODIFY ( { column_name data_type [ ON UPDATE update_expr ] | column_name [ CONSTRAINT constraint_name ] NOT NULL [ ENABLE ] | column_name [ CONSTRAINT constraint_name ] NULL } [, ...] ); + ``` + +## 参数说明 + +- **IF EXISTS** + + 如果不存在相同名称的表,不会抛出一个错误,而会发出一个通知,告知表不存在。 + +- **table_name [\*] | ONLY table_name | ONLY ( table_name )** + + table_name是需要修改的表名。 + + 若声明了ONLY选项,则只有那个表被更改。若未声明ONLY,该表及其所有子表都将会被更改。另外,可以在表名称后面显示地增加*选项来指定包括子表,即表示所有后代表都被扫描,这是默认行为。 + +- **constraint_name** + + 要删除的现有约束的名称。 + +- **on update update_expr** + + 设置字段on update表达式,可以添加,删除,修改 on update 属性。 + +- **index_name** + + 索引名称。 + +- **storage_parameter** + + 表的存储参数的名称。 + + 创建索引新增一个选项: + + - parallel_workers(int类型) + + 取值范围: [0,32],0表示关闭并发。 + + 表示创建索引时起的bgworker线程数量,例如2就表示将会起2个bgworker线程并发创建索引。 + + 如果未设置,启动bgworker线程数量与表大小相关,一般不超过4个线程。 + + - hasuids(bool类型) + + 默认值:off + + 参数开启:更新表元组时,为元组分配表级唯一标识id。 + +- **new_owner** + + 表新拥有者的名称。 + +- **new_tablespace** + + 表所属新的表空间名称。 + +- **column_name**,**column_1_name, column_2_name** + + 现存的或新字段的名称。 + +- **data_type** + + 新字段的类型,或者现存字段的新类型。 + +- **compress_mode** + + 表字段的压缩可选项。该子句指定该字段优先使用的压缩算法。 + +- **collation** + + 字段排序规则名称。可选字段COLLATE指定了新字段的排序规则,如果省略,排序规则为新字段的默认类型。排序规则可以使用“select * from pg_collation;”命令从pg_collation系统表中查询,默认的排序规则为查询结果中以default开始的行。 + +- **USING expression** + + USING子句声明如何从旧的字段值里计算新的字段值;如果省略,缺省从旧类型向新类型的赋值转换。如果从旧数据类型到新类型没有隐含或者赋值的转换,则必须提供一个USING子句。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** + > + > ALTER TYPE的USING选项实际上可以声明涉及该行旧值的任何表达式,即它可以引用除了正在被转换的字段之外其他的字段。这样,就可以用ALTER TYPE语法做非常普遍性的转换。因为这个灵活性,USING表达式并没有作用于该字段的缺省值(如果有的话),结果可能不是缺省表达式要求的常量表达式。这就意味着如果从旧类型到新类型没有隐含或者赋值转换的话,即使存在USING子句,ALTER TYPE也可能无法把缺省值转换成新的类型。在这种情况下,应该用DROP DEFAULT先删除缺省,执行ALTER TYPE,然后使用SET DEFAULT增加一个合适的新缺省值。类似的考虑也适用于涉及该字段的索引和约束。 + +- **NOT NULL | NULL** + + 设置列是否允许空值。 + +- **integer** + + 带符号的整数常值。当使用PERCENT时表示按照表数据的百分比收集统计信息,integer的取值范围为0-100。 + +- **attribute_option** + + 属性选项。 + +- **PLAIN | EXTERNAL | EXTENDED | MAIN** + + 字段存储模式。 + + - PLAIN必需用于定长的数值(比如integer)并且是内联的、不压缩的。 + - MAIN用于内联、可压缩的数据。 + - EXTERNAL用于外部保存、不压缩的数据。使用EXTERNAL将令在text和bytea字段上的子字符串操作更快,但付出的代价是增加了存储空间。 + - EXTENDED用于外部的压缩数据,EXTENDED是大多数支持非PLAIN存储的数据的缺省。 + +- **CHECK ( expression )** + + 每次将要插入的新行或者将要被更新的行必须使表达式结果为真才能成功,否则会抛出一个异常并且不会修改数据库。 + + 声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段。 + + 目前,CHECK表达式不能包含子查询也不能引用除当前行字段之外的变量。 + +- **DEFAULT default_expr** + + 给字段指定缺省值。 + + 缺省表达式的数据类型必须和字段类型匹配。 + + 缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。 + +- **UNIQUE index_parameters** + + **UNIQUE ( column_name [, ... ] ) index_parameters** + + UNIQUE约束表示表里的一个或多个字段的组合必须在全表范围内唯一。 + +- **PRIMARY KEY index_parameters** + + **PRIMARY KEY ( column_name [, ... ] ) index_parameters** + + 主键约束表明表中的一个或者一些字段只能包含唯一(不重复)的非NULL值。 + +- **REFERENCES reftable [ ( refcolum ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (column constraint)** + + **FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (table constraint)** + + 外键约束要求新表中一列或多列构成的组应该只包含、匹配被参考表中被参考字段值。若省略refcolum,则将使用reftable的主键。被参考列应该是被参考表中的唯一字段或主键。外键约束不能被定义在临时表和永久表之间。 + + 参考字段与被参考字段之间存在三种类型匹配,分别是: + + - MATCH FULL:不允许一个多字段外键的字段为NULL,除非全部外键字段都是NULL。 + - MATCH SIMPLE(缺省):允许任意外键字段为NULL。 + - MATCH PARTIAL:目前暂不支持。 + + 另外,当被参考表中的数据发生改变时,某些操作也会在新表对应字段的数据上执行。ON DELETE子句声明当被参考表中的被参考行被删除时要执行的操作。ON UPDATE子句声明当被参考表中的被参考字段数据更新时要执行的操作。对于ON DELETE子句、ON UPDATE子句的可能动作: + + - NO ACTION(缺省):删除或更新时,创建一个表明违反外键约束的错误。若约束可推迟,且若仍存在任何引用行,那这个错误将会在检查约束的时候产生。 + - RESTRICT:删除或更新时,创建一个表明违反外键约束的错误。与NO ACTION相同,只是动作不可推迟。 + - CASCADE:删除新表中任何引用了被删除行的行,或更新新表中引用行的字段值为被参考字段的新值。 + - SET NULL:设置引用字段为NULL。 + - SET DEFAULT:设置引用字段为它们的缺省值。 + +- **DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE** + + 设置该约束是否可推迟。 + + - DEFERRABLE:可以推迟到事务结尾使用SET CONSTRAINTS命令检查。 + - NOT DEFERRABLE:在每条命令之后马上检查。 + - INITIALLY IMMEDIATE:那么每条语句之后就立即检查它。 + - INITIALLY DEFERRED:只有在事务结尾才检查它。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif)**说明:** Ustore表不支持新增DEFERRABLE以及INITIALLY DEFERRED约束。 + +- **PARTIAL CLUSTER KEY** + + 局部聚簇存储,列存表导入数据时按照指定的列(单列或多列),进行局部排序。 + +- **WITH ( {storage_parameter = value} [, ... ] )** + + 为表或索引指定一个可选的存储参数。 + +- **tablespace_name** + + 索引所在表空间的名称。 + +- **COMPRESS|NOCOMPRESS** + + - NOCOMPRESS:如果指定关键字NOCOMPRESS则不会修改表的现有压缩特性。 + - COMPRESS:如果指定COMPRESS关键字,则对该表进行批量插入元组时触发该特性。 + +- **new_table_name** + + 修改后新的表名称。 + +- **new_column_name** + + 表中指定列修改后新的列名称。 + +- **new_constraint_name** + + 修改后表约束的新名称。 + +- **new_schema** + + 修改后新的模式名称。 + +- **CASCADE** + + 级联删除依赖于被依赖字段或者约束的对象(比如引用该字段的视图)。 + +- **RESTRICT** + + 如果字段或者约束还有任何依赖的对象,则拒绝删除该字段。这是缺省行为。 + +- **schema_name** + + 表所在的模式名称。 + +## 示例 + +请参考[CREATE TABLE](CREATE-TABLE)的示例。 + +## 相关链接 + +[CREATE TABLE](CREATE-TABLE),[DROP TABLE](DROP-TABLE) diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/CREATE-INDEX.md b/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/CREATE-INDEX.md index 82c34196626eb3a1311c0d22e5ed820cd411e698..9cd565c2c12b9b77ae35d37c77c80555a2def01d 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/CREATE-INDEX.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/CREATE-INDEX.md @@ -40,7 +40,8 @@ date: 2021-05-10 [ INCLUDE ( column_name [, ...] )] [ WITH ( {storage_parameter = value} [, ... ] ) ] [ TABLESPACE tablespace_name ] - [ WHERE predicate ]; + [ WHERE predicate ] + [ PARALLEL num ]; ``` - 在分区表上创建索引。 @@ -51,7 +52,8 @@ date: 2021-05-10 [ LOCAL [ ( { PARTITION index_partition_name | SUBPARTITION index_subpartition_name [ TABLESPACE index_partition_tablespace ] } [, ...] ) ] | GLOBAL ] [ INCLUDE ( column_name [, ...] )] [ WITH ( { storage_parameter = value } [, ...] ) ] - [ TABLESPACE tablespace_name ]; + [ TABLESPACE tablespace_name ] + [ PARALLEL num ]; ``` ## 参数说明 @@ -70,7 +72,7 @@ date: 2021-05-10 - 普通CREATE INDEX命令可以在事务内执行,但是CREATE INDEX CONCURRENTLY不可以在事务内执行。 - 列存表、分区表和临时表不支持CONCURRENTLY方式创建索引。 - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** > > - 创建索引时指定此关键字,需要执行先后两次对该表的全表扫描来完成build,第一次扫描的时候创建索引,不阻塞读写操作;第二次扫描的时候合并更新第一次扫描到目前为止发生的变更。 > - 由于需要执行两次对表的扫描和build,而且必须等待现有的所有可能对该表执行修改的事务结束。这意味着该索引的创建比正常耗时更长,同时因此带来的CPU和I/O消耗对其他业务也会造成影响。 @@ -111,10 +113,12 @@ date: 2021-05-10 - gist:Gist索引适用于几何和地理等多维数据类型和集合数据类型。目前支持的数据类型有box、point、poly、circle、tsvector、tsquery、range。 - Psort:Psort索引。针对列存表进行局部排序索引。 - ubtree:仅供ustore表使用的多版本B-tree索引,索引页面上包含事务信息,能并自主回收页面。 + - ==brin:创建 brin index 时需要指定参数pages_per_range,指定brin索引中每个range中包含多少个page。== + - ==bloom:创建bloom索引,需要指定length和col参数。== 行存表(ASTORE存储引擎)支持的索引类型:btree(行存表缺省值)、hash、gin、gist。行存表(USTORE存储引擎)支持的索引类型:ubtree。列存表支持的索引类型:Psort(列存表缺省值)、btree、gin。全局临时表不支持GIN索引和Gist索引。 - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 列存表对GIN索引支持仅限于对于tsvector类型的支持,即创建列存GIN索引入参需要为to_tsvector函数(的返回值)。此方法为GIN索引比较普遍的使用方式。 + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** 列存表对GIN索引支持仅限于对于tsvector类型的支持,即创建列存GIN索引入参需要为to_tsvector函数(的返回值)。此方法为GIN索引比较普遍的使用方式。 - **column_name** @@ -209,6 +213,36 @@ date: 2021-05-10 取值范围:INSERTPT,DEAFAULT 默认值:INSERTPT + + - ==pages_per_range== + + 表示一条BRIN索引中包含多少个数据页的摘要信息。通常这个值设置得越小,索引占用的空间越大(因为需要存储更多的索引项),同时索引中摘要信息也越精确,在使用索引扫描时可以跳过更多数据页。 + + 取值范围:==待补充== + + 默认值:128 + + - ==autosummarize== + + 当新增的数据页范围超出当前索引中的数据页范围时,是否为这些新增的数据页自动增加索引项。 + + 取值范围:布尔值 + + 默认值:==待补充== + + - ==length== + + 指定一条索引中生成的签名使用多少bit表示。默认值是80,内部会将用户指定的值会向上取整为16的整数倍(对用户透明),最小值是1,最大值是4096。如果设置值不在限定范围内,命令执行报错,并提示数值的正确范围。 + + - ==col1-col32== + + 指定每一个索引列使用多少bit表示。默认值是2,最小值是1,最大值是4095。如果设置值不在限定范围内,命令执行报错,并提示数值的正确范围。 + + 如果对非行存表创建Bloom索引,报错,提示不能对非行存表创建。 + + 如果创建Bloom的唯一索引,报错,提示不能创建唯一索引。 + + 如果创建分区表的Global索引,且索引类型是Bloom,报错,提示分区表Global索引只能是Btree类型。 - **TABLESPACE tablespace_name** @@ -239,50 +273,112 @@ date: 2021-05-10 索引分区的表空间。 取值范围: 如果没有声明,将使用分区表索引的表空间index_tablespace。 - + - **COMPRESS\_TYPE** 索引参数,设置索引压缩算法。1代表pglz算法,2代表zstd算法,默认不压缩。(仅支持B-TREE索引) 取值范围:0\~2,默认值为0。 - + - **COMPRESS\_LEVEL** - + 索引参数,设置索引压缩算法等级,仅当COMPRESS_TYPE为2时生效。压缩等级越高,索引的压缩效果越好,索引的访问速度越慢。(仅支持B-TREE索引) - + 取值范围:-31\~31,默认值为0。 - + - **COMPRESS\_CHUNK_SIZE** - + 索引参数,设置索引压缩chunk块大小。chunk数据块越小,预期能达到的压缩效果越好,同时数据越离散,影响索引的访问速度。(仅支持B-TREE索引) - + 取值范围:与页面大小有关。在页面大小为8k场景,取值范围为:512、1024、2048、4096。 - + 默认值:4096 - + - **COMPRESS_PREALLOC_CHUNKS** - + 索引参数,设置索引压缩chunk块预分配数量。预分配数量越大,索引的压缩率相对越差,离散度越小,访问性能越好。(仅支持B-TREE索引) - + 取值范围:0\~7,默认值为0。 - + - 当COMPRESS_CHUNK_SIZE为512和1024时,支持预分配设置最大为7。 - 当COMPRESS_CHUNK_SIZE为2048时,支持预分配设置最大为3。 - 当COMPRESS_CHUNK_SIZE为4096时,支持预分配设置最大为1。 - + - **COMPRESS_BYTE_CONVERT** - + 索引参数,设置索引压缩字节转换预处理。在一些场景下可以提升压缩效果,同时会导致一定性能劣化。 - + 取值范围:布尔值,默认关闭。 - + - **COMPRESS_DIFF_CONVERT** - + 索引参数,设置索引压缩字节差分预处理。只能与compress_byte_convert一起使用。在一些场景下可以提升压缩效果,同时会导致一定性能劣化。 - + 取值范围:布尔值,默认关闭。 - -## 示例 + +- **PARALLEL num** + + 在索引创建语句中直接指定并行度,根据对当前资源环境以及自身需求来指定并行度,可以更加有效地利用资源,同时提高使用灵活性。 + + 取值范围:1-32 + + 最终并行度由下列几个要素决定: + + 1、表的parallel_workers属性(必要因素) + + 当parallel_workers=0时,PARALLEL num无效 + + 当parallel_workers=[1-32]时,PARALLEL num应当<=parallel_workers + + 如何设置/修改/查询表的parallel_workers属性: + + ```sql + MogDB=# create table t_1(aid integer); + CREATE TABLE + + --查看表的并行度parallel_workers + MogDB=# select reloptions from pg_class where relname='t_1'; + reloptions + ---------------------------------- + {orientation=row,compression=no} + (1 row) + + --设置表的并行度parallel_workers=8 + MogDB=# alter table t_1 set (parallel_workers=8); + ALTER TABLE + MogDB=# select reloptions from pg_class where relname='t_1'; + reloptions + ----------------------------------------------------- + {orientation=row,compression=no,parallel_workers=8} + (1 row) + + --设置表的并行度parallel_workers=1 + MogDB=# alter table t_1 set (parallel_workers=1); + ALTER TABLE + MogDB=# select reloptions from pg_class where relname='t_1'; + + reloptions + ----------------------------------------------------- + + {orientation=row,compression=no,parallel_workers=1} + (1 row) + ``` + + 2、指定值 + + 我们在创建索引中指定的值parallel num,num取值范围是1-32,超过该范围会报错。 + + 3、目标表类型 + + i. 如果目标表是一个普通表,那么并行度就按照上述计算结果。 + + ii. 如果目标表是一个分区表并且创建索引的类型为全局索引,那么并行度取分区个数和上述结果中较小的值作为最终的并行度。 + + iii. 如果目标表为分区表,并且是local的index,对于每一个分区按照上述指定值进行并行创建。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **注意**:仅有btree类型索引支持并行,因此该语法也仅支持btree索引。 + +## 示例1 ```sql --创建表tpcds.ship_mode_t1。 @@ -367,10 +463,10 @@ MogDB=# CREATE INDEX ds_customer_address_p1_index2 ON tpcds.customer_address_p1( TABLESPACE example2; --创建GLOBAL分区索引 -mogdb=CREATE INDEX ds_customer_address_p1_index3 ON tpcds.customer_address_p1(CA_ADDRESS_ID) GLOBAL; +MogDB=# CREATE INDEX ds_customer_address_p1_index3 ON tpcds.customer_address_p1(CA_ADDRESS_ID) GLOBAL; --不指定关键字,默认创建GLOBAL分区索引 -mogdb=CREATE INDEX ds_customer_address_p1_index4 ON tpcds.customer_address_p1(CA_ADDRESS_ID); +MogDB=# CREATE INDEX ds_customer_address_p1_index4 ON tpcds.customer_address_p1(CA_ADDRESS_ID); --修改分区表索引CA_ADDRESS_SK_index2的表空间为example1。 MogDB=# ALTER INDEX tpcds.ds_customer_address_p1_index2 MOVE PARTITION CA_ADDRESS_SK_index2 TABLESPACE example1; @@ -398,6 +494,38 @@ MogDB=# create index cgin_test on cgin_create_test using gin(to_tsvector('ngram' CREATE INDEX ``` +## 示例2:并行创建索引 + +```sql +--创建表 +MogDB=# create table crepara_index_t1(c1 int,c2 int,c3 int,c4 text,c5 text,c6 text); +CREATE TABLE + +--模拟800万条数据 +insert into crepara_index_t1 select random()*10000,random() *10000,random()*10000,to_hex(random()*10000000),to_hex(random()*10000000),to_hex(random()*10000000) from generate_series(1,8000000); +INSERT 0 8000000 +Time: 71333.366 ms + +--查询记录总数 +MogDB=# select count(*) from crepara_index_t1 ; +count +--------- +8000000 +(1 row) +Time: 1068.158 ms + +--修改表的属性parallel_workers=32 +MogDB=# alter table crepara_index_t1 set (parallel_workers=32); +ALTER TABLE +--也可以在建表时指定parallel_workers例: +--create table crepara_index_t1_new(c1 int,c2 int,c3 int,c4 text,c5 text,c6 text) with(parallel_workers=32); + +--创建索引并指定并行度为32 +MogDB=# create index crepara_idx_01 on crepara_index_t1(c1,c2) parallel 32; +CREATE INDEX +Time: 11146.399 ms +``` + ## 相关链接 [ALTER INDEX](ALTER-INDEX),[DROP INDEX](DROP-INDEX) diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/CREATE-TABLE.md b/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/CREATE-TABLE.md index f24d0dee685ddf72b35e6bddc610e7274d7de813..0cfbc8c47674964ec81142868fb1380816ab56aa 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/CREATE-TABLE.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/CREATE-TABLE.md @@ -1,1118 +1,1123 @@ ---- -title: CREATE TABLE -summary: CREATE TABLE -author: Zhang Cuiping -date: 2021-05-10 ---- - -# CREATE TABLE - -## 功能描述 - -在当前数据库中创建一个新的空白表,该表由命令执行者所有。 - -## 注意事项 - -- 列存表支持的数据类型请参考[列存表支持的数据类型](16-data-types-supported-by-column-store-tables)。 -- 列存表不支持数组。 -- 列存表不支持生成列。 -- 列存表不支持创建全局临时表。 -- 创建列存表的数量建议不超过1000个。 -- 如果在建表过程中数据库系统发生故障,系统恢复后可能无法自动清除之前已创建的、大小为0的磁盘文件。此种情况出现概率小,不影响数据库系统的正常运行。 -- 列存表的表级约束只支持PARTIAL CLUSTER KEY、UNIQUE、PRIAMRY KEY,不支持外键等表级约束。 -- 列存表的字段约束只支持NULL、NOT NULL、DEFAULT常量值、UNIQUE和PRIMARY KEY。 -- 列存表支持delta表,受参数enable_delta_store控制是否开启,受参数deltarow_threshold控制进入delta表的阀值。 -- 使用JDBC时,支持通过PrepareStatement对DEFAUTL值进行参数化设置。 -- 每张表的列数最大为1600,具体取决于列的类型,所有列的大小加起来不能超过8192 byte,text、varchar、char等长度可变的类型除外。 -- 被授予CREATE ANY TABLE权限的用户,可以在public模式和用户模式下创建表。如果想要创建包含serial类型列的表,还需要授予CREATE ANY SEQUENCE创建序列的权限。 - -## 语法格式 - -创建表。 - -```ebnf+diagram -CreateTable ::= CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name - ({ column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] - | table_constraint - | LIKE source_table [ like_option [...] ] } - [, ... ]) - [ WITH ( {storage_parameter = value} [, ... ] ) ] - [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] - [ COMPRESS | NOCOMPRESS ] - [ TABLESPACE tablespace_name ]; -``` - -- 其中列约束column_constraint为: - - ```ebnf+diagram - column_constraint ::= [ CONSTRAINT constraint_name ] - { NOT NULL | - NULL | - CHECK ( expression ) | - DEFAULT default_expr | - UNIQUE index_parameters | - ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value) | - PRIMARY KEY index_parameters | - REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] - [ ON DELETE action ] [ ON UPDATE action ] } - [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] - ``` - -- 其中压缩可选项compress_mode为: - - ```ebnf+diagram - compress_mode ::= { DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS } - ``` - -- 其中表约束table_constraint为: - - ```ebnf+diagram - table_constraint ::= [ CONSTRAINT constraint_name ] - { CHECK ( expression ) | - UNIQUE ( column_name [, ... ] ) index_parameters | - PRIMARY KEY ( column_name [, ... ] ) index_parameters | - FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ (refcolumn [, ... ] ) ] - [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] | - PARTIAL CLUSTER KEY ( column_name [, ... ] ) } - [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] - ``` - -- 其中like选项like_option为: - - ```ebnf+diagram - like_option ::= { INCLUDING | EXCLUDING } { DEFAULTS | GENERATED | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | ALL } - ``` - -- 其中索引参数index_parameters为: - - ```ebnf+diagram - index_parameters ::= [ WITH ( {storage_parameter = value} [, ... ] ) ] - [ USING INDEX TABLESPACE tablespace_name ] - ``` - -## 参数说明 - -- **UNLOGGED** - - 如果指定此关键字,则创建的表为非日志表。在非日志表中写入的数据不会被写入到预写日志中,这样就会比普通表快很多。但是非日志表在冲突、执行操作系统重启、强制重启、切断电源操作或异常关机后会被自动截断,会造成数据丢失的风险。非日志表中的内容也不会被复制到备服务器中。在非日志表中创建的索引也不会被自动记录。 - - 使用场景:非日志表不能保证数据的安全性,用户应该在确保数据已经做好备份的前提下使用,例如系统升级时进行数据的备份。 - - 故障处理:当异常关机等操作导致非日志表上的索引发生数据丢失时,用户应该对发生错误的索引进行重建。 - -- **GLOBAL | LOCAL** - - 创建临时表时可以在TEMP或TEMPORARY前指定GLOBAL或LOCAL关键字。如果指定GLOBAL关键字,MogDB会创建全局临时表,否则MogDB会创建本地临时表。 - -- **TEMPORARY | TEMP** - - 如果指定TEMP或TEMPORARY关键字,则创建的表为临时表。临时表分为全局临时表和本地临时表两种类型。创建临时表时如果指定GLOBAL关键字则为全局临时表,否则为本地临时表。 - - 全局临时表的元数据对所有会话可见,会话结束后元数据继续存在。会话与会话之间的用户数据、索引和统计信息相互隔离,每个会话只能看到和更改自己提交的数据。全局临时表有两种模式:一种是基于会话级别的(ON COMMIT PRESERVE ROWS),当会话结束时自动清空用户数据;一种是基于事务级别的(ON COMMIT DELETE ROWS),当执行commit或rollback时自动清空用户数据。建表时如果没有指定ON COMMIT选项,则缺省为会话级别。与本地临时表不同,全局临时表建表时可以指定非pg_temp_开头的schema。 - - 本地临时表只在当前会话可见,本会话结束后会自动删除。因此,在除当前会话连接的数据库节点故障时,仍然可以在当前会话上创建和使用临时表。由于临时表只在当前会话创建,对于涉及对临时表操作的DDL语句,会产生DDL失败的报错。因此,建议DDL语句中不要对临时表进行操作。TEMP和TEMPORARY等价。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-notice.gif) **须知**: - > - > - 本地临时表通过每个会话独立的以pg_temp开头的schema来保证只对当前会话可见,因此,不建议用户在日常操作中手动删除以pg_temp,pg_toast_temp开头的schema。 - > - 如果建表时不指定TEMPORARY/TEMP关键字,而指定表的schema为当前会话的pg_temp_开头的schema,则此表会被创建为临时表。 - > - ALTER/DROP全局临时表和索引,如果其它会话正在使用它,禁止操作(ALTER INDEX index_name REBUILD除外)。 - > - 全局临时表的DDL只会影响当前会话的用户数据和索引。例如truncate、reindex、analyze只对当前会话有效。 - > - 全局临时表功能可以通过设置GUC参数max_active_global_temporary_table控制是否启用。如果max_active_global_temporary_table=0,关闭全局临时表功能。 - > - 临时表只对当前会话可见,因此不支持与\parallel on并行执行一起使用。 - > - \\parallel on临时表不支持主备切换。 - -- **IF NOT EXISTS** - - 如果已经存在相同名称的表,不会报出错误,而会发出通知,告知通知此表已存在。 - -- **table_name** - - 要创建的表名。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-notice.gif)**须知**: - > - > 物化视图的一些处理逻辑会通过表名的前缀来识别是不是物化视图日志表和物化视图关联表,因此,用户不要创建表名以mlog\_或matviewmap\_为前缀的表,否则会影响此表的一些功能。 - -- **column_name** - - 新表中要创建的字段名。 - -- **data_type** - - 字段的数据类型。 - -- **compress_mode** - - 表字段的压缩选项。该选项指定表字段优先使用的压缩算法。 - - 取值范围: DELTA、PREFIX、DICTIONARY、NUMSTR、NOCOMPRESS - -- **COLLATE collation** - - COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。排序规则可以使用“select * from pg_collation;”命令从pg_collation系统表中查询,默认的排序规则为查询结果中以default开始的行。 - -- **LIKE source_table [ like_option ...]** - - LIKE子句声明一个表,新表自动从这个表中继承所有字段名及其数据类型和非空约束。 - - 新表与源表之间在创建动作完毕之后是完全无关的。在源表做的任何修改都不会传播到新表中,并且也不可能在扫描源表的时候包含新表的数据。 - - 被复制的列和约束并不使用相同的名称进行融合。如果明确的指定了相同的名称或者在另外一个LIKE子句中,将会报错。 - - - 源表上的字段缺省表达式只有在指定INCLUDING DEFAULTS时,才会复制到新表中。缺省是不包含缺省表达式的,即新表中的所有字段的缺省值都是NULL。 - - 源表上的CHECK约束仅在指定INCLUDING CONSTRAINTS时,会复制到新表中,而其他类型的约束永远不会复制到新表中。非空约束总是复制到新表中。此规则同时适用于表约束和列约束。 - - 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。 - - 如果指定了INCLUDING STORAGE,则复制列的STORAGE设置会复制到新表中,默认情况下不包含STORAGE设置。 - - 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释会复制到新表中。默认情况下,不复制源表的注释。 - - 如果指定了INCLUDING PARTITION,则源表的分区定义会复制到新表中,同时新表将不能再使用PARTITION BY子句。默认情况下,不拷贝源表的分区定义。如果源表上带有索引,可以使用INCLUDING PARTITION INCLUDING INDEXES语法实现。如果对分区表只使用INCLUDING INDEXES,目标表定义将是普通表,但是索引是分区索引,最后结果会报错,因为普通表不支持分区索引。 - - 如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH子句)会复制到新表中。默认情况下,不复制源表的存储参数。 - - INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION和INCLUDING RELOPTIONS的内容。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-notice.gif) **须知**: - > - > - 如果源表包含serial、bigserial、smallserial、largeserial类型,或者源表字段的默认值是sequence,且sequence属于源表(通过CREATE SEQUENCE … OWNED BY创建),这些Sequence不会关联到新表中,新表中会重新创建属于自己的sequence。这和之前版本的处理逻辑不同。如果用户希望源表和新表共享Sequence,需要首先创建一个共享的Sequence(避免使用OWNED BY),并配置为源表字段默认值,这样创建的新表会和源表共享该Sequence。 - > - 不建议将其他表私有的Sequence配置为源表字段的默认值,尤其是其他表只分布在特定的NodeGroup上,这可能导致CREATE TABLE … LIKE执行失败。另外,如果源表配置其他表私有的Sequence,当该表删除时Sequence也会连带删除,这样源表的Sequence将不可用。如果用户希望多个表共享Sequence,建议创建共享的Sequence。 - > - 对于分区表EXCLUDING,需要配合INCLUDING ALL使用,如INCLUDING ALL EXCLUDING DEFAULTS,除源分区表的DEFAULTS,其它全包含。 - -- **WITH ( { storage_parameter = value } [, ...] )** - - 这个子句为表或索引指定一个可选的存储参数。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 使用任意精度类型Numeric定义列时,建议指定精度p以及刻度s。在不指定精度和刻度时,会按输入的显示出来。 - - 参数的详细描述如下所示。 - - - FILLFACTOR - - 一个表的填充因子(fillfactor)是一个介于10和100之间的百分数。100(完全填充)是默认值。如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE有机会在同一页上放置同一条记录的新版本,这比把新版本放置在其他页上更有效。对于一个从不更新的表将填充因子设为100是最佳选择,但是对于频繁更新的表,选择较小的填充因子则更加合适。该参数对于列存表没有意义。 - - 取值范围: 10~100 - - - ORIENTATION - - 指定表数据的存储方式,即行存方式、列存方式、ORC格式的方式,该参数设置成功后就不再支持修改。 - - 取值范围: - - - ROW,表示表的数据将以行式存储。 - - 行存储适合于OLTP业务,适用于点查询或者增删操作较多的场景。 - - - COLUMN,表示表的数据将以列式存储。 - - 列存储适合于数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少。 - - 默认值: - - 若指定表空间为普通表空间,默认值为ROW。 - - - STORAGE_TYPE - - 指定存储引擎类型,该参数设置成功后就不再支持修改。 - - 取值范围: - - - USTORE,表示表支持Inplace-Update存储引擎。 - - ASTORE,表示表支持Append-Only存储引擎。 - - 默认值: - - 不指定表时,默认是Append-Only存储。 - - - INIT\_TD - - 创建Ustore表时,指定初始化的TD个数,该参数只在创建Ustore表时才能设置生效。 - - 取值范围:2\~128,默认值为4。 - - - COMPRESSION - - 指定表数据的压缩级别,它决定了表数据的压缩比以及压缩时间。一般来讲,压缩级别越高,压缩比也越大,压缩时间也越长;反之亦然。实际压缩比取决于加载的表数据的分布特征。MogDB 2.1版本之后支持行存表压缩。 - - 取值范围: - - 列存表的有效值为YES/NO/LOW/MIDDLE/HIGH,默认值为LOW。 - - - COMPRESSLEVEL - - 指定表数据同一压缩级别下的不同压缩水平,它决定了同一压缩级别下表数据的压缩比以及压缩时间。对同一压缩级别进行了更加详细的划分,为用户选择压缩比和压缩时间提供了更多的空间。总体来讲,此值越大,表示同一压缩级别下压缩比越大,压缩时间越长;反之亦然。 - - 取值范围: 0~3,默认值为0。 - - - COMPRESSTYPE - - 行存表参数,设置行存表压缩算法。1代表pglz算法,2代表zstd算法,默认不压缩。(仅支持ASTORE下的普通表) - - 取值范围:0~2,默认值为0。 - - - COMPRESS_LEVEL - - 行存表参数,设置行存表压缩算法等级,仅当COMPRESSTYPE为2时生效。压缩等级越高,表的压缩效果越好,表的访问速度越慢。(仅支持ASTORE下的普通表) - - 取值范围:-31~31,默认值为0。 - - - COMPRESS_CHUNK_SIZE - - 行存表参数,设置行存表压缩chunk块大小。chunk数据块越小,预期能达到的压缩效果越好,同时数据越离散,影响表的访问速度。(仅支持ASTORE下的普通表) - - 取值范围:与页面大小有关。在页面大小为8k场景,取值范围为:512、1024、2048、4096。 - - 默认值:4096 - - - COMPRESS_PREALLOC_CHUNKS - - 行存表参数,设置行存表压缩chunk块预分配数量。预分配数量越大,表的压缩率相对越差,离散度越小,访问性能越好。(仅支持ASTORE下的普通表) - - 取值范围:0~7,默认值为0。 - - - 当COMPRESS_CHUNK_SIZE为512和1024时,支持预分配设置最大为7。 - - 当COMPRESS_CHUNK_SIZE为2048时,支持预分配设置最大为3。 - - 当COMPRESS_CHUNK_SIZE为4096时,支持预分配设置最大为1。 - - - COMPRESS_BYTE_CONVERT - - 行存表参数,设置行存表压缩字节转换预处理。在一些场景下可以提升压缩效果,同时会导致一定性能劣化。 - - 取值范围:布尔值,默认关闭。 - - - COMPRESS_DIFF_CONVERT - - 行存表参数,设置行存表压缩字节差分预处理。只能与compress_byte_convert一起使用。在一些场景下可以提升压缩效果,同时会导致一定性能劣化。 - - 取值范围:布尔值,默认关闭。 - - - MAX_BATCHROW - - 指定了在数据加载过程中一个存储单元可以容纳记录的最大数目。该参数只对列存表有效。 - - 取值范围: 10000~60000,默认60000。 - - - PARTIAL_CLUSTER_ROWS - - 指定了在数据加载过程中进行将局部聚簇存储的记录数目。该参数只对列存表有效。 - - 取值范围: 大于等于MAX_BATCHROW,建议取值为MAX_BATCHROW的整数倍。 - - - DELTAROW_THRESHOLD - - 指定列存表导入时小于多少行的数据进入delta表,只在GUC参数enable_delta_store开启时生效。该参数只对列存表有效。 - - 取值范围: 0~9999,默认值为100 - - - VERSION - - 指定ORC存储格式的版本。 - - 取值范围: 0.12,目前支持ORC 0.12格式,后续会随着ORC格式的发展,支持更多格式。 - - 默认值:0.12 - - - segment - - 使用段页式的方式存储。本参数仅支持行存表。不支持列存表、临时表、unlog表。不支持ustore存储引擎。 - - 取值范围: on/off - - 默认值:off - - - dek_cipher - - 透明数据加密密钥的密文。当开启enable_tde选项时会自动申请创建,用户不可单独指定。通过密钥轮转功能可以对密钥进行更新。 - - 取值范围: 字符串。 - - 默认值:不开启加密时默认为空。 - - - hasuids - - 参数开启:更新表元组时,为元组分配表级唯一标识id。 - - 取值范围:on/off。 - - 默认值:off。 - -- **ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP }** - - ON COMMIT选项决定在事务中执行创建临时表操作,当事务提交时,此临时表的后续操作。有以下三个选项,当前支持PRESERVE ROWS和DELETE ROWS选项。 - - - PRESERVE ROWS(缺省值):提交时不对临时表做任何操作,临时表及其表数据保持不变。 - - DELETE ROWS:提交时删除临时表中数据。 - - DROP:提交时删除此临时表。只支持本地临时表,不支持全局临时表。 - -- **COMPRESS | NOCOMPRESS** - - 创建新表时,需要在CREATE TABLE语句中指定关键字COMPRESS,这样,当对该表进行批量插入时就会触发压缩特性。该特性会在页范围内扫描所有元组数据,生成字典、压缩元组数据并进行存储。指定关键字NOCOMPRESS则不对表进行压缩。 - - 缺省值:NOCOMPRESS,即不对元组数据进行压缩。 - -- **TABLESPACE tablespace_name** - - 创建新表时指定此关键字,表示新表将要在指定表空间内创建。如果没有声明,将使用默认表空间。 - -- **CONSTRAINT constraint_name** - - 列约束或表约束的名称。可选的约束子句用于声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新。 - - 定义约束有两种方法: - - - 列约束:作为一个列定义的一部分,仅影响该列。 - - 表约束:不和某个列绑在一起,可以作用于多个列。 - -- **NOT NULL** - - 字段值不允许为NULL。 - -- **NULL** - - 字段值允许为NULL ,这是缺省值。 - - 这个子句只是为和非标准SQL数据库兼容。不建议使用。 - -- **CHECK ( expression )** - - CHECK约束声明一个布尔表达式,每次要插入的新行或者要更新的行的新值必须使表达式结果为真或未知才能成功,否则会抛出一个异常并且不会修改数据库。 - - 声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: expression表达式中,如果存在“<>NULL”或“!=NULL”,这种写法是无效的,需要写成“is NOT NULL”。 - -- **DEFAULT default_expr** - - DEFAULT子句给字段指定缺省值。该数值可以是任何不含变量的表达式(不允许使用子查询和对本表中的其他字段的交叉引用)。缺省表达式的数据类型必须和字段类型匹配。 - - 缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。 - -- **UNIQUE index_parameters** - - **UNIQUE ( column_name [, ...] ) index_parameters** - - UNIQUE约束表示表里的一个字段或多个字段的组合必须在全表范围内唯一。 - - 对于唯一约束,NULL被认为是互不相等的。 - -- **PRIMARY KEY index_parameters** - - **PRIMARY KEY ( column_name [, ...] ) index_parameters** - - 主键约束声明表中的一个或者多个字段只能包含唯一的非NULL值。 - - 一个表只能声明一个主键。 - -- **REFERENCES reftable [ ( refcolum ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (column constraint)** - - **FOREIGN KEY ( column_name [, ...] ) REFERENCES reftable [ ( refcolumn [, ...] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (table constraint)** - - 外键约束要求新表中一列或多列构成的组应该只包含、匹配被参考表中被参考字段值。若省略refcolum,则将使用reftable的主键。被参考列应该是被参考表中的唯一字段或主键。外键约束不能被定义在临时表和永久表之间。 - - 参考字段与被参考字段之间存在三种类型匹配,分别是: - - - MATCH FULL:不允许一个多字段外键的字段为NULL,除非全部外键字段都是NULL。 - - MATCH SIMPLE(缺省):允许任意外键字段为NULL。 - - MATCH PARTIAL:目前暂不支持。 - - 另外,当被参考表中的数据发生改变时,某些操作也会在新表对应字段的数据上执行。ON DELETE子句声明当被参考表中的被参考行被删除时要执行的操作。ON UPDATE子句声明当被参考表中的被参考字段数据更新时要执行的操作。对于ON DELETE子句、ON UPDATE子句的可能动作: - - - NO ACTION(缺省):删除或更新时,创建一个表明违反外键约束的错误。若约束可推迟,且若仍存在任何引用行,那这个错误将会在检查约束的时候产生。 - - RESTRICT:删除或更新时,创建一个表明违反外键约束的错误。与NO ACTION相同,只是动作不可推迟。 - - CASCADE:删除新表中任何引用了被删除行的行,或更新新表中引用行的字段值为被参考字段的新值。 - - SET NULL:设置引用字段为NULL。 - - SET DEFAULT:设置引用字段为它们的缺省值。 - -- **DEFERRABLE | NOT DEFERRABLE** - - 这两个关键字设置该约束是否可推迟。一个不可推迟的约束将在每条命令之后马上检查。可推迟约束可以推迟到事务结尾使用SET CONSTRAINTS命令检查。缺省是NOT DEFERRABLE。目前,UNIQUE约束、主键约束、外键约束可以接受这个子句。所有其他约束类型都是不可推迟的。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif)**说明**: - > - > Ustore表不支持**DEFERRABLE**以及**INITIALLY DEFERRED**关键字。 - -- **PARTIAL CLUSTER KEY** - - 局部聚簇存储,列存表导入数据时按照指定的列(单列或多列),进行局部排序。 - -- **INITIALLY IMMEDIATE | INITIALLY DEFERRED** - - 如果约束是可推迟的,则这个子句声明检查约束的缺省时间。 - - - 如果约束是INITIALLY IMMEDIATE(缺省),则在每条语句执行之后就立即检查它; - - 如果约束是INITIALLY DEFERRED ,则只有在事务结尾才检查它。 - - 约束检查的时间可以用SET CONSTRAINTS命令修改。 - -- **USING INDEX TABLESPACE tablespace_name** - - 为UNIQUE或PRIMARY KEY约束相关的索引声明一个表空间。如果没有提供这个子句,这个索引将在default_tablespace中创建,如果default_tablespace为空,将使用数据库的缺省表空间。 - -- **ENCRYPTION_TYPE = encryption_type_value** - - 为ENCRYPTED WITH约束中的加密类型,encryption_type_value的值为[ DETERMINISTIC | RANDOMIZED ] - -## 示例 - -```sql ---创建简单的表。 -MogDB=# CREATE TABLE tpcds.warehouse_t1 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -); - -MogDB=# CREATE TABLE tpcds.warehouse_t2 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60), - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -); ---创建表,并指定W_STATE字段的缺省值为GA。 -MogDB=# CREATE TABLE tpcds.warehouse_t3 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) DEFAULT 'GA', - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -); - ---创建表,并在事务结束时检查W_WAREHOUSE_NAME字段是否有重复。 -MogDB=# CREATE TABLE tpcds.warehouse_t4 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) UNIQUE DEFERRABLE, - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -); ---创建一个带有70%填充因子的表。 -MogDB=# CREATE TABLE tpcds.warehouse_t5 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2), - UNIQUE(W_WAREHOUSE_NAME) WITH(fillfactor=70) -); - ---或者用下面的语法。 -MogDB=# CREATE TABLE tpcds.warehouse_t6 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) UNIQUE, - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -) WITH(fillfactor=70); - ---创建表,并指定该表数据不写入预写日志。 -MogDB=# CREATE UNLOGGED TABLE tpcds.warehouse_t7 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -); - ---创建临时表。 -MogDB=# CREATE TEMPORARY TABLE warehouse_t24 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -); - ---创建本地临时表,并指定提交事务时删除该临时表数据。 -MogDB=# CREATE TEMPORARY TABLE warehouse_t25 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -) ON COMMIT DELETE ROWS; - ---创建全局临时表,并指定会话结束时删除该临时表数据。 -MogDB=# CREATE GLOBAL TEMPORARY TABLE gtt1 -( - ID INTEGER NOT NULL, - NAME CHAR(16) NOT NULL, - ADDRESS VARCHAR(50) , - POSTCODE CHAR(6) -) ON COMMIT PRESERVE ROWS; - ---创建表时,不希望因为表已存在而报错。 -MogDB=# CREATE TABLE IF NOT EXISTS tpcds.warehouse_t8 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -); - ---创建普通表空间。 -MogDB=# CREATE TABLESPACE DS_TABLESPACE1 RELATIVE LOCATION 'tablespace/tablespace_1'; ---创建表时,指定表空间。 -MogDB=# CREATE TABLE tpcds.warehouse_t9 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -) TABLESPACE DS_TABLESPACE1; - ---创建表时,单独指定W_WAREHOUSE_NAME的索引表空间。 -MogDB=# CREATE TABLE tpcds.warehouse_t10 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) UNIQUE USING INDEX TABLESPACE DS_TABLESPACE1, - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -); ---创建一个有主键约束的表。 -MogDB=# CREATE TABLE tpcds.warehouse_t11 -( - W_WAREHOUSE_SK INTEGER PRIMARY KEY, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -); - ----或是用下面的语法,效果完全一样。 -MogDB=# CREATE TABLE tpcds.warehouse_t12 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2), - PRIMARY KEY(W_WAREHOUSE_SK) -); - ---或是用下面的语法,指定约束的名称。 -MogDB=# CREATE TABLE tpcds.warehouse_t13 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2), - CONSTRAINT W_CSTR_KEY1 PRIMARY KEY(W_WAREHOUSE_SK) -); - ---创建一个有复合主键约束的表。 -MogDB=# CREATE TABLE tpcds.warehouse_t14 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2), - CONSTRAINT W_CSTR_KEY2 PRIMARY KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID) -); ---创建列存表。 -MogDB=# CREATE TABLE tpcds.warehouse_t15 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -) WITH (ORIENTATION = COLUMN); - ---创建局部聚簇存储的列存表。 -MogDB=# CREATE TABLE tpcds.warehouse_t16 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2), - PARTIAL CLUSTER KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID) -) WITH (ORIENTATION = COLUMN); - ---定义一个带压缩的列存表。 -MogDB=# CREATE TABLE tpcds.warehouse_t17 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -) WITH (ORIENTATION = COLUMN, COMPRESSION=HIGH); - ---定义一个带压缩的行存表。 -MogDB=# CREATE TABLE table_3213 -( - c_w_id integer not null, - c_d_id integer not null, - c_id integer not null, - c_discount decimal(4,4), - c_credit char(2), - c_last varchar(16), - c_first varchar(16), - c_credit_lim decimal(12,2), - c_balance decimal(12,2), - c_ytd_payment decimal(12,2), - c_payment_cnt integer, - c_delivery_cnt integer, - c_street_1 varchar(20), - c_street_2 varchar(20), - c_city varchar(20), - c_state char(2), - c_zip char(9), - c_phone char(16), - c_since timestamp, - c_middle char(2), - c_data varchar(500) -) WITH (COMPRESSION = YES); - ---创建行压缩表时,指定列的mode。 -MogDB=# CREATE TABLE compress_18 -( - a00 int DELTA, - a01 int DICTIONARY, - a02 int NOCOMPRESS, - a03 varchar(100) PREFIX, - a04 int -) WITH (COMPRESSION = YES); - ---对于通过WITH (COMPRESSION = YES)所创建的行压缩表,或者普通表通过SET COMPRESS改过之后的行压缩表,新增列可以通过下面的方式指定新增列的mode。 -MogDB=# ALTER TABLE test1 ADD COLUMN al char(5) PREFIX; - ---定义一个检查列约束。 -MogDB=# CREATE TABLE tpcds.warehouse_t19 -( - W_WAREHOUSE_SK INTEGER PRIMARY KEY CHECK (W_WAREHOUSE_SK > 0), - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) CHECK (W_WAREHOUSE_NAME IS NOT NULL), - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -); - -MogDB=# CREATE TABLE tpcds.warehouse_t20 -( - W_WAREHOUSE_SK INTEGER PRIMARY KEY, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) CHECK (W_WAREHOUSE_NAME IS NOT NULL), - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2), - CONSTRAINT W_CONSTR_KEY2 CHECK(W_WAREHOUSE_SK > 0 AND W_WAREHOUSE_NAME IS NOT NULL) -); - ---创建一个有外键约束的表。 -MogDB=# CREATE TABLE tpcds.city_t23 -( - W_CITY VARCHAR(60) PRIMARY KEY, - W_ADDRESS TEXT -); -MogDB=# CREATE TABLE tpcds.warehouse_t23 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) REFERENCES tpcds.city_t23(W_CITY), - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) -); - ---或是用下面的语法,效果完全一样。 -MogDB=# CREATE TABLE tpcds.warehouse_t23 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) , - FOREIGN KEY(W_CITY) REFERENCES tpcds.city_t23(W_CITY) -); - ---或是用下面的语法,指定约束的名称。 -MogDB=# CREATE TABLE tpcds.warehouse_t23 -( - W_WAREHOUSE_SK INTEGER NOT NULL, - W_WAREHOUSE_ID CHAR(16) NOT NULL, - W_WAREHOUSE_NAME VARCHAR(20) , - W_WAREHOUSE_SQ_FT INTEGER , - W_STREET_NUMBER CHAR(10) , - W_STREET_NAME VARCHAR(60) , - W_STREET_TYPE CHAR(15) , - W_SUITE_NUMBER CHAR(10) , - W_CITY VARCHAR(60) , - W_COUNTY VARCHAR(30) , - W_STATE CHAR(2) , - W_ZIP CHAR(10) , - W_COUNTRY VARCHAR(20) , - W_GMT_OFFSET DECIMAL(5,2) , - CONSTRAINT W_FORE_KEY1 FOREIGN KEY(W_CITY) REFERENCES tpcds.city_t23(W_CITY) -); - ---向tpcds.warehouse_t19表中增加一个varchar列。 -MogDB=# ALTER TABLE tpcds.warehouse_t19 ADD W_GOODS_CATEGORY varchar(30); - ---给tpcds.warehouse_t19表增加一个检查约束。 -MogDB=# ALTER TABLE tpcds.warehouse_t19 ADD CONSTRAINT W_CONSTR_KEY4 CHECK (W_STATE IS NOT NULL); - ---在一个操作中改变两个现存字段的类型。 -MogDB=# ALTER TABLE tpcds.warehouse_t19 - ALTER COLUMN W_GOODS_CATEGORY TYPE varchar(80), - ALTER COLUMN W_STREET_NAME TYPE varchar(100); - ---此语句与上面语句等效。 -MogDB=# ALTER TABLE tpcds.warehouse_t19 MODIFY (W_GOODS_CATEGORY varchar(30), W_STREET_NAME varchar(60)); - ---给一个已存在字段添加非空约束。 -MogDB=# ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY SET NOT NULL; - ---移除已存在字段的非空约束。 -MogDB=# ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY DROP NOT NULL; - ---如果列存表中还未指定局部聚簇,向在一个列存表中添加局部聚簇列。 -MogDB=# ALTER TABLE tpcds.warehouse_t17 ADD PARTIAL CLUSTER KEY(W_WAREHOUSE_SK); - ---查看约束的名称,并删除一个列存表中的局部聚簇列。 -MogDB=# \d+ tpcds.warehouse_t17 - Table "tpcds.warehouse_t17" - Column | Type | Modifiers | Storage | Stats target | Description --------------------+-----------------------+-----------+----------+--------------+------------- - w_warehouse_sk | integer | not null | plain | | - w_warehouse_id | character(16) | not null | extended | | - w_warehouse_name | character varying(20) | | extended | | - w_warehouse_sq_ft | integer | | plain | | - w_street_number | character(10) | | extended | | - w_street_name | character varying(60) | | extended | | - w_street_type | character(15) | | extended | | - w_suite_number | character(10) | | extended | | - w_city | character varying(60) | | extended | | - w_county | character varying(30) | | extended | | - w_state | character(2) | | extended | | - w_zip | character(10) | | extended | | - w_country | character varying(20) | | extended | | - w_gmt_offset | numeric(5,2) | | main | | -Partial Cluster : - "warehouse_t17_cluster" PARTIAL CLUSTER KEY (w_warehouse_sk) -Has OIDs: no -Location Nodes: ALL DATANODES -Options: compression=no, version=0.12 -MogDB=# ALTER TABLE tpcds.warehouse_t17 DROP CONSTRAINT warehouse_t17_cluster; - ---将表移动到另一个表空间。 -MogDB=# ALTER TABLE tpcds.warehouse_t19 SET TABLESPACE PG_DEFAULT; ---创建模式joe。 -MogDB=# CREATE SCHEMA joe; - ---将表移动到另一个模式中。 -MogDB=# ALTER TABLE tpcds.warehouse_t19 SET SCHEMA joe; - ---重命名已存在的表。 -MogDB=# ALTER TABLE joe.warehouse_t19 RENAME TO warehouse_t23; - ---从warehouse_t23表中删除一个字段。 -MogDB=# ALTER TABLE joe.warehouse_t23 DROP COLUMN W_STREET_NAME; - ---删除表空间、模式joe和模式表warehouse。 -MogDB=# DROP TABLE tpcds.warehouse_t1; -MogDB=# DROP TABLE tpcds.warehouse_t2; -MogDB=# DROP TABLE tpcds.warehouse_t3; -MogDB=# DROP TABLE tpcds.warehouse_t4; -MogDB=# DROP TABLE tpcds.warehouse_t5; -MogDB=# DROP TABLE tpcds.warehouse_t6; -MogDB=# DROP TABLE tpcds.warehouse_t7; -MogDB=# DROP TABLE tpcds.warehouse_t8; -MogDB=# DROP TABLE tpcds.warehouse_t9; -MogDB=# DROP TABLE tpcds.warehouse_t10; -MogDB=# DROP TABLE tpcds.warehouse_t11; -MogDB=# DROP TABLE tpcds.warehouse_t12; -MogDB=# DROP TABLE tpcds.warehouse_t13; -MogDB=# DROP TABLE tpcds.warehouse_t14; -MogDB=# DROP TABLE tpcds.warehouse_t15; -MogDB=# DROP TABLE tpcds.warehouse_t16; -MogDB=# DROP TABLE tpcds.warehouse_t17; -MogDB=# DROP TABLE tpcds.warehouse_t18; -MogDB=# DROP TABLE tpcds.warehouse_t20; -MogDB=# DROP TABLE tpcds.warehouse_t21; -MogDB=# DROP TABLE tpcds.warehouse_t22; -MogDB=# DROP TABLE joe.warehouse_t23; -MogDB=# DROP TABLE tpcds.warehouse_t24; -MogDB=# DROP TABLE tpcds.warehouse_t25; -MogDB=# DROP TABLESPACE DS_TABLESPACE1; -MogDB=# DROP SCHEMA IF EXISTS joe CASCADE; -``` - -## 相关链接 - -[ALTER TABLE](ALTER-TABLE), [DROP TABLE](DROP-TABLE), [CREATE TABLESPACE](CREATE-TABLESPACE) - -## 优化建议 - -- UNLOGGED - - - UNLOGGED表和表上的索引因为数据写入时不通过WAL日志机制,写入速度远高于普通表。因此,可以用于缓冲存储复杂查询的中间结果集,增强复杂查询的性能。 - - UNLOGGED表无主备机制,在系统故障或异常断点等情况下,会有数据丢失风险,因此,不可用来存储基础数据。 - -- TEMPORARY | TEMP - -- 临时表只在当前会话可见,会话结束后会自动删除。 - -- LIKE - -- 新表自动从这个表中继承所有字段名及其数据类型和非空约束,新表与源表之间在创建动作完毕之后是完全无关的。 - -- LIKE INCLUDING DEFAULTS - -- 源表上的字段缺省表达式只有在指定INCLUDING DEFAULTS时,才会复制到新表中。缺省是不包含缺省表达式的,即新表中的所有字段的缺省值都是NULL。 - -- LIKE INCLUDING CONSTRAINTS - -- 源表上的CHECK约束仅在指定INCLUDING CONSTRAINTS时,会复制到新表中,而其他类型的约束永远不会复制到新表中。非空约束总是复制到新表中。此规则同时适用于表约束和列约束。 - -- LIKE INCLUDING INDEXES - -- 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。 - -- LIKE INCLUDING STORAGE - -- 如果指定了INCLUDING STORAGE,则复制列的STORAGE设置会复制到新表中,默认情况下不包含STORAGE设置。 - -- LIKE INCLUDING COMMENTS - -- 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释会复制到新表中。默认情况下,不复制源表的注释。 - -- LIKE INCLUDING PARTITION - - - 如果指定了INCLUDING PARTITION,则源表的分区定义会复制到新表中,同时新表将不能再使用PARTITION BY子句。默认情况下,不拷贝源表的分区定义。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-notice.gif) **须知**: 列表/哈希分区表暂不支持LIKE INCLUDING PARTITION。 - -- LIKE INCLUDING RELOPTIONS - -- 如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH子句)会复制到新表中。默认情况下,不复制源表的存储参数。 - -- LIKE INCLUDING ALL - -- INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION、INCLUDING RELOPTIONS的内容。 - -- ORIENTATION ROW - -- 创建行存表,行存储适合于OLTP业务,此类型的表上交互事务比较多,一次交互会涉及表中的多个列,用行存查询效率较高。 - -- ORIENTATION COLUMN - - - 创建列存表,列存储适合于数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少。 +--- +title: CREATE TABLE +summary: CREATE TABLE +author: Zhang Cuiping +date: 2021-05-10 +--- + +# CREATE TABLE + +## 功能描述 + +在当前数据库中创建一个新的空白表,该表由命令执行者所有。 + +## 注意事项 + +- 列存表支持的数据类型请参考[列存表支持的数据类型](16-data-types-supported-by-column-store-tables)。 +- 列存表不支持数组。 +- 列存表不支持生成列。 +- 列存表不支持创建全局临时表。 +- 创建列存表的数量建议不超过1000个。 +- 如果在建表过程中数据库系统发生故障,系统恢复后可能无法自动清除之前已创建的、大小为0的磁盘文件。此种情况出现概率小,不影响数据库系统的正常运行。 +- 列存表的表级约束只支持PARTIAL CLUSTER KEY、UNIQUE、PRIAMRY KEY,不支持外键等表级约束。 +- 列存表的字段约束只支持NULL、NOT NULL、DEFAULT常量值、ON UPDATE表达式(MySQL兼容特性)、UNIQUE和PRIMARY KEY。 +- 列存表支持delta表,受参数enable_delta_store控制是否开启,受参数deltarow_threshold控制进入delta表的阀值。 +- 使用JDBC时,支持通过PrepareStatement对DEFAUTL值进行参数化设置。 +- 每张表的列数最大为1600,具体取决于列的类型,所有列的大小加起来不能超过8192 byte,text、varchar、char等长度可变的类型除外。 +- 被授予CREATE ANY TABLE权限的用户,可以在public模式和用户模式下创建表。如果想要创建包含serial类型列的表,还需要授予CREATE ANY SEQUENCE创建序列的权限。 + +## 语法格式 + +创建表。 + +```ebnf+diagram +CreateTable ::= CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name + ({ column_name data_type [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ] + | table_constraint + | LIKE source_table [ like_option [...] ] } + [, ... ]) + [ WITH ( {storage_parameter = value} [, ... ] ) ] + [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] + [ COMPRESS | NOCOMPRESS ] + [ TABLESPACE tablespace_name ]; +``` + +- 其中列约束column_constraint为: + + ```ebnf+diagram + column_constraint ::= [ CONSTRAINT constraint_name ] + { NOT NULL | + NULL | + CHECK ( expression ) | + DEFAULT default_expr | + ON UPDATE update_expr | + UNIQUE index_parameters | + ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key, ENCRYPTION_TYPE = encryption_type_value) | + PRIMARY KEY index_parameters | + REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] + [ ON DELETE action ] [ ON UPDATE action ] } + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + ``` + +- 其中压缩可选项compress_mode为: + + ```ebnf+diagram + compress_mode ::= { DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS } + ``` + +- 其中表约束table_constraint为: + + ```ebnf+diagram + table_constraint ::= [ CONSTRAINT constraint_name ] + { CHECK ( expression ) | + UNIQUE ( column_name [, ... ] ) index_parameters | + PRIMARY KEY ( column_name [, ... ] ) index_parameters | + FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ (refcolumn [, ... ] ) ] + [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] | + PARTIAL CLUSTER KEY ( column_name [, ... ] ) } + [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ] + ``` + +- 其中like选项like_option为: + + ```ebnf+diagram + like_option ::= { INCLUDING | EXCLUDING } { DEFAULTS | GENERATED | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | ALL } + ``` + +- 其中索引参数index_parameters为: + + ```ebnf+diagram + index_parameters ::= [ WITH ( {storage_parameter = value} [, ... ] ) ] + [ USING INDEX TABLESPACE tablespace_name ] + ``` + +## 参数说明 + +- **UNLOGGED** + + 如果指定此关键字,则创建的表为非日志表。在非日志表中写入的数据不会被写入到预写日志中,这样就会比普通表快很多。但是非日志表在冲突、执行操作系统重启、强制重启、切断电源操作或异常关机后会被自动截断,会造成数据丢失的风险。非日志表中的内容也不会被复制到备服务器中。在非日志表中创建的索引也不会被自动记录。 + + 使用场景:非日志表不能保证数据的安全性,用户应该在确保数据已经做好备份的前提下使用,例如系统升级时进行数据的备份。 + + 故障处理:当异常关机等操作导致非日志表上的索引发生数据丢失时,用户应该对发生错误的索引进行重建。 + +- **GLOBAL | LOCAL** + + 创建临时表时可以在TEMP或TEMPORARY前指定GLOBAL或LOCAL关键字。如果指定GLOBAL关键字,MogDB会创建全局临时表,否则MogDB会创建本地临时表。 + +- **TEMPORARY | TEMP** + + 如果指定TEMP或TEMPORARY关键字,则创建的表为临时表。临时表分为全局临时表和本地临时表两种类型。创建临时表时如果指定GLOBAL关键字则为全局临时表,否则为本地临时表。 + + 全局临时表的元数据对所有会话可见,会话结束后元数据继续存在。会话与会话之间的用户数据、索引和统计信息相互隔离,每个会话只能看到和更改自己提交的数据。全局临时表有两种模式:一种是基于会话级别的(ON COMMIT PRESERVE ROWS),当会话结束时自动清空用户数据;一种是基于事务级别的(ON COMMIT DELETE ROWS),当执行commit或rollback时自动清空用户数据。建表时如果没有指定ON COMMIT选项,则缺省为会话级别。与本地临时表不同,全局临时表建表时可以指定非pg_temp_开头的schema。 + + 本地临时表只在当前会话可见,本会话结束后会自动删除。因此,在除当前会话连接的数据库节点故障时,仍然可以在当前会话上创建和使用临时表。由于临时表只在当前会话创建,对于涉及对临时表操作的DDL语句,会产生DDL失败的报错。因此,建议DDL语句中不要对临时表进行操作。TEMP和TEMPORARY等价。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-notice.gif) **须知:** + > + > - 本地临时表通过每个会话独立的以pg_temp开头的schema来保证只对当前会话可见,因此,不建议用户在日常操作中手动删除以pg_temp,pg_toast_temp开头的schema。 + > - 如果建表时不指定TEMPORARY/TEMP关键字,而指定表的schema为当前会话的pg_temp_开头的schema,则此表会被创建为临时表。 + > - ALTER/DROP全局临时表和索引,如果其它会话正在使用它,禁止操作(ALTER INDEX index_name REBUILD除外)。 + > - 全局临时表的DDL只会影响当前会话的用户数据和索引。例如truncate、reindex、analyze只对当前会话有效。 + > - 全局临时表功能可以通过设置GUC参数max_active_global_temporary_table控制是否启用。如果max_active_global_temporary_table=0,关闭全局临时表功能。 + > - 临时表只对当前会话可见,因此不支持与\parallel on并行执行一起使用。 + > - \\parallel on临时表不支持主备切换。 + +- **IF NOT EXISTS** + + 如果已经存在相同名称的表,不会报出错误,而会发出通知,告知通知此表已存在。 + +- **table_name** + + 要创建的表名。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-notice.gif)**须知:** + > + > 物化视图的一些处理逻辑会通过表名的前缀来识别是不是物化视图日志表和物化视图关联表,因此,用户不要创建表名以mlog\_或matviewmap\_为前缀的表,否则会影响此表的一些功能。 + +- **column_name** + + 新表中要创建的字段名。 + +- **data_type** + + 字段的数据类型。 + +- **compress_mode** + + 表字段的压缩选项。该选项指定表字段优先使用的压缩算法。 + + 取值范围: DELTA、PREFIX、DICTIONARY、NUMSTR、NOCOMPRESS + +- **COLLATE collation** + + COLLATE子句指定列的排序规则(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。排序规则可以使用“select * from pg_collation;”命令从pg_collation系统表中查询,默认的排序规则为查询结果中以default开始的行。 + +- **LIKE source_table [ like_option ...]** + + LIKE子句声明一个表,新表自动从这个表中继承所有字段名及其数据类型和非空约束。 + + 新表与源表之间在创建动作完毕之后是完全无关的。在源表做的任何修改都不会传播到新表中,并且也不可能在扫描源表的时候包含新表的数据。 + + 被复制的列和约束并不使用相同的名称进行融合。如果明确的指定了相同的名称或者在另外一个LIKE子句中,将会报错。 + + - 源表上的字段缺省表达式只有在指定INCLUDING DEFAULTS时,才会复制到新表中。缺省是不包含缺省表达式的,即新表中的所有字段的缺省值都是NULL。 + - 源表上的CHECK约束仅在指定INCLUDING CONSTRAINTS时,会复制到新表中,而其他类型的约束永远不会复制到新表中。非空约束总是复制到新表中。此规则同时适用于表约束和列约束。 + - 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。 + - 如果指定了INCLUDING STORAGE,则复制列的STORAGE设置会复制到新表中,默认情况下不包含STORAGE设置。 + - 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释会复制到新表中。默认情况下,不复制源表的注释。 + - 如果指定了INCLUDING PARTITION,则源表的分区定义会复制到新表中,同时新表将不能再使用PARTITION BY子句。默认情况下,不拷贝源表的分区定义。如果源表上带有索引,可以使用INCLUDING PARTITION INCLUDING INDEXES语法实现。如果对分区表只使用INCLUDING INDEXES,目标表定义将是普通表,但是索引是分区索引,最后结果会报错,因为普通表不支持分区索引。 + - 如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH子句)会复制到新表中。默认情况下,不复制源表的存储参数。 + - INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION和INCLUDING RELOPTIONS的内容。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-notice.gif) **须知:** + > + > - 如果源表包含serial、bigserial、smallserial、largeserial类型,或者源表字段的默认值是sequence,且sequence属于源表(通过CREATE SEQUENCE … OWNED BY创建),这些Sequence不会关联到新表中,新表中会重新创建属于自己的sequence。这和之前版本的处理逻辑不同。如果用户希望源表和新表共享Sequence,需要首先创建一个共享的Sequence(避免使用OWNED BY),并配置为源表字段默认值,这样创建的新表会和源表共享该Sequence。 + > - 不建议将其他表私有的Sequence配置为源表字段的默认值,尤其是其他表只分布在特定的NodeGroup上,这可能导致CREATE TABLE … LIKE执行失败。另外,如果源表配置其他表私有的Sequence,当该表删除时Sequence也会连带删除,这样源表的Sequence将不可用。如果用户希望多个表共享Sequence,建议创建共享的Sequence。 + > - 对于分区表EXCLUDING,需要配合INCLUDING ALL使用,如INCLUDING ALL EXCLUDING DEFAULTS,除源分区表的DEFAULTS,其它全包含。 + +- **WITH ( { storage_parameter = value } [, ...] )** + + 这个子句为表或索引指定一个可选的存储参数。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** 使用任意精度类型Numeric定义列时,建议指定精度p以及刻度s。在不指定精度和刻度时,会按输入的显示出来。 + + 参数的详细描述如下所示。 + + - FILLFACTOR + + 一个表的填充因子(fillfactor)是一个介于10和100之间的百分数。100(完全填充)是默认值。如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE有机会在同一页上放置同一条记录的新版本,这比把新版本放置在其他页上更有效。对于一个从不更新的表将填充因子设为100是最佳选择,但是对于频繁更新的表,选择较小的填充因子则更加合适。该参数对于列存表没有意义。 + + 取值范围: 10~100 + + - ORIENTATION + + 指定表数据的存储方式,即行存方式、列存方式、ORC格式的方式,该参数设置成功后就不再支持修改。 + + 取值范围: + + - ROW,表示表的数据将以行式存储。 + + 行存储适合于OLTP业务,适用于点查询或者增删操作较多的场景。 + + - COLUMN,表示表的数据将以列式存储。 + + 列存储适合于数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少。 + + 默认值: + + 若指定表空间为普通表空间,默认值为ROW。 + + - STORAGE_TYPE + + 指定存储引擎类型,该参数设置成功后就不再支持修改。 + + 取值范围: + + - USTORE,表示表支持Inplace-Update存储引擎。 + - ASTORE,表示表支持Append-Only存储引擎。 + + 默认值: + + 不指定表时,默认是Append-Only存储。 + + - INIT\_TD + + 创建Ustore表时,指定初始化的TD个数,该参数只在创建Ustore表时才能设置生效。 + + 取值范围:2\~128,默认值为4。 + + - COMPRESSION + + 指定表数据的压缩级别,它决定了表数据的压缩比以及压缩时间。一般来讲,压缩级别越高,压缩比也越大,压缩时间也越长;反之亦然。实际压缩比取决于加载的表数据的分布特征。MogDB 2.1版本之后支持行存表压缩。 + + 取值范围: + + 列存表的有效值为YES/NO/LOW/MIDDLE/HIGH,默认值为LOW。 + + - COMPRESSLEVEL + + 指定表数据同一压缩级别下的不同压缩水平,它决定了同一压缩级别下表数据的压缩比以及压缩时间。对同一压缩级别进行了更加详细的划分,为用户选择压缩比和压缩时间提供了更多的空间。总体来讲,此值越大,表示同一压缩级别下压缩比越大,压缩时间越长;反之亦然。 + + 取值范围: 0~3,默认值为0。 + + - COMPRESSTYPE + + 行存表参数,设置行存表压缩算法。1代表pglz算法,2代表zstd算法,默认不压缩。(仅支持ASTORE下的普通表) + + 取值范围:0~2,默认值为0。 + + - COMPRESS_LEVEL + + 行存表参数,设置行存表压缩算法等级,仅当COMPRESSTYPE为2时生效。压缩等级越高,表的压缩效果越好,表的访问速度越慢。(仅支持ASTORE下的普通表) + + 取值范围:-31~31,默认值为0。 + + - COMPRESS_CHUNK_SIZE + + 行存表参数,设置行存表压缩chunk块大小。chunk数据块越小,预期能达到的压缩效果越好,同时数据越离散,影响表的访问速度。(仅支持ASTORE下的普通表) + + 取值范围:与页面大小有关。在页面大小为8k场景,取值范围为:512、1024、2048、4096。 + + 默认值:4096 + + - COMPRESS_PREALLOC_CHUNKS + + 行存表参数,设置行存表压缩chunk块预分配数量。预分配数量越大,表的压缩率相对越差,离散度越小,访问性能越好。(仅支持ASTORE下的普通表) + + 取值范围:0~7,默认值为0。 + + - 当COMPRESS_CHUNK_SIZE为512和1024时,支持预分配设置最大为7。 + - 当COMPRESS_CHUNK_SIZE为2048时,支持预分配设置最大为3。 + - 当COMPRESS_CHUNK_SIZE为4096时,支持预分配设置最大为1。 + + - COMPRESS_BYTE_CONVERT + + 行存表参数,设置行存表压缩字节转换预处理。在一些场景下可以提升压缩效果,同时会导致一定性能劣化。 + + 取值范围:布尔值,默认关闭。 + + - COMPRESS_DIFF_CONVERT + + 行存表参数,设置行存表压缩字节差分预处理。只能与compress_byte_convert一起使用。在一些场景下可以提升压缩效果,同时会导致一定性能劣化。 + + 取值范围:布尔值,默认关闭。 + + - MAX_BATCHROW + + 指定了在数据加载过程中一个存储单元可以容纳记录的最大数目。该参数只对列存表有效。 + + 取值范围: 10000~60000,默认60000。 + + - PARTIAL_CLUSTER_ROWS + + 指定了在数据加载过程中进行将局部聚簇存储的记录数目。该参数只对列存表有效。 + + 取值范围: 大于等于MAX_BATCHROW,建议取值为MAX_BATCHROW的整数倍。 + + - DELTAROW_THRESHOLD + + 指定列存表导入时小于多少行的数据进入delta表,只在GUC参数enable_delta_store开启时生效。该参数只对列存表有效。 + + 取值范围: 0~9999,默认值为100 + + - VERSION + + 指定ORC存储格式的版本。 + + 取值范围: 0.12,目前支持ORC 0.12格式,后续会随着ORC格式的发展,支持更多格式。 + + 默认值:0.12 + + - segment + + 使用段页式的方式存储。本参数仅支持行存表。不支持列存表、临时表、unlog表。不支持ustore存储引擎。 + + 取值范围: on/off + + 默认值:off + + - dek_cipher + + 透明数据加密密钥的密文。当开启enable_tde选项时会自动申请创建,用户不可单独指定。通过密钥轮转功能可以对密钥进行更新。 + + 取值范围: 字符串。 + + 默认值:不开启加密时默认为空。 + + - hasuids + + 参数开启:更新表元组时,为元组分配表级唯一标识id。 + + 取值范围:on/off。 + + 默认值:off。 + +- **ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP }** + + ON COMMIT选项决定在事务中执行创建临时表操作,当事务提交时,此临时表的后续操作。有以下三个选项,当前支持PRESERVE ROWS和DELETE ROWS选项。 + + - PRESERVE ROWS(缺省值):提交时不对临时表做任何操作,临时表及其表数据保持不变。 + - DELETE ROWS:提交时删除临时表中数据。 + - DROP:提交时删除此临时表。只支持本地临时表,不支持全局临时表。 + +- **COMPRESS | NOCOMPRESS** + + 创建新表时,需要在CREATE TABLE语句中指定关键字COMPRESS,这样,当对该表进行批量插入时就会触发压缩特性。该特性会在页范围内扫描所有元组数据,生成字典、压缩元组数据并进行存储。指定关键字NOCOMPRESS则不对表进行压缩。 + + 缺省值:NOCOMPRESS,即不对元组数据进行压缩。 + +- **TABLESPACE tablespace_name** + + 创建新表时指定此关键字,表示新表将要在指定表空间内创建。如果没有声明,将使用默认表空间。 + +- **CONSTRAINT constraint_name** + + 列约束或表约束的名称。可选的约束子句用于声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新。 + + 定义约束有两种方法: + + - 列约束:作为一个列定义的一部分,仅影响该列。 + - 表约束:不和某个列绑在一起,可以作用于多个列。 + +- **NOT NULL** + + 字段值不允许为NULL。 + +- **NULL** + + 字段值允许为NULL ,这是缺省值。 + + 这个子句只是为和非标准SQL数据库兼容。不建议使用。 + +- **CHECK ( expression )** + + CHECK约束声明一个布尔表达式,每次要插入的新行或者要更新的行的新值必须使表达式结果为真或未知才能成功,否则会抛出一个异常并且不会修改数据库。 + + 声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** expression表达式中,如果存在“<>NULL”或“!=NULL”,这种写法是无效的,需要写成“is NOT NULL”。 + +- **DEFAULT default_expr** + + DEFAULT子句给字段指定缺省值。该数值可以是任何不含变量的表达式(不允许使用子查询和对本表中的其他字段的交叉引用)。缺省表达式的数据类型必须和字段类型匹配。 + + 缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。 + +- **ON UPDATE update_expr** + + ON UPDATE子句给字段指定更新时的缺省时间截。该字段必须是时间类型,且缺省数值只能是更新操作的执行时间截,即current_timestamp。在create table中,ON UPDATE表达式可以是current_timestamp的同等替换。该语法特性只能在MySQL兼容性下才能使用。 + +- **UNIQUE index_parameters** + + **UNIQUE ( column_name [, ...] ) index_parameters** + + UNIQUE约束表示表里的一个字段或多个字段的组合必须在全表范围内唯一。 + + 对于唯一约束,NULL被认为是互不相等的。 + +- **PRIMARY KEY index_parameters** + + **PRIMARY KEY ( column_name [, ...] ) index_parameters** + + 主键约束声明表中的一个或者多个字段只能包含唯一的非NULL值。 + + 一个表只能声明一个主键。 + +- **REFERENCES reftable [ ( refcolum ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (column constraint)** + + **FOREIGN KEY ( column_name [, ...] ) REFERENCES reftable [ ( refcolumn [, ...] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (table constraint)** + + 外键约束要求新表中一列或多列构成的组应该只包含、匹配被参考表中被参考字段值。若省略refcolum,则将使用reftable的主键。被参考列应该是被参考表中的唯一字段或主键。外键约束不能被定义在临时表和永久表之间。 + + 参考字段与被参考字段之间存在三种类型匹配,分别是: + + - MATCH FULL:不允许一个多字段外键的字段为NULL,除非全部外键字段都是NULL。 + - MATCH SIMPLE(缺省):允许任意外键字段为NULL。 + - MATCH PARTIAL:目前暂不支持。 + + 另外,当被参考表中的数据发生改变时,某些操作也会在新表对应字段的数据上执行。ON DELETE子句声明当被参考表中的被参考行被删除时要执行的操作。ON UPDATE子句声明当被参考表中的被参考字段数据更新时要执行的操作。对于ON DELETE子句、ON UPDATE子句的可能动作: + + - NO ACTION(缺省):删除或更新时,创建一个表明违反外键约束的错误。若约束可推迟,且若仍存在任何引用行,那这个错误将会在检查约束的时候产生。 + - RESTRICT:删除或更新时,创建一个表明违反外键约束的错误。与NO ACTION相同,只是动作不可推迟。 + - CASCADE:删除新表中任何引用了被删除行的行,或更新新表中引用行的字段值为被参考字段的新值。 + - SET NULL:设置引用字段为NULL。 + - SET DEFAULT:设置引用字段为它们的缺省值。 + +- **DEFERRABLE | NOT DEFERRABLE** + + 这两个关键字设置该约束是否可推迟。一个不可推迟的约束将在每条命令之后马上检查。可推迟约束可以推迟到事务结尾使用SET CONSTRAINTS命令检查。缺省是NOT DEFERRABLE。目前,UNIQUE约束、主键约束、外键约束可以接受这个子句。所有其他约束类型都是不可推迟的。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif)**说明:** + > + > Ustore表不支持**DEFERRABLE**以及**INITIALLY DEFERRED**关键字。 + +- **PARTIAL CLUSTER KEY** + + 局部聚簇存储,列存表导入数据时按照指定的列(单列或多列),进行局部排序。 + +- **INITIALLY IMMEDIATE | INITIALLY DEFERRED** + + 如果约束是可推迟的,则这个子句声明检查约束的缺省时间。 + + - 如果约束是INITIALLY IMMEDIATE(缺省),则在每条语句执行之后就立即检查它; + - 如果约束是INITIALLY DEFERRED ,则只有在事务结尾才检查它。 + + 约束检查的时间可以用SET CONSTRAINTS命令修改。 + +- **USING INDEX TABLESPACE tablespace_name** + + 为UNIQUE或PRIMARY KEY约束相关的索引声明一个表空间。如果没有提供这个子句,这个索引将在default_tablespace中创建,如果default_tablespace为空,将使用数据库的缺省表空间。 + +- **ENCRYPTION_TYPE = encryption_type_value** + + 为ENCRYPTED WITH约束中的加密类型,encryption_type_value的值为[ DETERMINISTIC | RANDOMIZED ] + +## 示例 + +```sql +--创建简单的表。 +MogDB=# CREATE TABLE tpcds.warehouse_t1 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +MogDB=# CREATE TABLE tpcds.warehouse_t2 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60), + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); +--创建表,并指定W_STATE字段的缺省值为GA。 +MogDB=# CREATE TABLE tpcds.warehouse_t3 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) DEFAULT 'GA', + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +--创建表,并在事务结束时检查W_WAREHOUSE_NAME字段是否有重复。 +MogDB=# CREATE TABLE tpcds.warehouse_t4 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) UNIQUE DEFERRABLE, + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); +--创建一个带有70%填充因子的表。 +MogDB=# CREATE TABLE tpcds.warehouse_t5 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2), + UNIQUE(W_WAREHOUSE_NAME) WITH(fillfactor=70) +); + +--或者用下面的语法。 +MogDB=# CREATE TABLE tpcds.warehouse_t6 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) UNIQUE, + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +) WITH(fillfactor=70); + +--创建表,并指定该表数据不写入预写日志。 +MogDB=# CREATE UNLOGGED TABLE tpcds.warehouse_t7 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +--创建临时表。 +MogDB=# CREATE TEMPORARY TABLE warehouse_t24 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +--创建本地临时表,并指定提交事务时删除该临时表数据。 +MogDB=# CREATE TEMPORARY TABLE warehouse_t25 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +) ON COMMIT DELETE ROWS; + +--创建全局临时表,并指定会话结束时删除该临时表数据。 +MogDB=# CREATE GLOBAL TEMPORARY TABLE gtt1 +( + ID INTEGER NOT NULL, + NAME CHAR(16) NOT NULL, + ADDRESS VARCHAR(50) , + POSTCODE CHAR(6) +) ON COMMIT PRESERVE ROWS; + +--创建表时,不希望因为表已存在而报错。 +MogDB=# CREATE TABLE IF NOT EXISTS tpcds.warehouse_t8 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +--创建普通表空间。 +MogDB=# CREATE TABLESPACE DS_TABLESPACE1 RELATIVE LOCATION 'tablespace/tablespace_1'; +--创建表时,指定表空间。 +MogDB=# CREATE TABLE tpcds.warehouse_t9 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +) TABLESPACE DS_TABLESPACE1; + +--创建表时,单独指定W_WAREHOUSE_NAME的索引表空间。 +MogDB=# CREATE TABLE tpcds.warehouse_t10 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) UNIQUE USING INDEX TABLESPACE DS_TABLESPACE1, + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); +--创建一个有主键约束的表。 +MogDB=# CREATE TABLE tpcds.warehouse_t11 +( + W_WAREHOUSE_SK INTEGER PRIMARY KEY, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +---或是用下面的语法,效果完全一样。 +MogDB=# CREATE TABLE tpcds.warehouse_t12 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2), + PRIMARY KEY(W_WAREHOUSE_SK) +); + +--或是用下面的语法,指定约束的名称。 +MogDB=# CREATE TABLE tpcds.warehouse_t13 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2), + CONSTRAINT W_CSTR_KEY1 PRIMARY KEY(W_WAREHOUSE_SK) +); + +--创建一个有复合主键约束的表。 +MogDB=# CREATE TABLE tpcds.warehouse_t14 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2), + CONSTRAINT W_CSTR_KEY2 PRIMARY KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID) +); +--创建列存表。 +MogDB=# CREATE TABLE tpcds.warehouse_t15 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +) WITH (ORIENTATION = COLUMN); + +--创建局部聚簇存储的列存表。 +MogDB=# CREATE TABLE tpcds.warehouse_t16 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2), + PARTIAL CLUSTER KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID) +) WITH (ORIENTATION = COLUMN); + +--定义一个带压缩的列存表。 +MogDB=# CREATE TABLE tpcds.warehouse_t17 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +) WITH (ORIENTATION = COLUMN, COMPRESSION=HIGH); + +--定义一个带压缩的行存表。 +MogDB=# CREATE TABLE table_3213 +( + c_w_id integer not null, + c_d_id integer not null, + c_id integer not null, + c_discount decimal(4,4), + c_credit char(2), + c_last varchar(16), + c_first varchar(16), + c_credit_lim decimal(12,2), + c_balance decimal(12,2), + c_ytd_payment decimal(12,2), + c_payment_cnt integer, + c_delivery_cnt integer, + c_street_1 varchar(20), + c_street_2 varchar(20), + c_city varchar(20), + c_state char(2), + c_zip char(9), + c_phone char(16), + c_since timestamp on update current_timestamp, + c_middle char(2), + c_data varchar(500) +) WITH (COMPRESSION = YES); + +--创建行压缩表时,指定列的mode。 +MogDB=# CREATE TABLE compress_18 +( + a00 int DELTA, + a01 int DICTIONARY, + a02 int NOCOMPRESS, + a03 varchar(100) PREFIX, + a04 int +) WITH (COMPRESSION = YES); + +--对于通过WITH (COMPRESSION = YES)所创建的行压缩表,或者普通表通过SET COMPRESS改过之后的行压缩表,新增列可以通过下面的方式指定新增列的mode。 +MogDB=# ALTER TABLE test1 ADD COLUMN al char(5) PREFIX; + +--定义一个检查列约束。 +MogDB=# CREATE TABLE tpcds.warehouse_t19 +( + W_WAREHOUSE_SK INTEGER PRIMARY KEY CHECK (W_WAREHOUSE_SK > 0), + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) CHECK (W_WAREHOUSE_NAME IS NOT NULL), + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +MogDB=# CREATE TABLE tpcds.warehouse_t20 +( + W_WAREHOUSE_SK INTEGER PRIMARY KEY, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) CHECK (W_WAREHOUSE_NAME IS NOT NULL), + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2), + CONSTRAINT W_CONSTR_KEY2 CHECK(W_WAREHOUSE_SK > 0 AND W_WAREHOUSE_NAME IS NOT NULL) +); + +--创建一个有外键约束的表。 +MogDB=# CREATE TABLE tpcds.city_t23 +( + W_CITY VARCHAR(60) PRIMARY KEY, + W_ADDRESS TEXT +); +MogDB=# CREATE TABLE tpcds.warehouse_t23 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) REFERENCES tpcds.city_t23(W_CITY), + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) +); + +--或是用下面的语法,效果完全一样。 +MogDB=# CREATE TABLE tpcds.warehouse_t23 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) , + FOREIGN KEY(W_CITY) REFERENCES tpcds.city_t23(W_CITY) +); + +--或是用下面的语法,指定约束的名称。 +MogDB=# CREATE TABLE tpcds.warehouse_t23 +( + W_WAREHOUSE_SK INTEGER NOT NULL, + W_WAREHOUSE_ID CHAR(16) NOT NULL, + W_WAREHOUSE_NAME VARCHAR(20) , + W_WAREHOUSE_SQ_FT INTEGER , + W_STREET_NUMBER CHAR(10) , + W_STREET_NAME VARCHAR(60) , + W_STREET_TYPE CHAR(15) , + W_SUITE_NUMBER CHAR(10) , + W_CITY VARCHAR(60) , + W_COUNTY VARCHAR(30) , + W_STATE CHAR(2) , + W_ZIP CHAR(10) , + W_COUNTRY VARCHAR(20) , + W_GMT_OFFSET DECIMAL(5,2) , + CONSTRAINT W_FORE_KEY1 FOREIGN KEY(W_CITY) REFERENCES tpcds.city_t23(W_CITY) +); + +--向tpcds.warehouse_t19表中增加一个varchar列。 +MogDB=# ALTER TABLE tpcds.warehouse_t19 ADD W_GOODS_CATEGORY varchar(30); + +--给tpcds.warehouse_t19表增加一个检查约束。 +MogDB=# ALTER TABLE tpcds.warehouse_t19 ADD CONSTRAINT W_CONSTR_KEY4 CHECK (W_STATE IS NOT NULL); + +--在一个操作中改变两个现存字段的类型。 +MogDB=# ALTER TABLE tpcds.warehouse_t19 + ALTER COLUMN W_GOODS_CATEGORY TYPE varchar(80), + ALTER COLUMN W_STREET_NAME TYPE varchar(100); + +--此语句与上面语句等效。 +MogDB=# ALTER TABLE tpcds.warehouse_t19 MODIFY (W_GOODS_CATEGORY varchar(30), W_STREET_NAME varchar(60)); + +--给一个已存在字段添加非空约束。 +MogDB=# ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY SET NOT NULL; + +--移除已存在字段的非空约束。 +MogDB=# ALTER TABLE tpcds.warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY DROP NOT NULL; + +--如果列存表中还未指定局部聚簇,向在一个列存表中添加局部聚簇列。 +MogDB=# ALTER TABLE tpcds.warehouse_t17 ADD PARTIAL CLUSTER KEY(W_WAREHOUSE_SK); + +--查看约束的名称,并删除一个列存表中的局部聚簇列。 +MogDB=# \d+ tpcds.warehouse_t17 + Table "tpcds.warehouse_t17" + Column | Type | Modifiers | Storage | Stats target | Description +-------------------+-----------------------+-----------+----------+--------------+------------- + w_warehouse_sk | integer | not null | plain | | + w_warehouse_id | character(16) | not null | extended | | + w_warehouse_name | character varying(20) | | extended | | + w_warehouse_sq_ft | integer | | plain | | + w_street_number | character(10) | | extended | | + w_street_name | character varying(60) | | extended | | + w_street_type | character(15) | | extended | | + w_suite_number | character(10) | | extended | | + w_city | character varying(60) | | extended | | + w_county | character varying(30) | | extended | | + w_state | character(2) | | extended | | + w_zip | character(10) | | extended | | + w_country | character varying(20) | | extended | | + w_gmt_offset | numeric(5,2) | | main | | +Partial Cluster : + "warehouse_t17_cluster" PARTIAL CLUSTER KEY (w_warehouse_sk) +Has OIDs: no +Location Nodes: ALL DATANODES +Options: compression=no, version=0.12 +MogDB=# ALTER TABLE tpcds.warehouse_t17 DROP CONSTRAINT warehouse_t17_cluster; + +--将表移动到另一个表空间。 +MogDB=# ALTER TABLE tpcds.warehouse_t19 SET TABLESPACE PG_DEFAULT; +--创建模式joe。 +MogDB=# CREATE SCHEMA joe; + +--将表移动到另一个模式中。 +MogDB=# ALTER TABLE tpcds.warehouse_t19 SET SCHEMA joe; + +--重命名已存在的表。 +MogDB=# ALTER TABLE joe.warehouse_t19 RENAME TO warehouse_t23; + +--从warehouse_t23表中删除一个字段。 +MogDB=# ALTER TABLE joe.warehouse_t23 DROP COLUMN W_STREET_NAME; + +--删除表空间、模式joe和模式表warehouse。 +MogDB=# DROP TABLE tpcds.warehouse_t1; +MogDB=# DROP TABLE tpcds.warehouse_t2; +MogDB=# DROP TABLE tpcds.warehouse_t3; +MogDB=# DROP TABLE tpcds.warehouse_t4; +MogDB=# DROP TABLE tpcds.warehouse_t5; +MogDB=# DROP TABLE tpcds.warehouse_t6; +MogDB=# DROP TABLE tpcds.warehouse_t7; +MogDB=# DROP TABLE tpcds.warehouse_t8; +MogDB=# DROP TABLE tpcds.warehouse_t9; +MogDB=# DROP TABLE tpcds.warehouse_t10; +MogDB=# DROP TABLE tpcds.warehouse_t11; +MogDB=# DROP TABLE tpcds.warehouse_t12; +MogDB=# DROP TABLE tpcds.warehouse_t13; +MogDB=# DROP TABLE tpcds.warehouse_t14; +MogDB=# DROP TABLE tpcds.warehouse_t15; +MogDB=# DROP TABLE tpcds.warehouse_t16; +MogDB=# DROP TABLE tpcds.warehouse_t17; +MogDB=# DROP TABLE tpcds.warehouse_t18; +MogDB=# DROP TABLE tpcds.warehouse_t20; +MogDB=# DROP TABLE tpcds.warehouse_t21; +MogDB=# DROP TABLE tpcds.warehouse_t22; +MogDB=# DROP TABLE joe.warehouse_t23; +MogDB=# DROP TABLE tpcds.warehouse_t24; +MogDB=# DROP TABLE tpcds.warehouse_t25; +MogDB=# DROP TABLESPACE DS_TABLESPACE1; +MogDB=# DROP SCHEMA IF EXISTS joe CASCADE; +``` + +## 相关链接 + +[ALTER TABLE](ALTER-TABLE), [DROP TABLE](DROP-TABLE), [CREATE TABLESPACE](CREATE-TABLESPACE) + +## 优化建议 + +- UNLOGGED + + - UNLOGGED表和表上的索引因为数据写入时不通过WAL日志机制,写入速度远高于普通表。因此,可以用于缓冲存储复杂查询的中间结果集,增强复杂查询的性能。 + - UNLOGGED表无主备机制,在系统故障或异常断点等情况下,会有数据丢失风险,因此,不可用来存储基础数据。 + +- TEMPORARY | TEMP + +- 临时表只在当前会话可见,会话结束后会自动删除。 + +- LIKE + +- 新表自动从这个表中继承所有字段名及其数据类型和非空约束,新表与源表之间在创建动作完毕之后是完全无关的。 + +- LIKE INCLUDING DEFAULTS + +- 源表上的字段缺省表达式只有在指定INCLUDING DEFAULTS时,才会复制到新表中。缺省是包含缺省表达式的,即新表中的所有字段的缺省值,如果在原表中是表达式,则新表中也是表达式。 + +- LIKE INCLUDING CONSTRAINTS + +- 源表上的CHECK约束仅在指定INCLUDING CONSTRAINTS时,会复制到新表中,而其他类型的约束永远不会复制到新表中。非空约束总是复制到新表中。此规则同时适用于表约束和列约束。 + +- LIKE INCLUDING INDEXES + +- 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。 + +- LIKE INCLUDING STORAGE + +- 如果指定了INCLUDING STORAGE,则复制列的STORAGE设置会复制到新表中,默认情况下不包含STORAGE设置。 + +- LIKE INCLUDING COMMENTS + +- 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释会复制到新表中。默认情况下,不复制源表的注释。 + +- LIKE INCLUDING PARTITION + + - 如果指定了INCLUDING PARTITION,则源表的分区定义会复制到新表中,同时新表将不能再使用PARTITION BY子句。默认情况下,不拷贝源表的分区定义。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-notice.gif) **须知:** 列表/哈希分区表暂不支持LIKE INCLUDING PARTITION。 + +- LIKE INCLUDING RELOPTIONS + +- 如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH子句)会复制到新表中。默认情况下,不复制源表的存储参数。 + +- LIKE INCLUDING ALL + +- INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION、INCLUDING RELOPTIONS的内容。 + +- ORIENTATION ROW + +- 创建行存表,行存储适合于OLTP业务,此类型的表上交互事务比较多,一次交互会涉及表中的多个列,用行存查询效率较高。 + +- ORIENTATION COLUMN + + - 创建列存表,列存储适合于数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少。 diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/INSERT.md b/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/INSERT.md index 4f96b2c5ad0c2577ddc9aeb0c56642f84ed5311c..aafcc31cf835ea142a3903891e6856b14d4b2f4f 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/INSERT.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/sql-syntax/INSERT.md @@ -1,192 +1,192 @@ ---- -title: INSERT -summary: INSERT -author: Zhang Cuiping -date: 2021-05-18 ---- - -# INSERT - -## 功能描述 - -向表中添加一行或多行数据。 - -## 注意事项 - -- 只有拥有表INSERT权限的用户,才可以向表中插入数据。用户被授予insert any table权限,相当于用户对除系统模式之外的任何模式具有USAGE权限,并且拥有这些模式下表的INSERT权限。 - -- 如果使用RETURNING子句,用户必须要有该表的SELECT权限。 - -- 如果使用ON DUPLICATE KEY UPDATE,用户必须要有该表的SELECT、UPDATE权限,唯一约束(主键或唯一索引)的SELECT权限。 - -- 如果使用query子句插入来自查询里的数据行,用户还需要拥有在查询里使用的表的SELECT权限。 - -- 当连接到TD兼容的数据库时,td_compatible_truncation参数设置为on时,将启用超长字符串自动截断功能,在后续的insert语句中(不包含外表的场景下),对目标表中char和varchar类型的列上插入超长字符串时,系统会自动按照目标表中相应列定义的最大长度对超长字符串进行截断。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: - > 如果向字符集为字节类型编码(SQL_ASCII,LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。 - -## 语法格式 - -```ebnf+diagram -Insert ::= [ WITH [ RECURSIVE ] with_query [, ...] ] -INSERT [/*+ plan_hint */] INTO table_name [partition_clause] [ AS alias ] [ ( column_name [, ...] ) ] - { DEFAULT VALUES - | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] - | query } - [ ON DUPLICATE KEY UPDATE { NOTHING | { column_name = { expression | DEFAULT } } [, ...] [ WHERE condition ] }] - [ RETURNING {* | {output_expression [ [ AS ] output_name ] }[, ...]} ]; -``` - -## 参数说明 - -- **WITH [ RECURSIVE ] with_query [, ...]** - - 用于声明一个或多个可以在主查询中通过名称引用的子查询,相当于临时表。 - - 如果声明了RECURSIVE,那么允许SELECT子查询通过名称引用它自己。 - - 其中with_query的详细格式为: - - ```ebnf+diagram - with_query ::= with_query_name [ ( column_name [, ...] ) ] AS ( {select | values | insert | update | delete} ) - ``` - - - with_query_name指定子查询生成的结果集名称,在查询中可使用该名称访问子查询的结果集。 - - - column_name指定子查询结果集中显示的列名。 - - - 每个子查询可以是SELECT,VALUES,INSERT,UPDATE或DELETE语句。 - - - 用户可以使用MATERIALIZED / NOT MATERIALIZED对CTE进行修饰。 - - - 如果声明为MATERIALIZED,WITH查询将被物化,生成一个子查询结果集的拷贝,在引用处直接查询该拷贝,因此WITH子查询无法和主干SELECT语句进行联合优化(如谓词下推、等价类传递等),对于此类场景可以使用NOT MATERIALIZED进行修饰,如果WITH查询语义上可以作为子查询内联执行,则可以进行上述优化。 - - - 如果用户没有显示声明物化属性则遵守以下规则:如果CTE只在所属主干语句中被引用一次,且语义上支持内联执行,则会被改写为子查询内联执行,否则以CTE Scan的方式物化执行。 - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: - > - > INSERT ON DUPLICATE KEY UPDATE不支持WITH及WITH RECURSIVE子句。 -- **plan_hint子句** - - 以`/*+ */`的形式在INSERT关键字后,用于对INSERT对应的语句块生成的计划进行hint调优,详细用法请参见章节[使用Plan Hint进行调优](9-hint-based-tuning)。每条语句中只有第一个`/*+ plan_hint */`注释块会作为hint生效,里面可以写多条hint。 - -- **table_name** - - 要插入数据的目标表名。 - - 取值范围: 已存在的表名。 - -- **partition_clause** - - 指定分区插入操作 - - ```ebnf+diagram - partition_clause ::= PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } | SUBPARTITION { ( subpartition_name ) | FOR ( subpartition_value [, ...] ) } - ``` - - 关键字详见[SELECT](SELECT)一节介绍。 - - 如果value子句的值和指定分区不一致,会抛出异常。 - - 示例详见[CREATE TABLE SUBPARTITION](CREATE-TABLE-SUBPARTITION)。 - -- **column_name** - - 目标表中的字段名: - - - 字段名可以有子字段名或者数组下标修饰。 - - 没有在字段列表中出现的每个字段,将由系统默认值,或者声明时的默认值填充,若都没有则用NULL填充。例如,向一个复合类型中的某些字段插入数据的话,其他字段将是NULL。 - - 目标字段(column_name)可以按顺序排列。如果没有列出任何字段,则默认全部字段,且顺序为表声明时的顺序。 - - 如果value子句和query中只提供了N个字段,则目标字段为前N个字段。 - - value子句和query提供的值在表中从左到右关联到对应列。 - - 取值范围: 已存在的字段名。 - -- **expression** - - 赋予对应column的一个有效表达式或值: - - - 如果是INSERT ON DUPLICATE KEY UPDATE语句下,expression可以为VALUES(column_name)或EXCLUDED.column_name用来表示引用冲突行对应的column_name字段的值。需注意,其中VALUES(column_name)不支持嵌套在表达式中(例如VALUES(column_name)+1),但EXCLUDED不受此限制。 - - 向表中字段插入单引号 “ ' “时需要使用单引号自身进行转义。 - - 如果插入行的表达式不是正确的数据类型,系统试图进行类型转换,若转换不成功,则插入数据失败,系统返回错误信息。 - -- **DEFAULT** - - 对应字段名的缺省值。如果没有缺省值,则为NULL。 - -- **query** - - 一个查询语句(SELECT语句),将查询结果作为插入的数据。 - -- **RETURNING** - - 返回实际插入的行,RETURNING列表的语法与SELECT的输出列表一致。注意:INSERT ON DUPLICATE KEY UPDATE不支持RETURNING子句。 - -- **output_expression** - - INSERT命令在每一行都被插入之后用于计算输出结果的表达式。 - - 取值范围: 该表达式可以使用table的任意字段。可以使用*返回被插入行的所有字段。 - -- **output_name** - - 字段的输出名称。 - - 取值范围: 字符串,符合标识符命名规范。 - -- **ON DUPLICATE KEY UPDATE** - - 对于带有唯一约束(UNIQUE INDEX或PRIMARY KEY)的表,如果插入数据违反唯一约束,则对冲突行执行UPDATE子句完成更新,对于不带唯一约束的表,则仅执行插入。UPDATE时,若指定NOTHING则忽略此条插入,可通过”EXCLUDE.” 或者 “VALUES()” 来选择源数据相应的列。 - - - 支持触发器,触发器执行顺序由实际执行流程决定: - - 执行insert:触发before insert、after insert触发器。 - - 执行update:触发before insert、before update、after update触发器。 - - 执行update nothing:触发before insert触发器。 - - 不支持延迟生效(DEFERRABLE)的唯一约束或主键。 - - 如果表中存在多个唯一约束,如果所插入数据违反多个唯一约束,对于检测到冲突的第一行进行更新,其他冲突行不更新(检查顺序与索引维护具有强相关性,一般先创建的索引先进行冲突检查)。 - - - 如果插入多行,这些行均与表中同一行数据存在唯一约束冲突,则按照顺序,第一条执行插入或更新,之后依次执行更新。 - - 主键、唯一索引列不允许UPDATE。 - - - 不支持列存,不支持外表、内存表。 - - expression支持使用子查询表达式,其语法与功能同UPDATE。子查询表达式中支持使用“EXCLUDED.”来选择源数据相应的列。 - -## 示例 - -```sql ---创建表tpcds.reason_t2。 -MogDB=# CREATE TABLE tpcds.reason_t2 -( - r_reason_sk integer, - r_reason_id character(16), - r_reason_desc character(100) -); - ---向表中插入一条记录。 -MogDB=# INSERT INTO tpcds.reason_t2(r_reason_sk, r_reason_id, r_reason_desc) VALUES (1, 'AAAAAAAABAAAAAAA', 'reason1'); - ---向表中插入一条记录,和上一条语法等效。 -MogDB=# INSERT INTO tpcds.reason_t2 VALUES (2, 'AAAAAAAABAAAAAAA', 'reason2'); - ---向表中插入多条记录。 -MogDB=# INSERT INTO tpcds.reason_t2 VALUES (3, 'AAAAAAAACAAAAAAA','reason3'),(4, 'AAAAAAAADAAAAAAA', 'reason4'),(5, 'AAAAAAAAEAAAAAAA','reason5'); - ---向表中插入tpcds.reason中r_reason_sk小于5的记录。 -MogDB=# INSERT INTO tpcds.reason_t2 SELECT * FROM tpcds.reason WHERE r_reason_sk <5; - ---对表创建唯一索引 -MogDB=# CREATE UNIQUE INDEX reason_t2_u_index ON tpcds.reason_t2(r_reason_sk); - ---向表中插入多条记录,如果冲突则更新冲突数据行中r_reason_id字段为'BBBBBBBBCAAAAAAA'。 -MogDB=# INSERT INTO tpcds.reason_t2 VALUES (5, 'BBBBBBBBCAAAAAAA','reason5'),(6, 'AAAAAAAADAAAAAAA', 'reason6') ON DUPLICATE KEY UPDATE r_reason_id = 'BBBBBBBBCAAAAAAA'; - ---删除表tpcds.reason_t2。 -MogDB=# DROP TABLE tpcds.reason_t2; -``` - -## 优化建议 - -- VALUES - - 通过insert语句批量插入数据时,建议将多条记录合并入一条语句中执行插入,以提高数据加载性能。例如,INSERT INTO sections VALUES (30, 'Administration', 31, 1900),(40, 'Development', 35, 2000), (50, 'Development' , 60 , 2001); +--- +title: INSERT +summary: INSERT +author: Zhang Cuiping +date: 2021-05-18 +--- + +# INSERT + +## 功能描述 + +向表中添加一行或多行数据。 + +## 注意事项 + +- 只有拥有表INSERT权限的用户,才可以向表中插入数据。用户被授予insert any table权限,相当于用户对除系统模式之外的任何模式具有USAGE权限,并且拥有这些模式下表的INSERT权限。 + +- 如果使用RETURNING子句,用户必须要有该表的SELECT权限。 + +- 如果使用ON DUPLICATE KEY UPDATE,用户必须要有该表的SELECT、UPDATE权限,唯一约束(主键或唯一索引)的SELECT权限。 + +- 如果使用query子句插入来自查询里的数据行,用户还需要拥有在查询里使用的表的SELECT权限。 + +- 当连接到TD兼容的数据库时,td_compatible_truncation参数设置为on时,将启用超长字符串自动截断功能,在后续的insert语句中(不包含外表的场景下),对目标表中char和varchar类型的列上插入超长字符串时,系统会自动按照目标表中相应列定义的最大长度对超长字符串进行截断。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** + > 如果向字符集为字节类型编码(SQL_ASCII,LATIN1等)的数据库中插入多字节字符数据(如汉字等),且字符数据跨越截断位置,这种情况下,按照字节长度自动截断,自动截断后会在尾部产生非预期结果。如果用户有对于截断结果正确性的要求,建议用户采用UTF8等能够按照字符截断的输入字符集作为数据库的编码集。 + +## 语法格式 + +```ebnf+diagram +Insert ::= [ WITH [ RECURSIVE ] with_query [, ...] ] +INSERT [INTO] table_name [ ( column_name [, ...] ) ] + { DEFAULT VALUES + | VALUES {( { expression | DEFAULT } [, ...] ) }[, ...] + | query } + [ ON DUPLICATE KEY UPDATE {{ column_name = { expression | DEFAULT } } [, ...] | NOTHING} ] + [ RETURNING {* | {output_expression [ [ AS ] output_name ] }[, ...]} ]; +``` + +## 参数说明 + +- **WITH [ RECURSIVE ] with_query [, ...]** + + 用于声明一个或多个可以在主查询中通过名称引用的子查询,相当于临时表。 + + 如果声明了RECURSIVE,那么允许SELECT子查询通过名称引用它自己。 + + 其中with_query的详细格式为: + + ```ebnf+diagram + with_query ::= with_query_name [ ( column_name [, ...] ) ] AS ( {select | values | insert | update | delete} ) + ``` + + - with_query_name指定子查询生成的结果集名称,在查询中可使用该名称访问子查询的结果集。 + + - column_name指定子查询结果集中显示的列名。 + + - 每个子查询可以是SELECT,VALUES,INSERT,UPDATE或DELETE语句。 + + - 用户可以使用MATERIALIZED / NOT MATERIALIZED对CTE进行修饰。 + + - 如果声明为MATERIALIZED,WITH查询将被物化,生成一个子查询结果集的拷贝,在引用处直接查询该拷贝,因此WITH子查询无法和主干SELECT语句进行联合优化(如谓词下推、等价类传递等),对于此类场景可以使用NOT MATERIALIZED进行修饰,如果WITH查询语义上可以作为子查询内联执行,则可以进行上述优化。 + + - 如果用户没有显示声明物化属性则遵守以下规则:如果CTE只在所属主干语句中被引用一次,且语义上支持内联执行,则会被改写为子查询内联执行,否则以CTE Scan的方式物化执行。 + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** + > + > INSERT ON DUPLICATE KEY UPDATE不支持WITH及WITH RECURSIVE子句。 +- **plan_hint子句** + + 以`/*+ */`的形式在INSERT关键字后,用于对INSERT对应的语句块生成的计划进行hint调优,详细用法请参见章节[使用Plan Hint进行调优](9-hint-based-tuning)。每条语句中只有第一个`/*+ plan_hint */`注释块会作为hint生效,里面可以写多条hint。 + +- **table_name** + + 要插入数据的目标表名。 + + 取值范围: 已存在的表名。 + +- **partition_clause** + + 指定分区插入操作 + + ```ebnf+diagram + partition_clause ::= PARTITION { ( partition_name ) | FOR ( partition_value [, ...] ) } | SUBPARTITION { ( subpartition_name ) | FOR ( subpartition_value [, ...] ) } + ``` + + 关键字详见[SELECT](SELECT)一节介绍。 + + 如果value子句的值和指定分区不一致,会抛出异常。 + + 示例详见[CREATE TABLE SUBPARTITION](CREATE-TABLE-SUBPARTITION)。 + +- **column_name** + + 目标表中的字段名: + + - 字段名可以有子字段名或者数组下标修饰。 + - 没有在字段列表中出现的每个字段,将由系统默认值,或者声明时的默认值填充,若都没有则用NULL填充。例如,向一个复合类型中的某些字段插入数据的话,其他字段将是NULL。 + - 目标字段(column_name)可以按顺序排列。如果没有列出任何字段,则默认全部字段,且顺序为表声明时的顺序。 + - 如果value子句和query中只提供了N个字段,则目标字段为前N个字段。 + - value子句和query提供的值在表中从左到右关联到对应列。 + + 取值范围: 已存在的字段名。 + +- **expression** + + 赋予对应column的一个有效表达式或值: + + - 如果是INSERT ON DUPLICATE KEY UPDATE语句下,expression可以为VALUES(column_name)或EXCLUDED.column_name用来表示引用冲突行对应的column_name字段的值。需注意,其中VALUES(column_name)不支持嵌套在表达式中(例如VALUES(column_name)+1),但EXCLUDED不受此限制。 + - 向表中字段插入单引号 “ ' “时需要使用单引号自身进行转义。 + - 如果插入行的表达式不是正确的数据类型,系统试图进行类型转换,若转换不成功,则插入数据失败,系统返回错误信息。 + +- **DEFAULT** + + 对应字段名的缺省值。如果没有缺省值,则为NULL。 + +- **query** + + 一个查询语句(SELECT语句),将查询结果作为插入的数据。 + +- **RETURNING** + + 返回实际插入的行,RETURNING列表的语法与SELECT的输出列表一致。注意:INSERT ON DUPLICATE KEY UPDATE不支持RETURNING子句。 + +- **output_expression** + + INSERT命令在每一行都被插入之后用于计算输出结果的表达式。 + + 取值范围: 该表达式可以使用table的任意字段。可以使用*返回被插入行的所有字段。 + +- **output_name** + + 字段的输出名称。 + + 取值范围: 字符串,符合标识符命名规范。 + +- **ON DUPLICATE KEY UPDATE** + + 对于带有唯一约束(UNIQUE INDEX或PRIMARY KEY)的表,如果插入数据违反唯一约束,则对冲突行执行UPDATE子句完成更新,对于不带唯一约束的表,则仅执行插入。UPDATE时,若指定NOTHING则忽略此条插入,可通过”EXCLUDE.” 或者 “VALUES()” 来选择源数据相应的列。 + + - 支持触发器,触发器执行顺序由实际执行流程决定: + - 执行insert:触发before insert、after insert触发器。 + - 执行update:触发before insert、before update、after update触发器。 + - 执行update nothing:触发before insert触发器。 + - 不支持延迟生效(DEFERRABLE)的唯一约束或主键。 + - 如果表中存在多个唯一约束,如果所插入数据违反多个唯一约束,对于检测到冲突的第一行进行更新,其他冲突行不更新(检查顺序与索引维护具有强相关性,一般先创建的索引先进行冲突检查)。 + + - 如果插入多行,这些行均与表中同一行数据存在唯一约束冲突,则按照顺序,第一条执行插入或更新,之后依次执行更新。 + - 主键、唯一索引列不允许UPDATE。 + + - 不支持列存,不支持外表、内存表。 + - expression支持使用子查询表达式,其语法与功能同UPDATE。子查询表达式中支持使用“EXCLUDED.”来选择源数据相应的列。 + +## 示例 + +```sql +--创建表tpcds.reason_t2。 +MogDB=# CREATE TABLE tpcds.reason_t2 +( + r_reason_sk integer, + r_reason_id character(16), + r_reason_desc character(100) +); + +--向表中插入一条记录。 +MogDB=# INSERT INTO tpcds.reason_t2(r_reason_sk, r_reason_id, r_reason_desc) VALUES (1, 'AAAAAAAABAAAAAAA', 'reason1'); + +--向表中插入一条记录,和上一条语法等效。 +MogDB=# INSERT INTO tpcds.reason_t2 VALUES (2, 'AAAAAAAABAAAAAAA', 'reason2'); + +--向表中插入多条记录。 +MogDB=# INSERT INTO tpcds.reason_t2 VALUES (3, 'AAAAAAAACAAAAAAA','reason3'),(4, 'AAAAAAAADAAAAAAA', 'reason4'),(5, 'AAAAAAAAEAAAAAAA','reason5'); + +--向表中插入tpcds.reason中r_reason_sk小于5的记录。 +MogDB=# INSERT INTO tpcds.reason_t2 SELECT * FROM tpcds.reason WHERE r_reason_sk <5; + +--对表创建唯一索引 +MogDB=# CREATE UNIQUE INDEX reason_t2_u_index ON tpcds.reason_t2(r_reason_sk); + +--向表中插入多条记录,如果冲突则更新冲突数据行中r_reason_id字段为'BBBBBBBBCAAAAAAA'。 +MogDB=# INSERT INTO tpcds.reason_t2 VALUES (5, 'BBBBBBBBCAAAAAAA','reason5'),(6, 'AAAAAAAADAAAAAAA', 'reason6') ON DUPLICATE KEY UPDATE r_reason_id = 'BBBBBBBBCAAAAAAA'; + +--删除表tpcds.reason_t2。 +MogDB=# DROP TABLE tpcds.reason_t2; +``` + +## 优化建议 + +- VALUES + + 通过insert语句批量插入数据时,建议将多条记录合并入一条语句中执行插入,以提高数据加载性能。例如,INSERT INTO sections VALUES (30, 'Administration', 31, 1900),(40, 'Development', 35, 2000), (50, 'Development' , 60 , 2001); diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/system-catalogs-and-system-views/system-catalogs/GS_ASP.md b/product/zh/docs-mogdb/v3.0/reference-guide/system-catalogs-and-system-views/system-catalogs/GS_ASP.md index 17d3c234b2b3fcf2e1c836eea4013fae3c269bd7..2491629447cb90769b2383d588519116de68290f 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/system-catalogs-and-system-views/system-catalogs/GS_ASP.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/system-catalogs-and-system-views/system-catalogs/GS_ASP.md @@ -39,4 +39,5 @@ GS_ASP显示被持久化的ACTIVE SESSION PROFILE样本,该表只在系统库 | lockmode | text | 会话等待锁模式:
- LW_EXCLUSIVE:排他锁
- LW_SHARED:共享锁
- LW_WAIT_UNTIL_FREE:等待LW_EXCLUSIVE可用 | | block_sessionid | bigint | 如果会话正在等待锁,阻塞该会话获取锁的会话标识。 | | wait_status | text | 描述event列的更多详细信息。 | -| global_sessionid | text | 全局会话ID。 | \ No newline at end of file +| global_sessionid | text | 全局会话ID。 | +| plan_node_id | int | 执行计划树的算子id | \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/system-catalogs-and-system-views/system-views/GS_ASYNC_SUBMIT_SESSIONS_STATUS.md b/product/zh/docs-mogdb/v3.0/reference-guide/system-catalogs-and-system-views/system-views/GS_ASYNC_SUBMIT_SESSIONS_STATUS.md new file mode 100644 index 0000000000000000000000000000000000000000..ae42e1e536febf352dbe9a1d61482320063ed00c --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/reference-guide/system-catalogs-and-system-views/system-views/GS_ASYNC_SUBMIT_SESSIONS_STATUS.md @@ -0,0 +1,25 @@ +--- +title: GS_ASYNC_SUBMIT_SESSIONS_STATUS +summary: GS_ASYNC_SUBMIT_SESSIONS_STATUS +author: Guo Huan +date: 2022-06-13 +--- + +# GS_ASYNC_SUBMIT_SESSIONS_STATUS + +GS_ASYNC_SUBMIT_SESSIONS_STATUS视图用于查看使用异步提交的session状态。 + +**表 1** GS_ASYNC_SUBMIT_SESSIONS_STATUS字段 + +| 名称 | 类型 | 描述 | +| ------------------------------------- | ------- | ------------------------------------------------------------ | +| nodename | text | 节点名 | +| groupid | int | 线程组号 | +| waiting_xlog_flush_session_num | int | 等待日志刷盘的session数 | +| waiting_sync_rep_receive_session_num | int | 等待备份同步日志receive的session数 | +| waiting_sync_rep_write_session_num | int | 等待备份同步日志write的session数 | +| waiting_sync_rep_flush_session_num | int | 等待备份同步日志flush的session数 | +| waiting_sync_rep_apply_session_num | int | 等待备份同步日志apply的session数 | +| waiting_sync_paxos_session_num | integer | 等待dcf同步日志的session数 | +| waiting_commit_session_num | int | 已经完成日志刷盘(和备份同步)但还没有完成异步提交的session数 | +| finished_commit_session_num | int | 已经完成异步提交的session数 | diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/server-tools/1-gs_check.md b/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/server-tools/1-gs_check.md index 1fbb3544587564dfd061d67795de039a1c343b70..5c30ce1ae9e32ddf163eff534cc43c6903c2b456 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/server-tools/1-gs_check.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/server-tools/1-gs_check.md @@ -1,1134 +1,1162 @@ ---- -title: gs_check -summary: gs_check -author: Zhang Cuiping -date: 2021-06-07 ---- - -# gs_check - -## 背景信息 - -gs_check改进增强,统一化当前系统中存在的各种检查工具,例如gs_check,gs_checkos等,帮助用户在MogDB运行过程中,全量的检查MogDB运行环境,操作系统环境,网络环境及数据库执行环境,也有助于在MogDB重大操作之前对各类环境进行全面检查,有效保证操作执行成功。 - -## 注意事项 - -- 必须指定-i或-e参数,-i会检查指定的单项,-e会检查对应场景配置中的多项。 -- 如果-i参数中不包含root类检查项或-e场景配置列表中没有root类检查项,则不需要交互输入root权限的用户及其密码。 -- 可使用--skip-root-items跳过检查项中包含的root类检查,以免需要输入root权限用户及密码。 -- MTU值不一致时可能导致检查缓慢或进程停止响应,当巡检工具出现提示时请修改各节点MTU值一致后再进行巡检。 -- 交换机不支持当前设置的MTU值时,即使MTU值一致也会出现通信问题引起进程停止响应,需要根据交换机调整MTU大小。 - -## 语法 - -- 单项检查: - - ```bash - gs_check -i ITEM [...] [-U USER] [-L] [-l LOGFILE] [-o OUTPUTDIR] [--skip-root-items][--set][--routing] - ``` - -- 场景检查: - - ```bash - gs_check -e SCENE_NAME [-U USER] [-L] [-l LOGFILE] [-o OUTPUTDIR] [--skip-root-items] [--time-out=SECS][--set][--routing][--skip-items] - ``` - -- 显示帮助信息: - - ```bash - gs_check -? | --help - ``` - -- 显示版本号信息: - - ```bash - gs_check -V | --version - ``` - -## 参数说明 - -- -U - - 运行MogDB的用户名称。 - - 取值范围: 运行MogDB的用户名称。 - -- -L - - 本地执行。 - -- -i - - 指定检查项。格式-i CheckXX详细的检查项请参见[MogDB状态检查表](#zhuangtaijiancha)。 - -- -e - - 场景检查项。默认的场景有inspect(例行巡检)、upgrade(升级前巡检)、binary_upgrade(就地升级前巡检)、health(健康检查巡检)、install(安装),等,用户可以根据需求自己编写场景。 - -- -l - - 指定日志文件路径,指定路径时需添加.log后缀。 - -- -o - - 指定检查结果输出文件夹路径。 - -- --skip-root-items - - 跳过需要root权限执行的检查项。 - -- --skip-items - - 跳过指定的检查项。 - -- --format - - 设置结果报告的格式。 - -- --set - - 修复支持设置的Abnormal项。 - -- --cid - - 检查ID,仅被内部check进程使用。 - -- --time-out - - 设置超时时间。单位为秒,默认为1500s,若用户自定义超时时间不得少于1500s。 - -- --routing - - 指定业务IP的网段,格式为IP地址:子网掩码。 - -- --disk-threshold=“PERCENT” - - 检查磁盘占用时可选指定告警阈值,可指定1-99之间的整数,不输入则默认为90。检查其他项时不需要该参数。 - -- -?, --help - - 显示帮助信息。 - -- -V, --version - - 显示版本号信息。 - -### MogDB状态检查表 - -- OS - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
巡检项检查内容是否支持--set
CheckCPU(检查CPU使用率)检查主机CPU占用率,如果idle大于30%并且iowait小于30%。则检查项通过,否则检查项不通过。
CheckFirewall(检查防火墙状态)检查主机防火墙状态,如果防火墙关闭则检查项通过,否则检查项不通过。
CheckTimeZone(检查时区一致性)检查MogDB内各节点时区,如果时区一致则检查通过,否则检查项不通过。
CheckSysParams(检查系统参数) - 检查各节点操作系统参数,判断是否等于预期值。检查项不满足warning域则报warning,不满足NG域则检查项不通过,并打印不满足项。 -
CheckOSVer(检查操作系统版本) - 检查MogDB内各个节点的操作系统版本信息,如果满足版本兼容列表且MogDB在同一混搭列表中则检查通过,否则检查不通过。 -
CheckNTPD(检查NTPD服务) - 检查系统NTPD服务,如果服务开启且各节点时间误差在1分钟以内则检查项通过,否则检查项不通过。 -
CheckTHP(检查THP服务)检查系统THP服务,如果服务开启则检查项通过,否则检查项不通过。
CheckSshdService(检查sshd服务是否已启动)检查系统是否存在sshd服务,若存在则检查项通过,否则检查项不通过。
CheckCrondService(检查crontab服务是否已启动)检查系统是否存在crontab服务,若存在则检查项通过,否则检查项不通过。
CheckCrontabLeft(检查crontab是否有残留Gauss相关信息) - 检查crontab是否残留Gauss相关信息,若无该信息则检查项通过,否则检查项不通过。 -
CheckDirLeft(检查文件目录是否有残留) - 检查文件目录(/opt/enmo/Bigdata/ ,/var/log/Bigdata/, - /home/omm)是否存在,(若mount目录包含此目录则忽略)若不存在则查项通过,否则检查项不通过。 -
CheckProcessLeft(检查进程是否有残留) - 检查是否残留gaussdb和omm进程,若未残留则检查项通过,否则检查项不通过。 -
CheckStack(栈深度检查) - 检查栈深度,若各个节点不一致则报warning - ,若大于等于3072则检查项通过,否则不通过。 -
CheckOmmUserExist(检查omm用户是否存在) - 检查是否存在omm用户,若不存在omm用户则检查项通过,否则检查项不通过。 -
CheckPortConflict(检查数据库节点端口是否占用) - 检查数据库节点端口是否已被占用,若未占用则检查项通过,否则检查项不通过。 -
CheckSysPortRange(检查ip_local_port_range设置范围) - 检查ip_local_port_range系统参数范围,若范围在26000~65535则检查项通过,否则检查项不通过。 -
CheckEtcHosts(检查/etc/hosts中是否有重复地址以及localhost配置) - 检查/etc/hosts没有配置localhost检查项不通过,存在带有#MogDB注释的映射则检查项不通过,相同IP不同hostname则检查项不通过,否则通过,若hostname相同,但ip不同检查项不通过。 -
CheckCpuCount(检查CPU核数) - 检查CPU核心与可用CPU不符检查项不通过,相符但存在不可用信息Warning。 - 所有节点CPU信息不相同检查项不通过。 -
CheckHyperThread(检查超线程是否打开)检查超线程,若打开则检查项通过,否则检查项不通过。
CheckMemInfo(检查内存总大小) - 检查各节点总内存大小是否一致,若检查结果一致,则检查项通过,否则报warning。 -
CheckSshdConfig(检查sshd服务配置是否正确) - 检查/etc/ssh/sshd_config文件,
- (a)PasswordAuthentication=yes;
- (b)MaxStartups=1000;
- (c)UseDNS=no;
- (d)ClientAliveInterval大于10800或者等于0
- 配置如上所示则检查项通过,若a、c配置不正确则报warning,b、d配置不正确则检查项不通过。 -
CheckMaxHandle(检查句柄最大设置) - 检查操作系统最大句柄值,如果该值大于等于1000000则检查项通过,否则检查项不通过。 -
CheckKernelVer(检查内核版本) - 检查各节点系统内核版本信息,如果版本信息一致则检查项通过,否则报Warning。 -
CheckEncoding(检查编码格式) - 检查MogDB内各个节点的系统编码,如果编码一致则检查项通过,否则检查项不通过。 -
CheckBootItems(检查启动项)检查是否有手动添加的启动项,如果没有则检查通过,否则检查不通过。
CheckDropCache(检查DropCache进程) - 检查各节点是否有dropcache进程在运行,若有则检查通过,否则检查不通过。 -
CheckFilehandle(检查文件句柄) - 此检查项检查以下两项,两项都通过为通过,否则为不通过:
- - 检查每个gaussdb进程打开的进程数是否超过80万,不超过则检查通过,否则检查不通过。
- - 检查是否有slave进程使用的句柄数超过master进程,如果没有则检查通过,否则检查不通过。 -
CheckKeyProAdj(检查关键进程omm_adj的值) - 检查所有关键进程,如果所有关键进程的omm_adj值为0,则通过,否则不通过。 -
CheckMaxProcMemory(检查max_process_memory参数设置是否合理) - 检查数据库节点的max_process_memory值,判断该参数的值是否大于1G,若不大于则检查项通过,否则检查项不通过。 -
- -- Device - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
巡检项检查内容是否支持--set
CheckSwapMemory(检查交换内存) - 检查交换内存和总内存大小,若检查结果为0则检查项通过,否则检查项报Warning大于总内存时检查项不通过。 -
CheckLogicalBlock(检查磁盘逻辑块)检查磁盘逻辑块大小,若为512则检查项通过,否则检查项不通过。
CheckIOrequestqueue(检查IO请求)检查IO值,如果该值为32768则检查项通过,否则检查项不通过。
CheckMaxAsyIOrequests(检查最大异步IO请求) - 获取当前异步IO请求值,当前异步IO请求值大于当前节点数据库实例数*1048576和104857600则检查项通过,否则检查项不通过。 -
CheckIOConfigure(检查IO配置)检查IO配置,如果是deadline则检查项通过,否则检查项不通过。
CheckBlockdev(检查磁盘预读块) - 检查磁盘预读块大小,如果预读块大小为16384则检查项通过,否则检查项不通过。 -
CheckDiskFormat(检查磁盘格式参数) - 检查磁盘XFS格式信息,如果配置为'rw,noatime,inode64,allocsize=16m'则检查项通过,否则报warning。 -
CheckInodeUsage(检查磁盘inodes使用率) - MogDB路径(GAUSSHOME/PGHOST/GPHOME/GAUSSLOG/tmp及实例目录)
- 检查以上指定目录使用率,如果使用率超过warning阈值(默认为60%) - 报warning超过NG阈值(默认为80%)则检查项不通过,否则通过。 -
CheckSpaceUsage(检查磁盘使用率) - MogDB路径(GAUSSHOME/PGHOST/GPHOME/GAUSSLOG/tmp及实例目录)
- 检查磁盘以上指定目录(目录列表)使用率,如果使用率超过warning阈值(默认为70%) - 报warning超过NG阈值(默认为90%)则检查项不通过。MogDB路径下检查GAUSSHOME/PGHOST/GPHOME/GAUSSLOG/tmp/data路径的剩余空间,不满足阈值则检查项不通过,否则通过。 -
CheckDiskConfig(检查磁盘空间大小一致性)检查磁盘名大小挂载点是否一致,若一致则检查项通过,否则报warning。
CheckXid(检查CheckXid数值)查询xid的数值,如果大于10亿报Warning,大于18亿则检查项不通过。
CheckSysTabSize(检查每个实例的系统表容量) - 如果每一块磁盘的剩余容量大于该磁盘上所有实例的系统表容量总和则检查项通过,否则检查项不通过。 -
- -- Cluster - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
巡检项检查内容是否支持--set
CheckClusterState(检查MogDB状态) - 检查fencedUDF状态,如果fencedUDF状态为down则报warning;检查MogDB状态,如果MogDB状态为Normal则检查项通过,否则检查项不通过。 -
CheckDBParams(检查MogDB参数) - 检查数据库主节点检查共享缓冲区大小和Sem参数。
- 数据库节点检查共享缓冲区大小和最大连接数。
共享缓冲区需要大于128KB且大于shmmax且大于shmall*PAGESIZE -
- 若存在数据库主节点,则Sem值需大于(数据库节点最大连接数+150)/16向上取整。
以上项完全满足则检查项通过,否则检查项不通过。 -
CheckDebugSwitch(检查日志级别) - 在各节点检查各实例的配置文件中log_min_messages参数的值,为空则认为是Warning,判断日志级别非waring,则报warning。 -
CheckUpVer(检查升级版本是否一致) - 检查MogDB各个节点上升级包的版本,如果一致则检查项通过,否则检查项不通过。使用时,需指定升级软件包路径。 -
CheckDirPermissions(检查目录权限) - 检查节点目录(实例Xlog路径、GAUSSHOME、GPHOME、PGHOST、GAUSSLOG)权限,如果目录有写入权限且不大于750则检查项通过,否则检查项不通过。 -
CheckEnvProfile(检查环境变量) - 检查节点环境变量(\$GAUSSHOME、\$LD_LIBRARY_PATH、\$PATH),检查CMS/CMA/数据库节点进程的环境变量。如果环境变量存在并配置正确,进程的环境变量存在则检查项通过,否则检查项不通过。 -
CheckGaussVer(检查gaussdb版本) - 检查各个节点的网卡型号以及驱动版本是否一致,一致则通过,否则报warning。 -
CheckPortRange(检查端口范围) - 若ip_local_port_range的范围在阈值范围内(默认是26000 - 65535),并且实例端口不在ip_local_port_range范围内则检查项通过,否则检查项不通过。 -
CheckReadonlyMode(检查只读模式) - 检查MogDB数据库主节点default_transaction_read_only值若为off则检查通过,否则不通过。 -
CheckCatchup(检查Catchup) - 检查gaussdb进程堆栈是否能搜索到CatchupMain函数,若搜索不到则检查项通过,否则检查项不通过。 -
CheckProcessStatus(检查MogDB进程属主) - 检查 - 'gaussdb'进程属主,若不存在omm以外的属主则检查项通过,否则检查项不通过。 -
CheckSpecialFile(特殊文件检查) - 检查tmp目录(PGHOST)、OM目录(GPHOME)、日志目录(GAUSSLOG)、data目录、程序目录(GAUSSHOME)下文件是否存在特殊字符以及非omm用户的文件,若不存在则检查项通过,否则检查项不通过。 -
CheckCollector(检查MogDB的信息收集) - 在output目录下查看信息收集是否成功,若收集成功则检查项通过,否则检查项不通过。 -
CheckLargeFile(检查数据目录大文件) - 检查各个数据库节点目录是否存在超过4G的文件。任一数据库节点目录及其子目录有超过4G的单个文件,则检查不通过,否则检查通过。 -
CheckProStartTime(关键进程启动时间检测) - 检查关键进程启动时间是否间隔超过5分钟,超过则检查不通过,否则检查通过。 -
CheckDilateSysTab(检查系统表膨胀)检查系统表是否膨胀,若膨胀则不通过,否则检查通过。
CheckMpprcFile(检测环境变量分离文件改动) - 检查是否存在对环境变量分离文件的改动,若存在则检查不通过,否则检查通过。 -
- -- Database - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
巡检项检查内容是否支持--set
CheckLockNum(检查锁数量)检查数据库锁数量,查询成功检查项通过。
CheckArchiveParameter(检查归档参数) - 检查数据库归档参数,如果未打开或打开且在数据库节点下则检查项通过, - 打开且不在数据库主节点目录下则检查项不通过。 -
CheckCurConnCount(检查当前连接数) - 检查数据库连接数,如果连接数小于最大连接数的90%则检查项通过,否则检查项不通过。 -
CheckCursorNum(检查当前游标数)检查数据库的游标数,检查成功则检查项通过,否则检查项不通过。
- CheckMaxDatanode(检查comm_max_datanode参数值范围小于数据库节点个数) - - 检查最大数据库节点数,若最大数据库节点数小于xml配置的节点数*数据库节点数(默认值为90*5)报warning,否则检查项通过。 -
CheckPgPreparedXacts(检查残留两阶段事务) - 检查pgxc_prepared_xacts参数,如果不存在二阶段事务则检查项通过,否则检查项不通过。 -
CheckPgxcgroup(检查pgxc_group表中需要重分布的个数) - 检查pgxc_group表中需要重分布的个数,检查结果为0则通过, 否则不通过。 -
CheckLockState(MogDB是否被锁)检查MogDB是否被锁,若MogDB被锁则不通过,否则检查项通过。
CheckIdleSession(检查业务停止)检查非空闲会话数,如果数量为0则检查项通过,否则检查项不通过。
CheckDBConnection(检查数据库连接)检查能否连接数据库,如果连接成功则检查项通过,否则检查项不通过。
CheckGUCValue(GUC参数检查) - 检查(max_connections + max_prepared_transactions) * - max_locks_per_transaction的值,若该值大于等于1000000则检查项通过,否则检查项不通过。 -
CheckPMKData(检查PMK异常数据) - 检查数据库PMK - schema是否包含有异常数据,如果不存在异常数据则检查项通过,否则检查项不通过。 -
CheckSysTable(检查系统表)检查系统表,检查成功则检查项通过。
CheckSysTabSize(检查每个实例的系统表容量) - 如果每一块磁盘的剩余容量大于该磁盘上所有实例的系统表容量总和则检查项通过,否则检查项不通过。 -
CheckTableSpace(检查表空间路径) - 表空间路径和MogDB路径之间不能存在嵌套且表空间路径相互不能存在嵌套,则检查项通过,否则检查项不通过。 -
CheckTableSkew(检查表级别数据倾斜) - 若存在表在MogDB各数据库节点上的数据分布不均衡,且分布数据最多的数据库节点比最低的数据库节点所分布的数据多100000条以上,则检查不通过,否则检查通过。 -
CheckDNSkew(检查数据库节点级别数据分布倾斜) - 检查数据库节点级别的表倾斜数据,若分布数据最高的数据库节点比分布数据最低的数据库节点数据量高于5%,则检查不通过,否则检查通过。 -
CheckUnAnalyzeTable(检查未做analyze的表) - 若存在未做analyze的表,并且表中至少包含一条数据,则检查不通过,否则检查通过。 -
CheckCreateView(创建视图检查) - 创建视图时,如果查询语句中含有子查询,并且子查询结果查询解析和重写之后存在别名重复,检查不通过,否则检查通过。 -
CheckHashIndex(hash index语法检查)如果存在hash index则检查不通过,否则检查通过。
CheckNextvalInDefault(检查Default表达式中包含nextval(sequence)) - 检查Default表达式中是否包含nextval(sequence),若包含则不通过,否则通过。 -
CheckNodeGroupName(Node group编码格式检查) - 存在非SQL_ASCII字符的Node Group名称则检查不通过,不存在则检查通过 。 -
CheckPgxcRedistb(检查重分布残留的临时表 ) - 检查数据库中是否存在重分布残留的临时表,若不存在则检查通过,否则检查不通过 - 。 -
CheckReturnType(用户自定义函数返回值类型检查) - 检查用户自定义函数是否包含非法返回类型,若包含则检查不通过,否则检查通过。 -
CheckSysadminUser(检查sysadmin用户) - 检查除MogDB属主外是否存在数据库管理员用户,若存在则不通过,否则检查通过。 -
CheckTDDate(TD数据库中orc表date类型列检查) - 检查TD模式数据库下的orc表中是否包含date类型的列,若包含检查不通过,否则检查通过。 -
CheckDropColumn(drop column检查)如果存在drop column的表,则检查不通过,否则检查通过。
CheckDiskFailure(检查磁盘故障) - 对MogDB中的所有数据做全量查询,若存在查询错误则检查不通过,否则检查通过。 -
-- Network - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
巡检项检查内容是否支持--set
CheckPing(检查网络通畅) - 检查MogDB内所有节点的互通性,如果各节点所有IP均可ping通则检查项通过,否则检查项不通过。 -
CheckRXTX(检查网卡RXTX值) - 检查节点backIP的RX/TX值,如果该值为4096则检查项通过,否则检查项不通过。 -
CheckMTU(检查网卡MTU值) - 检查节点backIP对应的网卡MTU值( - bond后的物理网卡要确保一致),如果该值不是8192或1500报warning若MogDBMTU值一致则检查项通过,否则检查项不通过。 -
CheckNetWorkDrop(检查网络掉包率) - 检查各IP1分钟内网络掉包率,如果不超过1%则检查项通过,否则检查项不通过。 -
CheckBond(检查网卡绑定模式) - 检查是否有配置BONDING_OPTS或BONDING_MODULE_OPTS,若没有配置则报warning。检查各节点bond模式是否一致,如果同时满足则检查项通过,否则检查项不通过。 -
CheckMultiQueue(检查网卡多队列) - 检查cat - /proc/interrupts,判断是否开启网卡多队列且绑定不同CPU,如果满足则检查项通过,否则检查项不通过。 -
CheckUsedPort(检查随机端口使用数量) - 检查net.ipv4.ip_local_port_range,范围大于等于OS默认值通过(32768-61000); -
检查TCP协议随机端口数,小于总随机端口数的80%通过。 -
CheckNICModel(网卡型号和驱动版本一致性检查) - 检查各个节点的网卡型号以及驱动版本是否一致,一致则通过,否则报warning。 -
CheckRouting(本地路由表检查)检查各节点在业务IP网段的IP个数,超过1个则报warning,否则检查通过。
CheckNetSpeed(检查网卡接收带宽,ping值,丢包率) - 网络满载时,检查网卡平均接收带宽大于600MB通过;
- 网络满载时,检查网络ping值,小于1秒通过;
- 网络满载时,检查网卡丢包率,小于1%通过。 -
- -- Others - - - - - - - - - - - - -
巡检项检查内容是否支持--set
CheckDataDiskUsage(检查数据库节点磁盘空间使用率)检查磁盘数据库节点目录使用率,如果使用率低于90%则检查项通过,否则检查项不通过。
- -> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: CheckNetSpeed检查项: -> -> - CheckNetSpeed不支持-L本地检查模式,-L模式无法构造网络压力,检查的结果不准确。 -> - 在节点数小于6时,speed_test构造的网络压力可能无法跑满带宽,可能会造成检查结果不准确。 - -## 用户自定义场景 - -1. 以操作系统用户omm登录数据库主节点。 - -2. 在script/gspylib/inspection/config路径下新建场景配置文件scene_XXX.xml。 - -3. 将检查项写进场景配置文件中,书写格式为: - - ```xml - - - - - - - - - ``` - - item name为检查项名称 - - 注:用户需自行保证自定义xml的正确性 - -4. 在home/package/script/gspylib/inspection/config执行如下命令,将此文件分发至执行检查的各个节点 - - ```bash - scp scene_upgrade.xml SIA1000068994:home/package/script/gspylib/inspection/config/ - ``` - - > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: home/package/script/gspylib/inspection/config就是新建的场景配置文件的绝对路径。 - -5. 换至omm用户,执行以下命令查看检查结果。 - - ```bash - gs_check -e XXX - ``` - -## **用户自定义检查项** - -1. 新增巡检项配置,修改script/gspylib/inspection/config/items.xml文件,格式如下: - - ```xml - - - <zh>检查CPU占用率</zh> - <en>Check CPU Idle and I/O wait</en> - - - StandardCPUIdle=30; - StandardWIO=30 - - - 如果idle不足 CPU负载过高,请扩容CPU节点,如果iowait过高,则磁盘为瓶颈,更换高性能磁盘 - - - 检查主机CPU占用率,如果idle大于30%并且iowait小于30%,则检查项通过,否则检查项不通过 - - os - user - all - default - - ``` - - - id:巡检项id。 - - - name:巡检项脚本名, 和巡检项脚本文件名相同。 - - - title: 巡检项描述名称 (支持多语言)。 - - zh:中文版检查内容。 - - en:英文版检查内容。 - - - standard:巡检项标准说明(支持多语言)。 - - - suggestion: 巡检项修复建议说明(支持多语言)。 - - - threshold:巡检项阈值定义,多值之间使用分号隔开,示例Key1=Value1;Key2=Value2。 - - - category: 巡检项分类,可选参数:os,device,network,cluster,database,other。 - - - permission: 巡检项需要的执行权限,可选参数:root,user默认为user(普通用户)。 - - - scope:巡检项执行的节点范围,可选参数:cn-仅在数据库主节点执行,local-仅在当前节点执行,all-在MogDB所有节点执行,默认为all。 - - - analysis:巡检项执行结果分析方式,default-检查每个节点的结果,所有节点检查项通过,则最终检查通过,consistent-MogDB内所有节点一致性检查,单节点仅返回结果,各个节点结果一致则判定检查通过,custom-自定义结果分析方式,默认为default。 - - 注:用户需保证自定义xml的正确性 - -2. 新建检查脚本,脚本名称格式遵循CheckXXXX.py,必须以Check开头,脚本放置在script/gspylib/inspection/items目录下,该目录下脚本安装巡检项分类组织,每个分类一个单独的文件夹,巡检项脚本放置在对应的分类文件夹中。格式如下: - - ``` - class CheckCPU(BaseItem): - def __init__(self): - super(CheckCPU, self).__init__(self.__class__.__name__) - self.idle = None - self.wio = None - self.standard = None - - def preCheck(self): - # check the threshold was set correctly - if (not self.threshold.has_key('StandardCPUIdle') - or not self.threshold.has_key('StandardWIO')): - raise Exception("threshold can not be empty") - self.idle = self.threshold['StandardCPUIdle'] - self.wio = self.threshold['StandardWIO'] - - # format the standard by threshold - self.standard = self.standard.format(idle=self.idle, iowait=self.wio) - - def doCheck(self): - cmd = "sar 1 5 2>&1" - output = SharedFuncs.runShellCmd(cmd) - self.result.raw = output - # check the result with threshold - d = next(n.split() for n in output.splitlines() if "Average" in n) - iowait = d[-3] - idle = d[-1] - rst = ResultStatus.OK - vals = [] - if (iowait > self.wio): - rst = ResultStatus.NG - vals.append("The %s actual value %s is greater than expected value %s" % ("IOWait", iowait, self.wio)) - if (idle < self.idle): - rst = ResultStatus.NG - vals.append("The %s actual value %s is less than expected value %s" % ("Idle", idle, self.idle)) - self.result.rst = rst - if (vals): - self.result.val = "\n".join(vals) - ``` - - 所有脚本基于BaseItem基类开发,基类定义的通用的检查流程,通用的检查结果分析方法,默认的结果输出格式。可扩展方法: - - - doCheck: 该方法包含该检查项具体的检查方法,检查结果格式如下: - - result.rst - 检查结果状态,可选参数: - - - OK - 检查项完成,结果通过。 - - NA - 当前节点不涉及该检查项。 - - NG - 检查项完成,结果不通过。 - - WARNING - 检查项完成,结果警告。 - - ERROR - 检查项发生内部错误,未完成检查。 - - - preCheck: 检查前条件判定,内置两种实现:cnPreCheck - 用于检查当前执行节点是否包含数据库主节点实例,localPreCheck - 用于检查当前执行节点是否指定节点。可通过巡检项配置文件中的scope参数进行配置。 可重载该方法实现自定义的前置检查 - - - postAnalysis:检查结果分析方法,内置两种实现:default,consistent。可通过巡检项配置文件中的analysis参数进行配置。可重载该方法实现自定义的结果分析。 - - 注:用户自定义的检查项名称不得与已有检查项名称相同,同时用户需保证自定义检查项脚本的规范性。 - -3. 将此脚本分发至所有的执行节点。 - -4. 以omm用户登录,执行以下命令,查看结果。 - - 本地执行: - - ```bash - gs_check -i CheckXXX -L - ``` - - 非本地执行: - - ```bash - gs_check -i CheckXXX - ``` - -## 操作系统参数 - -**表 2** 操作系统参数 - -| 参数名称 | 参数说明 | 推荐取值 | -| :---------------------------- | :------------------------- | :--------------------- | -| net.ipv4.tcp_max_tw_buckets | 表示同时保持TIME_WAIT状态的TCP/IP连接最大数量。如果超过所配置的取值,TIME_WAIT将立刻被释放并打印警告信息。 | 10000 | -| net.ipv4.tcp_tw_reuse | 允许将TIME-WAIT状态的sockets重新用于新的TCP连接。
- 0表示关闭。
- 1表示开启。 | 1 | -| net.ipv4.tcp_tw_recycle | 表示开启TCP连接中TIME-WAIT状态sockets的快速回收。
- 0表示关闭。
- 1表示开启。 | 1 | -| net.ipv4.tcp_keepalive_time | 表示当keepalive启用的时候,TCP发送keepalive消息的频度。 | 30 | -| net.ipv4.tcp_keepalive_probes | 在认定连接失效之前,发送TCP的keepalive探测包数量。这个值乘以tcp_keepalive_intvl之后决定了一个连接发送了keepalive之后可以有多少时间没有回应。 | 9 | -| net.ipv4.tcp_keepalive_intvl | 当探测没有确认时,重新发送探测的频度。 | 30 | -| net.ipv4.tcp_retries1 | 在连接建立过程中TCP协议最大重试次数。 | 5 | -| net.ipv4.tcp_syn_retries | TCP协议SYN报文最大重试次数。 | 5 | -| net.ipv4.tcp_synack_retries | TCP协议SYN应答报文最大重试次数。 | 5 | -| net.ipv4.tcp_retries2 | 控制内核向已经建立连接的远程主机重新发送数据的次数,低值可以更早的检测到与远程主机失效的连接,因此服务器可以更快的释放该连接。
发生“connection reset by peer”时可以尝试调大该值规避问题。 | 12 | -| vm.overcommit_memory | 控制在做内存分配的时候,内核的检查方式。
- 0:表示系统会尽量精确计算当前可用的内存。
- 1:表示不作检查直接返回成功。
- 2:内存总量×vm.overcommit_ratio/100+SWAP的总量,如果申请空间超过此数值则返回失败。
内核默认是2过于保守,推荐设置为0,如果系统压力大可以设置为1。 | 0 | -| net.ipv4.tcp_rmem | TCP协议接收端缓冲区的可用内存大小。分无压力、有压力、和压力大三个区间,单位为页面。 | 8192 250000 16777216 | -| net.ipv4.tcp_wmem | TCP协议发送端缓冲区的可用内存大小。分无压力、有压力、和压力大三个区间,单位为页面。 | 8192 250000 16777216 | -| net.core.wmem_max | socket发送端缓冲区大小的最大值。 | 21299200 | -| net.core.rmem_max | socket接收端缓冲区大小的最大值。 | 21299200 | -| net.core.wmem_default | socket发送端缓冲区大小的默认值。 | 21299200 | -| net.core.rmem_default | socket接收端缓冲区大小的默认值。 | 21299200 | -| net.ipv4.ip_local_port_range | 物理机可用临时端口范围。 | 26000-65535 | -| kernel.sem | 内核信号量参数设置大小。 | 250 6400000 1000 25600 | -| vm.min_free_kbytes | 保证物理内存有足够空闲空间,防止突发性换页。 | 系统总内存的5% | -| net.core.somaxconn | 定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。 | 65535 | -| net.ipv4.tcp_syncookies | 当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击。
- 0表示关闭SYN Cookies。
- 1表示开启SYN Cookies。 | 1 | -| net.core.netdev_max_backlog | 在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。 | 65535 | -| net.ipv4.tcp_max_syn_backlog | 记录的那些尚未收到客户端确认信息的连接请求的最大值。 | 65535 | -| net.ipv4.tcp_fin_timeout | 系统默认的超时时间。 | 60 | -| kernel.shmall | 内核可用的共享内存总量。 | 1073741824 | -| kernel.shmmax | 内核参数定义单个共享内存段的最大值。 | 4398046511104 | -| net.ipv4.tcp_sack | 启用有选择的应答,通过有选择地应答乱序接受到的报文来提高性能,让发送者只发送丢失的报文段(对于广域网来说)这个选项应该启用,但是会增加对CPU的占用。
- 0表示关闭。
- 1表示开启。 | 1 | -| net.ipv4.tcp_timestamps | TCP时间戳(会在TCP包头增加12节),以一种比重发超时更精确的方式(参考RFC 1323)来启用对RTT的计算,启用可以实现更好的性能。
- 0表示关闭。
- 1表示开启。 | 1 | -| vm.extfrag_threshold | 系统内存不够用时,linux会为当前系统内存碎片情况打分,如果超过vm.extfrag_threshold的值,kswapd就会触发memory compaction。所以这个值设置的接近1000,说明系统在内存碎片的处理倾向于把旧的页换出,以符合申请的需要,而设置接近0,表示系统在内存碎片的处理倾向做memory compaction。 | 500 | -| vm.overcommit_ratio | 系统使用绝不过量使用内存的算法时,系统整个内存地址空间不得超过swap+RAM值的此参数百分比,当vm.overcommit_memory=2时此参数生效。 | 90 | -| MTU | 节点网卡最大传输单元。OS默认值为1500,调整为8192可以提升SCTP协议数据收发的性能。 | 8192 | - -## 文件系统参数 - -- soft nofile - - 说明:soft nofile表示软限制,用户使用的文件句柄数量可以超过该限制,但是如果超过会有告警信息。 - - 推荐取值:1000000 - -- hard nofile - - 说明:hard nofile表示硬限制,是一个严格的限制,用户使用的文件句柄数量一定不能超过该设置。 - - 推荐取值:1000000 - -- stack size - - 说明:线程堆栈大小。 - - 推荐值:3072 - -## 示例 - -执行单项检查结果: - -```bash -perfadm@lfgp000700749:/opt/huawei/perfadm/tool/script> gs_check -i CheckCPU -Parsing the check items config file successfully -Distribute the context file to remote hosts successfully -Start to health check for the cluster. Total Items:1 Nodes:3 - -Checking... [=========================] 1/1 -Start to analysis the check result -CheckCPU....................................OK -The item run on 3 nodes. success: 3 - -Success. All check items run completed. Total:1 Success:1 Failed:0 -For more information please refer to /opt/mogdb/tools/script/gspylib/inspection/output/CheckReport_201902193704661604.tar.gz -``` - -本地执行结果: - -```bash -perfadm@lfgp000700749:/opt/huawei/perfadm/tool/script> gs_check -i CheckCPU -L - -2017-12-29 17:09:29 [NAM] CheckCPU -2017-12-29 17:09:29 [STD] 检查主机CPU占用率,如果idle 大于30%并且iowait 小于 30%.则检查项通过,否则检查项不通过 -2017-12-29 17:09:29 [RST] OK - -2017-12-29 17:09:29 [RAW] -Linux 4.4.21-69-default (lfgp000700749) 12/29/17 _x86_64_ - -17:09:24 CPU %user %nice %system %iowait %steal %idle -17:09:25 all 0.25 0.00 0.25 0.00 0.00 99.50 -17:09:26 all 0.25 0.00 0.13 0.00 0.00 99.62 -17:09:27 all 0.25 0.00 0.25 0.13 0.00 99.37 -17:09:28 all 0.38 0.00 0.25 0.00 0.13 99.25 -17:09:29 all 1.00 0.00 0.88 0.00 0.00 98.12 -Average: all 0.43 0.00 0.35 0.03 0.03 99.17 -``` - -执行场景检查结果: - -```bash -[perfadm@SIA1000131072 Check]$ gs_check -e inspect -Skip CheckHdfsForeignTabEncoding because it only applies to V1R5 upgrade V1R6 with cluster. -Parsing the check items config file successfully -The below items require root privileges to execute:[CheckBlockdev CheckIOConfigure CheckMTU CheckRXTX CheckMultiQueue CheckFirewall CheckSshdService CheckSshdConfig CheckCrondService CheckMaxProcMemory CheckBootItems CheckFilehandle CheckNICModel CheckDropCache] -Please enter root privileges user[root]: -Please enter password for user[root]: -Check root password connection successfully -Distribute the context file to remote hosts successfully -Start to health check for the cluster. Total Items:57 Nodes:3 -Checking... [=========================] 57/57 -Start to analysis the check result -CheckClusterState...........................OK -The item run on 3 nodes. success: 3 -CheckDBParams...............................OK -......................................................................... -CheckMpprcFile..............................OK -The item run on 3 nodes. success: 3 - -Analysis the check result successfully -Failed. All check items run completed. Total:57 Success:49 Warning:5 NG:3 Error:0 -For more information please refer to /opt/huawei/wisequery/script/gspylib/inspection/output/CheckReport_inspect_201902207129254785.tar.gz -``` - -## 相关命令 - -[gs_checkos](2-gs_checkos),[gs_checkperf](3-gs_checkperf) +--- +title: gs_check +summary: gs_check +author: Zhang Cuiping +date: 2021-06-07 +--- + +# gs_check + +## 背景信息 + +gs_check改进增强,统一化当前系统中存在的各种检查工具,例如gs_check,gs_checkos等,帮助用户在MogDB运行过程中,全量的检查MogDB运行环境,操作系统环境,网络环境及数据库执行环境;根据场景scene定义检测项,进行可定制的检测项执行,实现检测结果保存,以及两个检测结果的差异比较;也有助于在MogDB重大操作之前对各类环境进行全面检查,有效保证操作执行成功。 + +## 注意事项 + +- 必须指定-i或-e参数,-i会检查指定的单项,-e会检查对应场景配置中的多项。 +- 如果-i参数中不包含root类检查项或-e场景配置列表中没有root类检查项,则不需要交互输入root权限的用户及其密码。 +- 可使用--skip-root-items跳过检查项中包含的root类检查,以免需要输入root权限用户及密码。 +- MTU值不一致时可能导致检查缓慢或进程停止响应,当巡检工具出现提示时请修改各节点MTU值一致后再进行巡检。 +- 交换机不支持当前设置的MTU值时,即使MTU值一致也会出现通信问题引起进程停止响应,需要根据交换机调整MTU大小。 + +## 语法 + +- 单项检查: + + ```bash + gs_check -i ITEM [...] [-U USER] [-L] [-l LOGFILE] [-o OUTPUTDIR] [--skip-root-items][--set][--routing] + ``` + +- 场景检查: + + ```bash + gs_check -e SCENE_NAME [-U USER] [-L] [-l LOGFILE] [-o OUTPUTDIR] [--skip-root-items] [--time-out=SECS] [--set] [--routing] [--skip-items] + ``` + +- 场景比较: + + ```bash + gs_check --compare --source-output-dir=OUTPUTDIR --target-output-dir=OUTPUTDIR --diff-output-dir=OUTPUTDIR + ``` + +- 显示帮助信息: + + ```bash + gs_check -? | --help + ``` + +- 显示版本号信息: + + ```bash + gs_check -V | --version + ``` + +## 参数说明 + +- -U + + 运行MogDB的用户名称。 + + 取值范围: 运行MogDB的用户名称。 + +- -L + + 本地执行。 + +- -i + + 指定检查项。格式-i CheckXX详细的检查项请参见[MogDB状态检查表](#zhuangtaijiancha)。 + +- -e + + 场景检查项。默认的场景有inspect(例行巡检)、upgrade(升级前巡检)、binary_upgrade(就地升级前巡检)、health(健康检查巡检)、install(安装),等,用户可以根据需求自己编写场景。 + +- -l + + 指定日志文件路径,指定路径时需添加.log后缀。 + +- -o + + 指定检查结果输出文件夹路径。 + +- --skip-root-items + + 跳过需要root权限执行的检查项。 + +- --skip-items + + 跳过指定的检查项。 + +- --format + + 设置结果报告的格式。 + +- --set + + 修复支持设置的Abnormal项。 + +- --cid + + 检查ID,仅被内部check进程使用。 + +- --time-out + + 设置超时时间。单位为秒,默认为1500s,若用户自定义超时时间不得少于1500s。 + +- --routing + + 指定业务IP的网段,格式为IP地址:子网掩码。 + +- --disk-threshold=“PERCENT” + + 检查磁盘占用时可选指定告警阈值,可指定1-99之间的整数,不输入则默认为90。检查其他项时不需要该参数。 + +- -?, --help + + 显示帮助信息。 + +- -V, --version + + 显示版本号信息。 + +- --source-output-dir + + 指定被比较文件(前一次场景检查的结果)路径,需包含文件名。 + +- --target-output-dir + + 指定比较文件(本次场景检查的结果)路径,需包含文件名。 + +- --diff-output-dir + + 指定差异比较结果的输出路径。 + +- --compare + + 如果指定了--compare参数,则表示指定gs_check进行场景比较。 + +### MogDB状态检查表 + +- OS + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
巡检项检查内容是否支持--set
CheckCPU(检查CPU使用率)检查主机CPU占用率,如果idle大于30%并且iowait小于30%。则检查项通过,否则检查项不通过。
CheckFirewall(检查防火墙状态)检查主机防火墙状态,如果防火墙关闭则检查项通过,否则检查项不通过。
CheckTimeZone(检查时区一致性)检查MogDB内各节点时区,如果时区一致则检查通过,否则检查项不通过。
CheckSysParams(检查系统参数) + 检查各节点操作系统参数,判断是否等于预期值。检查项不满足warning域则报warning,不满足NG域则检查项不通过,并打印不满足项。 +
CheckOSVer(检查操作系统版本) + 检查MogDB内各个节点的操作系统版本信息,如果满足版本兼容列表且MogDB在同一混搭列表中则检查通过,否则检查不通过。 +
CheckNTPD(检查NTPD服务) + 检查系统NTPD服务,如果服务开启且各节点时间误差在1分钟以内则检查项通过,否则检查项不通过。 +
CheckTHP(检查THP服务)检查系统THP服务,如果服务开启则检查项通过,否则检查项不通过。
CheckSshdService(检查sshd服务是否已启动)检查系统是否存在sshd服务,若存在则检查项通过,否则检查项不通过。
CheckCrondService(检查crontab服务是否已启动)检查系统是否存在crontab服务,若存在则检查项通过,否则检查项不通过。
CheckCrontabLeft(检查crontab是否有残留Gauss相关信息) + 检查crontab是否残留Gauss相关信息,若无该信息则检查项通过,否则检查项不通过。 +
CheckDirLeft(检查文件目录是否有残留) + 检查文件目录(/opt/enmo/Bigdata/ ,/var/log/Bigdata/, + /home/omm)是否存在,(若mount目录包含此目录则忽略)若不存在则查项通过,否则检查项不通过。 +
CheckProcessLeft(检查进程是否有残留) + 检查是否残留gaussdb和omm进程,若未残留则检查项通过,否则检查项不通过。 +
CheckStack(栈深度检查) + 检查栈深度,若各个节点不一致则报warning + ,若大于等于3072则检查项通过,否则不通过。 +
CheckOmmUserExist(检查omm用户是否存在) + 检查是否存在omm用户,若不存在omm用户则检查项通过,否则检查项不通过。 +
CheckPortConflict(检查数据库节点端口是否占用) + 检查数据库节点端口是否已被占用,若未占用则检查项通过,否则检查项不通过。 +
CheckSysPortRange(检查ip_local_port_range设置范围) + 检查ip_local_port_range系统参数范围,若范围在26000~65535则检查项通过,否则检查项不通过。 +
CheckEtcHosts(检查/etc/hosts中是否有重复地址以及localhost配置) + 检查/etc/hosts没有配置localhost检查项不通过,存在带有#MogDB注释的映射则检查项不通过,相同IP不同hostname则检查项不通过,否则通过,若hostname相同,但ip不同检查项不通过。 +
CheckCpuCount(检查CPU核数) + 检查CPU核心与可用CPU不符检查项不通过,相符但存在不可用信息Warning。 + 所有节点CPU信息不相同检查项不通过。 +
CheckHyperThread(检查超线程是否打开)检查超线程,若打开则检查项通过,否则检查项不通过。
CheckMemInfo(检查内存总大小) + 检查各节点总内存大小是否一致,若检查结果一致,则检查项通过,否则报warning。 +
CheckSshdConfig(检查sshd服务配置是否正确) + 检查/etc/ssh/sshd_config文件,
+ (a)PasswordAuthentication=yes;
+ (b)MaxStartups=1000;
+ (c)UseDNS=no;
+ (d)ClientAliveInterval大于10800或者等于0
+ 配置如上所示则检查项通过,若a、c配置不正确则报warning,b、d配置不正确则检查项不通过。 +
CheckMaxHandle(检查句柄最大设置) + 检查操作系统最大句柄值,如果该值大于等于1000000则检查项通过,否则检查项不通过。 +
CheckKernelVer(检查内核版本) + 检查各节点系统内核版本信息,如果版本信息一致则检查项通过,否则报Warning。 +
CheckEncoding(检查编码格式) + 检查MogDB内各个节点的系统编码,如果编码一致则检查项通过,否则检查项不通过。 +
CheckBootItems(检查启动项)检查是否有手动添加的启动项,如果没有则检查通过,否则检查不通过。
CheckDropCache(检查DropCache进程) + 检查各节点是否有dropcache进程在运行,若有则检查通过,否则检查不通过。 +
CheckFilehandle(检查文件句柄) + 此检查项检查以下两项,两项都通过为通过,否则为不通过:
- + 检查每个gaussdb进程打开的进程数是否超过80万,不超过则检查通过,否则检查不通过。
- + 检查是否有slave进程使用的句柄数超过master进程,如果没有则检查通过,否则检查不通过。 +
CheckKeyProAdj(检查关键进程omm_adj的值) + 检查所有关键进程,如果所有关键进程的omm_adj值为0,则通过,否则不通过。 +
CheckMaxProcMemory(检查max_process_memory参数设置是否合理) + 检查数据库节点的max_process_memory值,判断该参数的值是否大于1G,若不大于则检查项通过,否则检查项不通过。 +
+ +- Device + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
巡检项检查内容是否支持--set
CheckSwapMemory(检查交换内存) + 检查交换内存和总内存大小,若检查结果为0则检查项通过,否则检查项报Warning大于总内存时检查项不通过。 +
CheckLogicalBlock(检查磁盘逻辑块)检查磁盘逻辑块大小,若为512则检查项通过,否则检查项不通过。
CheckIOrequestqueue(检查IO请求)检查IO值,如果该值为32768则检查项通过,否则检查项不通过。
CheckMaxAsyIOrequests(检查最大异步IO请求) + 获取当前异步IO请求值,当前异步IO请求值大于当前节点数据库实例数*1048576和104857600则检查项通过,否则检查项不通过。 +
CheckIOConfigure(检查IO配置)检查IO配置,如果是deadline则检查项通过,否则检查项不通过。
CheckBlockdev(检查磁盘预读块) + 检查磁盘预读块大小,如果预读块大小为16384则检查项通过,否则检查项不通过。 +
CheckDiskFormat(检查磁盘格式参数) + 检查磁盘XFS格式信息,如果配置为'rw,noatime,inode64,allocsize=16m'则检查项通过,否则报warning。 +
CheckInodeUsage(检查磁盘inodes使用率) + MogDB路径(GAUSSHOME/PGHOST/GPHOME/GAUSSLOG/tmp及实例目录)
+ 检查以上指定目录使用率,如果使用率超过warning阈值(默认为60%) + 报warning超过NG阈值(默认为80%)则检查项不通过,否则通过。 +
CheckSpaceUsage(检查磁盘使用率) + MogDB路径(GAUSSHOME/PGHOST/GPHOME/GAUSSLOG/tmp及实例目录)
+ 检查磁盘以上指定目录(目录列表)使用率,如果使用率超过warning阈值(默认为70%) + 报warning超过NG阈值(默认为90%)则检查项不通过。MogDB路径下检查GAUSSHOME/PGHOST/GPHOME/GAUSSLOG/tmp/data路径的剩余空间,不满足阈值则检查项不通过,否则通过。 +
CheckDiskConfig(检查磁盘空间大小一致性)检查磁盘名大小挂载点是否一致,若一致则检查项通过,否则报warning。
CheckXid(检查CheckXid数值)查询xid的数值,如果大于10亿报Warning,大于18亿则检查项不通过。
CheckSysTabSize(检查每个实例的系统表容量) + 如果每一块磁盘的剩余容量大于该磁盘上所有实例的系统表容量总和则检查项通过,否则检查项不通过。 +
+ +- Cluster + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
巡检项检查内容是否支持--set
CheckClusterState(检查MogDB状态) + 检查fencedUDF状态,如果fencedUDF状态为down则报warning;检查MogDB状态,如果MogDB状态为Normal则检查项通过,否则检查项不通过。 +
CheckDBParams(检查MogDB参数) + 检查数据库主节点检查共享缓冲区大小和Sem参数。
+ 数据库节点检查共享缓冲区大小和最大连接数。
共享缓冲区需要大于128KB且大于shmmax且大于shmall*PAGESIZE +
+ 若存在数据库主节点,则Sem值需大于(数据库节点最大连接数+150)/16向上取整。
以上项完全满足则检查项通过,否则检查项不通过。 +
CheckDebugSwitch(检查日志级别) + 在各节点检查各实例的配置文件中log_min_messages参数的值,为空则认为是Warning,判断日志级别非waring,则报warning。 +
CheckUpVer(检查升级版本是否一致) + 检查MogDB各个节点上升级包的版本,如果一致则检查项通过,否则检查项不通过。使用时,需指定升级软件包路径。 +
CheckDirPermissions(检查目录权限) + 检查节点目录(实例Xlog路径、GAUSSHOME、GPHOME、PGHOST、GAUSSLOG)权限,如果目录有写入权限且不大于750则检查项通过,否则检查项不通过。 +
CheckEnvProfile(检查环境变量) + 检查节点环境变量(\$GAUSSHOME、\$LD_LIBRARY_PATH、\$PATH),检查CMS/CMA/数据库节点进程的环境变量。如果环境变量存在并配置正确,进程的环境变量存在则检查项通过,否则检查项不通过。 +
CheckGaussVer(检查gaussdb版本) + 检查各个节点的网卡型号以及驱动版本是否一致,一致则通过,否则报warning。 +
CheckPortRange(检查端口范围) + 若ip_local_port_range的范围在阈值范围内(默认是26000 + 65535),并且实例端口不在ip_local_port_range范围内则检查项通过,否则检查项不通过。 +
CheckReadonlyMode(检查只读模式) + 检查MogDB数据库主节点default_transaction_read_only值若为off则检查通过,否则不通过。 +
CheckCatchup(检查Catchup) + 检查gaussdb进程堆栈是否能搜索到CatchupMain函数,若搜索不到则检查项通过,否则检查项不通过。 +
CheckProcessStatus(检查MogDB进程属主) + 检查 + 'gaussdb'进程属主,若不存在omm以外的属主则检查项通过,否则检查项不通过。 +
CheckSpecialFile(特殊文件检查) + 检查tmp目录(PGHOST)、OM目录(GPHOME)、日志目录(GAUSSLOG)、data目录、程序目录(GAUSSHOME)下文件是否存在特殊字符以及非omm用户的文件,若不存在则检查项通过,否则检查项不通过。 +
CheckCollector(检查MogDB的信息收集) + 在output目录下查看信息收集是否成功,若收集成功则检查项通过,否则检查项不通过。 +
CheckLargeFile(检查数据目录大文件) + 检查各个数据库节点目录是否存在超过4G的文件。任一数据库节点目录及其子目录有超过4G的单个文件,则检查不通过,否则检查通过。 +
CheckProStartTime(关键进程启动时间检测) + 检查关键进程启动时间是否间隔超过5分钟,超过则检查不通过,否则检查通过。 +
CheckDilateSysTab(检查系统表膨胀)检查系统表是否膨胀,若膨胀则不通过,否则检查通过。
CheckMpprcFile(检测环境变量分离文件改动) + 检查是否存在对环境变量分离文件的改动,若存在则检查不通过,否则检查通过。 +
+ +- Database + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
巡检项检查内容是否支持--set
CheckLockNum(检查锁数量)检查数据库锁数量,查询成功检查项通过。
CheckArchiveParameter(检查归档参数) + 检查数据库归档参数,如果未打开或打开且在数据库节点下则检查项通过, + 打开且不在数据库主节点目录下则检查项不通过。 +
CheckCurConnCount(检查当前连接数) + 检查数据库连接数,如果连接数小于最大连接数的90%则检查项通过,否则检查项不通过。 +
CheckCursorNum(检查当前游标数)检查数据库的游标数,检查成功则检查项通过,否则检查项不通过。
+ CheckMaxDatanode(检查comm_max_datanode参数值范围小于数据库节点个数) + + 检查最大数据库节点数,若最大数据库节点数小于xml配置的节点数*数据库节点数(默认值为90*5)报warning,否则检查项通过。 +
CheckPgPreparedXacts(检查残留两阶段事务) + 检查pgxc_prepared_xacts参数,如果不存在二阶段事务则检查项通过,否则检查项不通过。 +
CheckPgxcgroup(检查pgxc_group表中需要重分布的个数) + 检查pgxc_group表中需要重分布的个数,检查结果为0则通过, 否则不通过。 +
CheckLockState(MogDB是否被锁)检查MogDB是否被锁,若MogDB被锁则不通过,否则检查项通过。
CheckIdleSession(检查业务停止)检查非空闲会话数,如果数量为0则检查项通过,否则检查项不通过。
CheckDBConnection(检查数据库连接)检查能否连接数据库,如果连接成功则检查项通过,否则检查项不通过。
CheckGUCValue(GUC参数检查) + 检查(max_connections + max_prepared_transactions) * + max_locks_per_transaction的值,若该值大于等于1000000则检查项通过,否则检查项不通过。 +
CheckPMKData(检查PMK异常数据) + 检查数据库PMK + schema是否包含有异常数据,如果不存在异常数据则检查项通过,否则检查项不通过。 +
CheckSysTable(检查系统表)检查系统表,检查成功则检查项通过。
CheckSysTabSize(检查每个实例的系统表容量) + 如果每一块磁盘的剩余容量大于该磁盘上所有实例的系统表容量总和则检查项通过,否则检查项不通过。 +
CheckTableSpace(检查表空间路径) + 表空间路径和MogDB路径之间不能存在嵌套且表空间路径相互不能存在嵌套,则检查项通过,否则检查项不通过。 +
CheckTableSkew(检查表级别数据倾斜) + 若存在表在MogDB各数据库节点上的数据分布不均衡,且分布数据最多的数据库节点比最低的数据库节点所分布的数据多100000条以上,则检查不通过,否则检查通过。 +
CheckDNSkew(检查数据库节点级别数据分布倾斜) + 检查数据库节点级别的表倾斜数据,若分布数据最高的数据库节点比分布数据最低的数据库节点数据量高于5%,则检查不通过,否则检查通过。 +
CheckUnAnalyzeTable(检查未做analyze的表) + 若存在未做analyze的表,并且表中至少包含一条数据,则检查不通过,否则检查通过。 +
CheckCreateView(创建视图检查) + 创建视图时,如果查询语句中含有子查询,并且子查询结果查询解析和重写之后存在别名重复,检查不通过,否则检查通过。 +
CheckHashIndex(hash index语法检查)如果存在hash index则检查不通过,否则检查通过。
CheckNextvalInDefault(检查Default表达式中包含nextval(sequence)) + 检查Default表达式中是否包含nextval(sequence),若包含则不通过,否则通过。 +
CheckNodeGroupName(Node group编码格式检查) + 存在非SQL_ASCII字符的Node Group名称则检查不通过,不存在则检查通过 。 +
CheckPgxcRedistb(检查重分布残留的临时表 ) + 检查数据库中是否存在重分布残留的临时表,若不存在则检查通过,否则检查不通过 + 。 +
CheckReturnType(用户自定义函数返回值类型检查) + 检查用户自定义函数是否包含非法返回类型,若包含则检查不通过,否则检查通过。 +
CheckSysadminUser(检查sysadmin用户) + 检查除MogDB属主外是否存在数据库管理员用户,若存在则不通过,否则检查通过。 +
CheckTDDate(TD数据库中orc表date类型列检查) + 检查TD模式数据库下的orc表中是否包含date类型的列,若包含检查不通过,否则检查通过。 +
CheckDropColumn(drop column检查)如果存在drop column的表,则检查不通过,否则检查通过。
CheckDiskFailure(检查磁盘故障) + 对MogDB中的所有数据做全量查询,若存在查询错误则检查不通过,否则检查通过。 +
+- Network + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
巡检项检查内容是否支持--set
CheckPing(检查网络通畅) + 检查MogDB内所有节点的互通性,如果各节点所有IP均可ping通则检查项通过,否则检查项不通过。 +
CheckRXTX(检查网卡RXTX值) + 检查节点backIP的RX/TX值,如果该值为4096则检查项通过,否则检查项不通过。 +
CheckMTU(检查网卡MTU值) + 检查节点backIP对应的网卡MTU值( + bond后的物理网卡要确保一致),如果该值不是8192或1500报warning若MogDBMTU值一致则检查项通过,否则检查项不通过。 +
CheckNetWorkDrop(检查网络掉包率) + 检查各IP1分钟内网络掉包率,如果不超过1%则检查项通过,否则检查项不通过。 +
CheckBond(检查网卡绑定模式) + 检查是否有配置BONDING_OPTS或BONDING_MODULE_OPTS,若没有配置则报warning。检查各节点bond模式是否一致,如果同时满足则检查项通过,否则检查项不通过。 +
CheckMultiQueue(检查网卡多队列) + 检查cat + /proc/interrupts,判断是否开启网卡多队列且绑定不同CPU,如果满足则检查项通过,否则检查项不通过。 +
CheckUsedPort(检查随机端口使用数量) + 检查net.ipv4.ip_local_port_range,范围大于等于OS默认值通过(32768-61000); +
检查TCP协议随机端口数,小于总随机端口数的80%通过。 +
CheckNICModel(网卡型号和驱动版本一致性检查) + 检查各个节点的网卡型号以及驱动版本是否一致,一致则通过,否则报warning。 +
CheckRouting(本地路由表检查)检查各节点在业务IP网段的IP个数,超过1个则报warning,否则检查通过。
CheckNetSpeed(检查网卡接收带宽,ping值,丢包率) + 网络满载时,检查网卡平均接收带宽大于600MB通过;
+ 网络满载时,检查网络ping值,小于1秒通过;
+ 网络满载时,检查网卡丢包率,小于1%通过。 +
+ +- Others + + + + + + + + + + + + +
巡检项检查内容是否支持--set
CheckDataDiskUsage(检查数据库节点磁盘空间使用率)检查磁盘数据库节点目录使用率,如果使用率低于90%则检查项通过,否则检查项不通过。
+ +> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** CheckNetSpeed检查项: +> +> - CheckNetSpeed不支持-L本地检查模式,-L模式无法构造网络压力,检查的结果不准确。 +> - 在节点数小于6时,speed_test构造的网络压力可能无法跑满带宽,可能会造成检查结果不准确。 + +## 用户自定义场景 + +1. 以操作系统用户omm登录数据库主节点。 + +2. 在script/gspylib/inspection/config路径下新建场景配置文件scene_XXX.xml。 + +3. 将检查项写进场景配置文件中,书写格式为: + + ```xml + + + + + + + + + ``` + + item name为检查项名称 + + 注意:用户需自行保证自定义xml的正确性 + +4. 在home/package/script/gspylib/inspection/config执行如下命令,将此文件分发至执行检查的各个节点 + + ```bash + scp scene_upgrade.xml SIA1000068994:home/package/script/gspylib/inspection/config/ + ``` + + > ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** home/package/script/gspylib/inspection/config就是新建的场景配置文件的绝对路径。 + +5. 换至omm用户,执行以下命令查看检查结果。 + + ```bash + gs_check -e XXX + ``` + +## **用户自定义检查项** + +1. 新增巡检项配置,修改script/gspylib/inspection/config/items.xml文件,格式如下: + + ```xml + + + <zh>检查CPU占用率</zh> + <en>Check CPU Idle and I/O wait</en> + + + StandardCPUIdle=30; + StandardWIO=30 + + + 如果idle不足 CPU负载过高,请扩容CPU节点,如果iowait过高,则磁盘为瓶颈,更换高性能磁盘 + + + 检查主机CPU占用率,如果idle大于30%并且iowait小于30%,则检查项通过,否则检查项不通过 + + os + user + all + default + + ``` + + - id:巡检项id。 + + - name:巡检项脚本名, 和巡检项脚本文件名相同。 + + - title: 巡检项描述名称 (支持多语言)。 + + zh:中文版检查内容。 + + en:英文版检查内容。 + + - standard:巡检项标准说明(支持多语言)。 + + - suggestion: 巡检项修复建议说明(支持多语言)。 + + - threshold:巡检项阈值定义,多值之间使用分号隔开,示例Key1=Value1;Key2=Value2。 + + - category: 巡检项分类,可选参数:os,device,network,cluster,database,other。 + + - permission: 巡检项需要的执行权限,可选参数:root,user默认为user(普通用户)。 + + - scope:巡检项执行的节点范围,可选参数:cn-仅在数据库主节点执行,local-仅在当前节点执行,all-在MogDB所有节点执行,默认为all。 + + - analysis:巡检项执行结果分析方式,default-检查每个节点的结果,所有节点检查项通过,则最终检查通过,consistent-MogDB内所有节点一致性检查,单节点仅返回结果,各个节点结果一致则判定检查通过,custom-自定义结果分析方式,默认为default。 + + 注:用户需保证自定义xml的正确性 + +2. 新建检查脚本,脚本名称格式遵循CheckXXXX.py,必须以Check开头,脚本放置在script/gspylib/inspection/items目录下,该目录下脚本安装巡检项分类组织,每个分类一个单独的文件夹,巡检项脚本放置在对应的分类文件夹中。格式如下: + + ``` + class CheckCPU(BaseItem): + def __init__(self): + super(CheckCPU, self).__init__(self.__class__.__name__) + self.idle = None + self.wio = None + self.standard = None + + def preCheck(self): + # check the threshold was set correctly + if (not self.threshold.has_key('StandardCPUIdle') + or not self.threshold.has_key('StandardWIO')): + raise Exception("threshold can not be empty") + self.idle = self.threshold['StandardCPUIdle'] + self.wio = self.threshold['StandardWIO'] + + # format the standard by threshold + self.standard = self.standard.format(idle=self.idle, iowait=self.wio) + + def doCheck(self): + cmd = "sar 1 5 2>&1" + output = SharedFuncs.runShellCmd(cmd) + self.result.raw = output + # check the result with threshold + d = next(n.split() for n in output.splitlines() if "Average" in n) + iowait = d[-3] + idle = d[-1] + rst = ResultStatus.OK + vals = [] + if (iowait > self.wio): + rst = ResultStatus.NG + vals.append("The %s actual value %s is greater than expected value %s" % ("IOWait", iowait, self.wio)) + if (idle < self.idle): + rst = ResultStatus.NG + vals.append("The %s actual value %s is less than expected value %s" % ("Idle", idle, self.idle)) + self.result.rst = rst + if (vals): + self.result.val = "\n".join(vals) + ``` + + 所有脚本基于BaseItem基类开发,基类定义的通用的检查流程,通用的检查结果分析方法,默认的结果输出格式。可扩展方法: + + - doCheck: 该方法包含该检查项具体的检查方法,检查结果格式如下: + + result.rst - 检查结果状态,可选参数: + + - OK - 检查项完成,结果通过。 + - NA - 当前节点不涉及该检查项。 + - NG - 检查项完成,结果不通过。 + - WARNING - 检查项完成,结果警告。 + - ERROR - 检查项发生内部错误,未完成检查。 + + - preCheck: 检查前条件判定,内置两种实现:cnPreCheck - 用于检查当前执行节点是否包含数据库主节点实例,localPreCheck - 用于检查当前执行节点是否指定节点。可通过巡检项配置文件中的scope参数进行配置。 可重载该方法实现自定义的前置检查 + + - postAnalysis:检查结果分析方法,内置两种实现:default,consistent。可通过巡检项配置文件中的analysis参数进行配置。可重载该方法实现自定义的结果分析。 + + 注:用户自定义的检查项名称不得与已有检查项名称相同,同时用户需保证自定义检查项脚本的规范性。 + +3. 将此脚本分发至所有的执行节点。 + +4. 以omm用户登录,执行以下命令,查看结果。 + + 本地执行: + + ```bash + gs_check -i CheckXXX -L + ``` + + 非本地执行: + + ```bash + gs_check -i CheckXXX + ``` + +## 操作系统参数 + +**表 2** 操作系统参数 + +| 参数名称 | 参数说明 | 推荐取值 | +| :---------------------------- | :------------------------- | :--------------------- | +| net.ipv4.tcp_max_tw_buckets | 表示同时保持TIME_WAIT状态的TCP/IP连接最大数量。如果超过所配置的取值,TIME_WAIT将立刻被释放并打印警告信息。 | 10000 | +| net.ipv4.tcp_tw_reuse | 允许将TIME-WAIT状态的sockets重新用于新的TCP连接。
- 0表示关闭。
- 1表示开启。 | 1 | +| net.ipv4.tcp_tw_recycle | 表示开启TCP连接中TIME-WAIT状态sockets的快速回收。
- 0表示关闭。
- 1表示开启。 | 1 | +| net.ipv4.tcp_keepalive_time | 表示当keepalive启用的时候,TCP发送keepalive消息的频度。 | 30 | +| net.ipv4.tcp_keepalive_probes | 在认定连接失效之前,发送TCP的keepalive探测包数量。这个值乘以tcp_keepalive_intvl之后决定了一个连接发送了keepalive之后可以有多少时间没有回应。 | 9 | +| net.ipv4.tcp_keepalive_intvl | 当探测没有确认时,重新发送探测的频度。 | 30 | +| net.ipv4.tcp_retries1 | 在连接建立过程中TCP协议最大重试次数。 | 5 | +| net.ipv4.tcp_syn_retries | TCP协议SYN报文最大重试次数。 | 5 | +| net.ipv4.tcp_synack_retries | TCP协议SYN应答报文最大重试次数。 | 5 | +| net.ipv4.tcp_retries2 | 控制内核向已经建立连接的远程主机重新发送数据的次数,低值可以更早的检测到与远程主机失效的连接,因此服务器可以更快的释放该连接。
发生“connection reset by peer”时可以尝试调大该值规避问题。 | 12 | +| vm.overcommit_memory | 控制在做内存分配的时候,内核的检查方式。
- 0:表示系统会尽量精确计算当前可用的内存。
- 1:表示不作检查直接返回成功。
- 2:内存总量×vm.overcommit_ratio/100+SWAP的总量,如果申请空间超过此数值则返回失败。
内核默认是2过于保守,推荐设置为0,如果系统压力大可以设置为1。 | 0 | +| net.ipv4.tcp_rmem | TCP协议接收端缓冲区的可用内存大小。分无压力、有压力、和压力大三个区间,单位为页面。 | 8192 250000 16777216 | +| net.ipv4.tcp_wmem | TCP协议发送端缓冲区的可用内存大小。分无压力、有压力、和压力大三个区间,单位为页面。 | 8192 250000 16777216 | +| net.core.wmem_max | socket发送端缓冲区大小的最大值。 | 21299200 | +| net.core.rmem_max | socket接收端缓冲区大小的最大值。 | 21299200 | +| net.core.wmem_default | socket发送端缓冲区大小的默认值。 | 21299200 | +| net.core.rmem_default | socket接收端缓冲区大小的默认值。 | 21299200 | +| net.ipv4.ip_local_port_range | 物理机可用临时端口范围。 | 26000-65535 | +| kernel.sem | 内核信号量参数设置大小。 | 250 6400000 1000 25600 | +| vm.min_free_kbytes | 保证物理内存有足够空闲空间,防止突发性换页。 | 系统总内存的5% | +| net.core.somaxconn | 定义了系统中每一个端口最大的监听队列的长度,这是个全局的参数。 | 65535 | +| net.ipv4.tcp_syncookies | 当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击。
- 0表示关闭SYN Cookies。
- 1表示开启SYN Cookies。 | 1 | +| net.core.netdev_max_backlog | 在每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目。 | 65535 | +| net.ipv4.tcp_max_syn_backlog | 记录的那些尚未收到客户端确认信息的连接请求的最大值。 | 65535 | +| net.ipv4.tcp_fin_timeout | 系统默认的超时时间。 | 60 | +| kernel.shmall | 内核可用的共享内存总量。 | 1073741824 | +| kernel.shmmax | 内核参数定义单个共享内存段的最大值。 | 4398046511104 | +| net.ipv4.tcp_sack | 启用有选择的应答,通过有选择地应答乱序接受到的报文来提高性能,让发送者只发送丢失的报文段(对于广域网来说)这个选项应该启用,但是会增加对CPU的占用。
- 0表示关闭。
- 1表示开启。 | 1 | +| net.ipv4.tcp_timestamps | TCP时间戳(会在TCP包头增加12节),以一种比重发超时更精确的方式(参考RFC 1323)来启用对RTT的计算,启用可以实现更好的性能。
- 0表示关闭。
- 1表示开启。 | 1 | +| vm.extfrag_threshold | 系统内存不够用时,linux会为当前系统内存碎片情况打分,如果超过vm.extfrag_threshold的值,kswapd就会触发memory compaction。所以这个值设置的接近1000,说明系统在内存碎片的处理倾向于把旧的页换出,以符合申请的需要,而设置接近0,表示系统在内存碎片的处理倾向做memory compaction。 | 500 | +| vm.overcommit_ratio | 系统使用绝不过量使用内存的算法时,系统整个内存地址空间不得超过swap+RAM值的此参数百分比,当vm.overcommit_memory=2时此参数生效。 | 90 | +| MTU | 节点网卡最大传输单元。OS默认值为1500,调整为8192可以提升SCTP协议数据收发的性能。 | 8192 | + +## 文件系统参数 + +- soft nofile + + 说明:soft nofile表示软限制,用户使用的文件句柄数量可以超过该限制,但是如果超过会有告警信息。 + + 推荐取值:1000000 + +- hard nofile + + 说明:hard nofile表示硬限制,是一个严格的限制,用户使用的文件句柄数量一定不能超过该设置。 + + 推荐取值:1000000 + +- stack size + + 说明:线程堆栈大小。 + + 推荐值:3072 + +## 示例 + +执行单项检查结果: + +```bash +omm@:hostname:gs_check -i CheckCPU +Parsing the check items config file successfully +Distribute the context file to remote hosts successfully +Start to health check for the cluster. Total Items:1 Nodes:3 + +Checking... [=========================] 1/1 +Start to analysis the check result +CheckCPU....................................OK +The item run on 3 nodes. success: 3 + +Success. All check items run completed. Total:1 Success:1 Failed:0 +For more information please refer to /opt/mogdb/tools/script/gspylib/inspection/output/CheckReport_201902193704661604.tar.gz +``` + +本地执行结果: + +```bash +omm@:hostname: gs_check -i CheckCPU -L + +2017-12-29 17:09:29 [NAM] CheckCPU +2017-12-29 17:09:29 [STD] 检查主机CPU占用率,如果idle 大于30%并且iowait 小于 30%.则检查项通过,否则检查项不通过 +2017-12-29 17:09:29 [RST] OK + +2017-12-29 17:09:29 [RAW] +Linux 4.4.21-69-default (lfgp000700749) 12/29/17 _x86_64_ + +17:09:24 CPU %user %nice %system %iowait %steal %idle +17:09:25 all 0.25 0.00 0.25 0.00 0.00 99.50 +17:09:26 all 0.25 0.00 0.13 0.00 0.00 99.62 +17:09:27 all 0.25 0.00 0.25 0.13 0.00 99.37 +17:09:28 all 0.38 0.00 0.25 0.00 0.13 99.25 +17:09:29 all 1.00 0.00 0.88 0.00 0.00 98.12 +Average: all 0.43 0.00 0.35 0.03 0.03 99.17 +``` + +执行场景检查结果: + +```bash +omm@:hostname: gs_check -e inspect +Skip CheckHdfsForeignTabEncoding because it only applies to V1R5 upgrade V1R6 with cluster. +Parsing the check items config file successfully +The below items require root privileges to execute:[CheckBlockdev CheckIOConfigure CheckMTU CheckRXTX CheckMultiQueue CheckFirewall CheckSshdService CheckSshdConfig CheckCrondService CheckMaxProcMemory CheckBootItems CheckFilehandle CheckNICModel CheckDropCache] +Please enter root privileges user[root]: +Please enter password for user[root]: +Check root password connection successfully +Distribute the context file to remote hosts successfully +Start to health check for the cluster. Total Items:57 Nodes:3 +Checking... [=========================] 57/57 +Start to analysis the check result +CheckClusterState...........................OK +The item run on 3 nodes. success: 3 +CheckDBParams...............................OK +......................................................................... +CheckMpprcFile..............................OK +The item run on 3 nodes. success: 3 + +Analysis the check result successfully +Failed. All check items run completed. Total:57 Success:49 Warning:5 NG:3 Error:0 +For more information please refer to /opt/enmo/wisequery/script/gspylib/inspection/output/CheckReport_inspect_201902207129254785.tar.gz +``` + +执行场景比较: + +```bash +gs_check --compare --source-output-dir=/data/scene_result/CheckResult_202202044003451613 --target-output-dir=/data/scene_result/CheckResult_202203044003451613 --diff-output-dir=/data/diff_report +``` + +## 相关命令 + +[gs_checkos](2-gs_checkos),[gs_checkperf](3-gs_checkperf) diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/server-tools/gs_gucquery.md b/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/server-tools/gs_gucquery.md new file mode 100644 index 0000000000000000000000000000000000000000..fa62dbfb871b3e5c47519289be47587c3a4771bc --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/server-tools/gs_gucquery.md @@ -0,0 +1,51 @@ +--- +title: gs_gucquery +summary: gs_gucquery +author: Zhang Cuiping +date: 2022-06-22 +--- + +# gs_gucquery + +## 功能介绍 + +gs_gucquery工具可自动收集、整理、导出MogDB GUC值,并进行差异比较。 + +## 语法 + +- 导出GUC值 + + ```bash + gs_gucquery -t query [-o OUTPUTFILE] [-p PORT] + ``` + +- 比较GUC值 + + ```bash + gs_gucquery -t compare --source-file=OUTPUTFILE --target-file=OUTPUTFILE --diff-file=OUTPUTDIR + ``` + +## 参数说明 + +| 参数 | 说明 | +| ------------- | ------------------------------------------------------------ | +| -t | 指定gs_gucquery命令的类型。
取值范围:query或者compare | +| --source-file | 指定被比较文件(前一次GUC值导出的结果)路径,需包含文件名。 | +| --target-file | 指定比较文件(本次GUC值导出的结果)路径,需包含文件名。 | +| --diff-file | 指定差异比较结果的输出路径。 | +| -o | 指定收集GUC值文件的导出路径。
如果不指定-o参数,则会在屏幕上输出结果。 | +| -p | 指定需要导出GUC值所对应MogDB服务器的端口号。 | + +## 示例 + +1. 导出MogDB GUC值 + + ```bash + gs_gucquery -t query -o /data/gucRes + ``` + +2. 比较MogDB GUC值 + + ```bash + gs_gucquery -t compare --source-file=/data/gucRes/GucQuery_20220203091229.csv --target-file /data/gucRes/GucQuery_20220204101330.csv --diff-file /data/gucRes/diffRes + ``` diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/server-tools/gs_watch.md b/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/server-tools/gs_watch.md new file mode 100644 index 0000000000000000000000000000000000000000..2c0b043b841ae29866a857474ccef06e8759d141 --- /dev/null +++ b/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/server-tools/gs_watch.md @@ -0,0 +1,52 @@ +--- +title: gs_watch +summary: gs_watch +author: Zhang Cuiping +date: 2022-06-22 +--- + +# gs_watch + +## 功能介绍 + +gs_watch工具可监测MogDB进程。当gs_watch开启时,MogDB进程发生了故障导致崩溃。gs_watch会自动触发调用gs_collector,对系统状态进行收集。 + +## 语法 + +- 启动自动触发 + + ```bash + gs_watch -t start [-o OUTDIR] [--pid=PID] + ``` + +- 关闭自动触发 + + ```bash + gs_watch -t stop [--pid=PID] + ``` + +## 参数说明 + +| 参数 | 说明 | +| ----- | ------------------------------------------------------------ | +| -t | 指定gs_watch命令的类型。
取值范围:start或者stop | +| -o | 指定系统崩溃时,gs_collector收集结果的导出路径。
注意:gs_collector如果不指定-o参数,则检查结果会默认以压缩包的形式输出到$GAUSSLOG路径中。 | +| --pid | 指定进程ID。
如果启动了多个MogDB进程,需要设置该参数来指定需要watch或停止watch的MogDB进程。否则会报错。 | + +## 示例 + +1. 启动自动触发 + + ```bash + gs_watch -t start -o /opt/mogdb/data --pid 23550 + ``` + +2. 关闭自动触发 + + ```bash + gs_watch -t stop --pid=23550 + ``` + +## 相关命令 + +[gs_collector](4-gs_collector) \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/tools-used-in-the-internal-system/16-gstrace.md b/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/tools-used-in-the-internal-system/16-gstrace.md index b7f7788482b9d73c02f6a1917d35344bb1a7278a..fbd54e964ff10acc491084b0dd6965522312315c 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/tools-used-in-the-internal-system/16-gstrace.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/tools-used-in-the-internal-system/16-gstrace.md @@ -1,98 +1,146 @@ ---- -title: gstrace -summary: gstrace -author: Zhang Cuiping -date: 2021-06-07 ---- - -# gstrace - -## 功能介绍 - -gstrace是MogDB提供的用来跟踪内核代码执行路径、记录内核数据结构、分析代码性能的工具。Trace的有限点位和数据在版本中被固化,无法动态添加和删除。 - -> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-warning.gif) **警告**: -> -> 1. 对内核dump指定内存变量的数据用于诊断分析,不存在直接指定任意寄存器或者内存地址的行为。读取的内存地址均是在开发阶段硬编码,没有任意地读取或者修改寄存器或内存的操作。 -> 2. Trace点可能涉及敏感数据,收集trace信息前需要同用户协商,授权和许可后方可收集。 -> 3. MogDB不会在敏感信息上打点,不会TRACE和用户相关的数据。 -> 4. Trace仅用于诊断目的,开启trace将对性能产生一定影响,影响的大小视负载的高低,trace的模块而不同。 -> 5. Trace工具的权限为0700,仅限于数据库用户读、写和执行。 -> -> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明**: 如果进程异常终止,/dev/shm/ 目录下将会有gstrace_trace_cfg_*残留,可以手动清除。 - -## 语法 - -```bash -gstrace [start|stop|config|dump|detailcodepath|analyze] [-p ][-s ] [-f ] [-o ] [-t ] -``` - -## 参数说明 - -**表 1** gs_trace参数说明 - -| 参数 | 说明 | -| :------------- | :----------------------------------------------------------- | -| start | 开始记录trace。 | -| stop | 停止trace,释放存储信息的共享内存trace buffer。注意:trace buffer中已捕获trace信息会丢失。 | -| config | 显示trace的配置信息。 | -| dump | 将共享内存中的trace信息写入指定文件。若没有启动trace将报错。 | -| detail | 将dump出来的二进制文件解析成文本文件,显示trace点的线程、时间信息。 | -| codepath | 提取dump文件中的函数调用信息,按照调用栈的方式显示。 | -| analyze | 统计各个函数的执行次数、总耗时、平均耗时、最长耗时、最短耗时。 | -| -p PORT | 指定启动trace功能的实例侦听的端口号。 | -| -f DUMP_FILE | 指定dump导出的trace文件。 | -| -o OUTPUT_FILE | 指定写入的文件。 | -| -t STEP_SIZE | 指定分片分析的时间跨度(秒),可选。将生成单独的{OUTPUT_FILE}.step文件。 | -| -m MASK | 指定哪些模块、函数需要追踪,如果参数为空,则追踪添加trace接口的所有模块的所有函数。
格式:[comp…][ALL].[func…][ALL]
描述:
- comp 是模块列表,使用‘,’分隔,例如:executer,mogdb。也可以使用序号,例如:executer,2。
- func 是function列表,使用‘,’ 分隔。 例如:sql_execute_ddl, sql_execute_dcl。也可以使用序号指代模块中第几个function,例如:2。
- 设置成ALL表示所有模块或所有function被trace。
示例:
- executer,mogdb.ALL :所有定义定义在executer和mogdb模块下的function被trace。
- executer,mogdb.sql_execute_ddl :定义在executer 下的Function sql_execute_ddl被trace. mogdb模块被忽略,因为下面没有该function 。
- executer,mogdb.1 :定义在模块executer和mogdb下的第一个function被trace。
ALL.1,2 :定义在所有模块下的第一,二个function被trace。 | -| -s BUFFER_SIZE | 指定用于trace功能的共享内存大小,默认为1G。如果指定的BUFFER_SIZE小于最小值2048,系统将自动调整为最小值。如果指定的BUFFER_SIZE不是2^N^(二的N次方),则向下对齐2^N^;例如:指定BUFFER_SIZE=3072,由于2^11^<3072<2^12^,系统将调整为2048。 | - -## 示例 - -1. 启动trace - - ```bash - gstrace start -p 8000 - ``` - -2. 停止trace - - ```bash - gstrace stop -p 8000 - ``` - -3. 查看trace配置 - - ```bash - gstrace config -p 8000 - ``` - -4. dump trace - - ```bash - gstrace dump -p 8000 -o /data/8000.dump - ``` - -5. 解析dump detail信息 - - ```bash - gstrace detail -f /data/8000.dump -o /data/8000.detail - ``` - -6. 解析dump codepath - - ```bash - gstrace codepath -f /data/8000.dump -o /data/8000.codepath - ``` - -7. 分析全局性能 - - ```bash - gstrace analyze -f /data/8000.dump -o /data/8000.perf - ``` - -8. 分析分片性能 - - ```bash - gstrace analyze -f /data/8000.dump -o /data/8000.perf -t 1 - ``` +--- +title: gstrace +summary: gstrace +author: Zhang Cuiping +date: 2021-06-07 +--- + +# gstrace + +## 功能介绍 + +gstrace是MogDB提供的用来跟踪内核代码执行路径、记录内核数据结构、分析代码性能的工具。gstrace允许用户指定一个或多个模块和函数进行追踪。Trace的有限点位和数据在版本中被固化,无法动态添加和删除。 + +> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-warning.gif) **警告:** +> +> 1. 对内核dump指定内存变量的数据用于诊断分析,不存在直接指定任意寄存器或者内存地址的行为。读取的内存地址均是在开发阶段硬编码,没有任意地读取或者修改寄存器或内存的操作。 +> 2. Trace点可能涉及敏感数据,收集trace信息前需要同用户协商,授权和许可后方可收集。 +> 3. MogDB不会在敏感信息上打点,不会TRACE和用户相关的数据。 +> 4. Trace仅用于诊断目的,开启trace将对性能产生一定影响,影响的大小视负载的高低,trace的模块而不同。 +> 5. Trace工具的权限为0700,仅限于数据库用户读、写和执行。 +> +> ![img](https://cdn-mogdb.enmotech.com/docs-media/icon/icon-note.gif) **说明:** 如果进程异常终止,/dev/shm/ 目录下将会有gstrace_trace_cfg_*残留,可以手动清除。 + +## 语法 + +- 模块开关 + + ```bash + gstrace [start|stop|config|dump|detailcodepath|analyze] [-p ][-s ] [-f ] [-o ] [-t ] [-q ] + ``` + + 注意:由于语法定义中使用了‘,’,‘.’,‘&’作为分隔符,因此定义模块名时不可包括这些符号。除此之外,-q参数不能和原有的内部trace -m参数同时定义,因为两个选项都会影响trace结果,当同时定义时,会返回对应错误信息。 + +- 连接执行状态导出 + + ```bash + gstrace dump_usess -p -o + gstrace analyze_usess -f -o + ``` + +## 参数说明 + +- 模块开关参数 + +| 参数 | 说明 | +| :---------------- | :----------------------------------------------------------- | +| start | 开始记录trace。 | +| stop | 停止trace,释放存储信息的共享内存trace buffer。注意:trace buffer中已捕获trace信息会丢失。 | +| config | 显示trace的配置信息。 | +| dump | 将共享内存中的trace信息写入指定文件。若没有启动trace将报错。 | +| detail | 将dump出来的二进制文件解析成文本文件,显示trace点的线程、时间信息。 | +| codepath | 提取dump文件中的函数调用信息,按照调用栈的方式显示。 | +| analyze | 统计各个函数的执行次数、总耗时、平均耗时、最长耗时、最短耗时。 | +| -p PORT | 指定启动trace功能的实例侦听的端口号。 | +| -f DUMP_FILE | 指定dump导出的trace文件。 | +| -o OUTPUT_FILE | 指定写入的文件。 | +| -t STEP_SIZE | 指定分片分析的时间跨度(秒),可选。将生成单独的{OUTPUT_FILE}.step文件。 | +| -m MASK | 指定哪些模块、函数需要追踪,如果参数为空,则追踪添加trace接口的所有模块的所有函数。
格式:[comp…][ALL].[func…][ALL]
描述:
- comp 是模块列表,使用‘,’分隔,例如:executer,mogdb。也可以使用序号,例如:executer,2。
- func 是function列表,使用‘,’ 分隔。 例如:sql_execute_ddl, sql_execute_dcl。也可以使用序号指代模块中第几个function,例如:2。
- 设置成ALL表示所有模块或所有function被trace。
示例:
- executer,mogdb.ALL :所有定义定义在executer和mogdb模块下的function被trace。
- executer,mogdb.sql_execute_ddl :定义在executer 下的Function sql_execute_ddl被trace. mogdb模块被忽略,因为下面没有该function 。
- executer,mogdb.1 :定义在模块executer和mogdb下的第一个function被trace。
ALL.1,2 :定义在所有模块下的第一,二个function被trace。 | +| -s BUFFER_SIZE | 指定用于trace功能的共享内存大小,默认为1G。如果指定的BUFFER_SIZE小于最小值2048,系统将自动调整为最小值。如果指定的BUFFER_SIZE不是2^N^(二的N次方),则向下对齐2^N^;例如:指定BUFFER_SIZE=3072,由于2^11^<3072<2^12^,系统将调整为2048。 | +| -q COMP_FUNC_PAIR | 指定哪些模块、函数需要追踪。参数不得为空。
使用语法格式及描述:
-> [,]*
COMP\_FUNC_PAIRS由一组及以上的模块与函数组合组成y
-> .
- COMP_FUNC_PAIR代表一组模块与函数组合
- COMP\_NAME 代表一个模块名
-> ALL\|[[&]*]
\- FUNC_NAMES 可由用户指定为ALL 或者一个及以上的函数名。由于FUNC_NAMES一定是与COMP_NAME组合,因此,ALL代表追踪以COMP_NAME为名的模块的所有函数;而如果用户指定的是一个及以上的函数名,则是追踪以COMP_NAME为名的模块中的这几个指定FUNC_NAME对应的函数名
\- FUNC_NAME 代表一个函数
示例:
\- “access.StartTransaction”:追踪一个模块及一个对应函数
\- “executer.ExecutorStart&ExecInitExpr”: 追踪一个模块及多个对应函数
\- “executer.ExecutorStart,tcop.PortalStart&PortalRun”: 追踪多个模块及多个对应函数
\- “executer.ALL,access.ALL”:使用ALL关键字追踪所有executor和access两个模块中的全部函数
注意:如果需要追踪所有模块及函数,不使用-q参数即可。举例:gstrace start -p 8000 | +| COMP_NAME | 使用语法格式及描述:指定模块名称。 | +| FUNC_NAME | -> [,]* 指定函数名称。 | + +- 连接执行状态导出参数 + +| 参数 | 说明 | +| ------------- | ------------------------------------------------------------ | +| dump_usess | 表示导出连接相关状态数据信息。
采用原始二进制格式。 | +| analyze_usess | 表示分析生成可阅读文件。
采用文本可阅读格式。 | +| -p | 指定控制MogDB服务器端口。 | +| -o | 指定输出的文件,可包含路径。输出文件需要不存在,否则报错。 | +| -f | 指定输入的文件,可包含路径。输入文件必须存在且符合格式要求,否则报错。 | + +## 示例 + +1. 启动trace + + ```bash + gstrace start -p 8000 + ``` + +2. 停止trace + + ```bash + gstrace stop -p 8000 + ``` + +3. 查看trace配置 + + ```bash + gstrace config -p 8000 + ``` + +4. dump trace + + ```bash + gstrace dump -p 8000 -o /data/8000.dump + ``` + +5. 解析dump detail信息 + + ```bash + gstrace detail -f /data/8000.dump -o /data/8000.detail + ``` + +6. 解析dump codepath + + ```bash + gstrace codepath -f /data/8000.dump -o /data/8000.codepath + ``` + +7. 分析全局性能 + + ```bash + gstrace analyze -f /data/8000.dump -o /data/8000.perf + ``` + +8. 分析分片性能 + + ```bash + gstrace analyze -f /data/8000.dump -o /data/8000.perf -t 1 + ``` + +9. 跟踪executer模块的全部函数 + + ```bash + gstrace start -p 7654 -q executer.ALL + ``` + +10. 跟踪rewrite模块中的全部函数以及optimizer模块的create_plan()和query_planner()函数 + + ```bash + gstrace start -p 7654 -q "rewrite.ALL,optimizer.create_plan&query_planner" + ``` + +11. 导出获得二进制user_session文件 + + ```bash + gstrace dump_usess -p 7654 -o /home/mogdbuser/dump1.bin + ``` + +12. 创建可阅读json版本的user_session信息文件 + + ```bash + gstrace analyze_usess -f /home/mogdbuser/dump1.bin -o /home/mogdbuser/analyze1.json + ``` \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/unified-database-management-tool.md b/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/unified-database-management-tool.md index baa120832d70e430b25dd183bc9474e0cc4991e0..c11a3854d1e85faf0d844ce1e8ace839071153c1 100644 --- a/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/unified-database-management-tool.md +++ b/product/zh/docs-mogdb/v3.0/reference-guide/tool-reference/unified-database-management-tool.md @@ -9,7 +9,7 @@ date: 2022-06-08 CM(Cluster Manager)是一款数据库管理模块。支持自定义资源监控,提供了数据库主备的状态监控、网络通信故障监控、文件系统故障监控、故障自动主备切换等能力。提供了丰富的数据库管理能力,如节点、实例级的启停,数据库实例状态查询、主备切换、日志管理等。 -需要注意的是,一主一备模式下,CM只支持基本的安装,启停,检测能力,其他功能不支持。 +需要注意的是:一主一备模式下,CM只支持基本的安装,启停,检测能力,其他功能不支持。 ## 特性介绍 @@ -137,7 +137,7 @@ cm_ctl的相关约束: | 参数 | 参数说明 | | :------------- | :----------------------------------------------------------- | | start | 一主多备数据库部署模式下启动数据库实例服务、单个主机上的所有实例或单独启动某个节点实例进程,或者直接启动整个AZ。 | -| switchover | 一主多备数据库部署模式下切换数据库主备实例,dcf模式下只支持-n NODEID -D DATADIR。 | +| switchover | 一主多备数据库部署模式下切换数据库主备实例,dcf模式下只支持-n NODEID -D DATADIR。 | | finishredo | 所有备机停止回放,每个分片中选择一个强制升主。
注意:该参数属于高风险操作,请谨慎执行。 | | build | 重建备实例。 | | check | 检测实例进程运行状态,用户无需关注,不建议使用。 | @@ -223,7 +223,7 @@ cm_ctl的相关约束: | --log_level=LOG_LEVEL | 设置主cm_server日志级别。共分为DEBUG5、DEBUG1、WARNING、LOG、ERROR和FATAL六个级别,日志打印信息级别越来越高。设置日志级别越高,输出日志信息就越少。 | | --cm_arbitration_mode=ARBITRATION_MODE | 一主多备功能,设置cm_server的仲裁模式。共有MAJORITY、MINORITY两种模式,MAJORITY为多数派模式,MINORITY为少数派模式。MogDB不支持少数派,此参数可以设置成MINORITY,但不会生效。 | | --cm_switchover_az_mode=SWITCHOVER_AZ_MODE | 一主多备功能,设置AZ之间的自动切换开关。共有NON_AUTO、AUTO两种模式,NON_AUTO为非自动切换模式,AUTO为自动切换模式。AUTO模式由主cm_server自动控制AZ1和AZ2之间的节点实例切换。 | -| --cmsPromoteMode=CMS_PROMOTE_MODE -I INSTANCEID | 设置cm_server的升主方式,共有AUTO、PRIMARY_F两种模式,AUTO为默认自选主方式,PRIMARY_F会强制使-I指定的节点升主,无论当前是否有主,因此,有可能会导致cms存在多主情况。 | +| --cmsPromoteMode=CMS_PROMOTE_MODE -I INSTANCEID | 设置cm_server的升主方式,共有AUTO、PRIMARY_F两种模式,AUTO为默认自选主方式,PRIMARY_F会强制使-I指定的节点升主,无论当前是否有主,因此,有可能会导致cms存在多主情况。 | **表 9** set cm参数 diff --git a/product/zh/docs-mogdb/v3.0/toc.md b/product/zh/docs-mogdb/v3.0/toc.md index 853e99d8e5946c8541cbfdcd957bb54823ef75f5..36224cdb8fda29b92513a655317890e888b9918d 100644 --- a/product/zh/docs-mogdb/v3.0/toc.md +++ b/product/zh/docs-mogdb/v3.0/toc.md @@ -16,6 +16,7 @@ + [wal2json](/about-mogdb/open-source-components/5-wal2json-extention-for-mogdb&opengauss.md) + [mog_filedump](/about-mogdb/open-source-components/mog_filedump.md) + [mog_xlogdump](/about-mogdb/open-source-components/mog_xlogdump.md) + + [PostGIS](/about-mogdb/open-source-components/PostGIS.md) + [使用限制](/about-mogdb/usage-limitations.md) + [法律声明](/about-mogdb/terms-of-use.md) + 快速入门 @@ -77,6 +78,7 @@ + [慢SQL诊断](/characteristic-description/maintainability/3-slow-sql-diagnosis.md) + [Session性能诊断](/characteristic-description/maintainability/4-session-performance-diagnosis.md) + [系统KPI辅助诊断](/characteristic-description/maintainability/5-system-kpi-aided-diagnosis.md) + + [故障诊断](/characteristic-description/maintainability/fault-diagnosis.md) + 数据库安全 + [访问控制模型](/characteristic-description/database-security/1-access-control-model.md) + [控制权和访问权分离](/characteristic-description/database-security/2-separation-of-control-and-access-permissions.md) @@ -111,11 +113,21 @@ + [发布订阅](/characteristic-description/enterprise-level-features/16-publication-subscription.md) + [外键锁增强](/characteristic-description/enterprise-level-features/17-foreign-key-lock-enhancement.md) + [支持OLTP场景数据压缩](/characteristic-description/enterprise-level-features/18-data-compression-in-oltp-scenarios.md) + + [事务异步提交](/characteristic-description/enterprise-level-features/19-transaction-async-submit.md) + + [索引创建并行控制](/characteristic-description/enterprise-level-features/23-index-creation-parallel-control.md) + + [动态分区裁剪](/characteristic-description/enterprise-level-features/21-dynamic-partition-pruning.md) + + [COPY导入优化](/characteristic-description/enterprise-level-features/20-copy-import-optimization.md) + + [SQL运行时状态观测](/characteristic-description/enterprise-level-features/22-sql-running-status-observation.md) + + [BRIN索引](/characteristic-description/enterprise-level-features/24-brin-index.md) + + [BLOOM索引](/characteristic-description/enterprise-level-features/25-bloom-index.md) + + [后台压缩](/characteristic-description/enterprise-level-features/26-backend-compression.md) + 应用开发接口 + [支持标准SQL](/characteristic-description/application-development-interfaces/1-standard-sql.md) + [支持标准开发接口](/characteristic-description/application-development-interfaces/2-standard-development-interfaces.md) + [PG接口兼容](/characteristic-description/application-development-interfaces/3-postgresql-api-compatibility.md) + [支持PL/Java](/characteristic-description/application-development-interfaces/4-pl-java.md) + + [Oracle兼容增强](/characteristic-description/application-development-interfaces/MogDB-Oracle-compatibility.md) + + [MySQL兼容增强](/characteristic-description/application-development-interfaces/MogDB-MySQL-compatibility.md) + AI能力 + AI4DB:数据库自治运维 + [数据库指标采集、预测与异常监控](/characteristic-description/ai-capabilities/ai4db-autonomous-database-o-m/1-database-metric-collection-forecast-and-exception-detection.md) @@ -218,7 +230,7 @@ + [升级指南](/administrator-guide/upgrade-guide.md) + AI特性指南 + [AI特性概述](/AI-features/1-AI-features-overview.md) - + [AI4DB:据库自治运维](/AI-features/ai4db/ai4db-autonomous-database-o&m.md) + + [AI4DB:数据库自治运维](/AI-features/ai4db/ai4db-autonomous-database-o&m.md) + [DBMind模式说明](/AI-features/ai4db/dbmind-mode/dbmind-mode.md) + [service子命令](/AI-features/ai4db/dbmind-mode/1-service.md) + [component子命令](/AI-features/ai4db/dbmind-mode/2-component.md) @@ -486,6 +498,17 @@ + [启动资源负载管理功能](/developer-guide/resource-load-management/resource-management-preparation/enabling-resource-load-management.md) + [设置控制组](/developer-guide/resource-load-management/resource-management-preparation/setting-a-cgroup.md) + [创建资源池](/developer-guide/resource-load-management/resource-management-preparation/creating-a-resource-pool.md) + + 分区管理 + + 分区裁剪 + + [分区裁剪的好处](/developer-guide/partition-management/partition-pruning/benefits-of-partition-pruning.md) + + [可用于分区裁剪的信息](/developer-guide/partition-management/partition-pruning/information-that-can-be-used-for-partition-pruning.md) + + [如何确定是否使用了分区裁剪](/developer-guide/partition-management/partition-pruning/how-to-identify-whether-partition-pruning-has-been-used.md) + + [静态分区裁剪](/developer-guide/partition-management/partition-pruning/static-partition-pruning.md) + + [动态分区裁剪](/developer-guide/partition-management/partition-pruning/dynamic-partition-pruning.md) + + 选择分区策略的建议 + + [何时使用范围分区](/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-range-partitioning.md) + + [何时使用列表分区](/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-list-partitioning.md) + + [何时使用哈希分区](/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-hash-partitioning.md) + 性能优化指南 + 系统优化指南 + [操作系统参数调优](/performance-tuning/1-system/1-optimizing-os-parameters.md) @@ -626,6 +649,7 @@ + [GS_AUDITING](./reference-guide/system-catalogs-and-system-views/system-views/GS_AUDITING.md) + [GS_AUDITING_ACCESS](./reference-guide/system-catalogs-and-system-views/system-views/GS_AUDITING_ACCESS.md) + [GS_AUDITING_PRIVILEGE](./reference-guide/system-catalogs-and-system-views/system-views/GS_AUDITING_PRIVILEGE.md) + + [GS_ASYNC_SUBMIT_SESSIONS_STATUS](./reference-guide/system-catalogs-and-system-views/system-views/GS_ASYNC_SUBMIT_SESSIONS_STATUS.md) + [GS_CLUSTER_RESOURCE_INFO](./reference-guide/system-catalogs-and-system-views/system-views/GS_CLUSTER_RESOURCE_INFO.md) + [GS_DB_PRIVILEGES](./reference-guide/system-catalogs-and-system-views/system-views/GS_DB_PRIVILEGES.md) + [GS_FILE_STAT](./reference-guide/system-catalogs-and-system-views/system-views/GS_FILE_STAT.md) @@ -1129,6 +1153,7 @@ + CM相关参数 + [cm_agent参数](/reference-guide/guc-parameters/cm-parameters/cm_agent.md) + [cm_server参数](/reference-guide/guc-parameters/cm-parameters/cm_server.md) + + [SQL模式](/reference-guide/guc-parameters/SQL-mode.md) + [升级参数](/reference-guide/guc-parameters/23-upgrade-parameters.md) + [其他选项](/reference-guide/guc-parameters/24-miscellaneous-parameters.md) + [等待事件](/reference-guide/guc-parameters/25-wait-events.md) @@ -1403,11 +1428,13 @@ + [gs_dump](/reference-guide/tool-reference/server-tools/5-gs_dump.md) + [gs_dumpall](/reference-guide/tool-reference/server-tools/6-gs_dumpall.md) + [gs_guc](/reference-guide/tool-reference/server-tools/7-gs_guc.md) + + [gs_gucquery](/reference-guide/tool-reference/server-tools/7-gs_gucquery.md) + [gs_encrypt](/reference-guide/tool-reference/server-tools/7.1-gs_encrypt.md) + [gs_om](/reference-guide/tool-reference/server-tools/8-gs_om.md) + [gs_plan_simulator](/reference-guide/tool-reference/server-tools/8.1-gs_plan_simulator.md) + [gs_restore](/reference-guide/tool-reference/server-tools/9-gs_restore.md) + [gs_ssh](/reference-guide/tool-reference/server-tools/10-gs_ssh.md) + + [gs_watch](/reference-guide/tool-reference/server-tools/gs_watch.md) + 系统内部使用的工具 + [gaussdb](/reference-guide/tool-reference/tools-used-in-the-internal-system/1-gaussdb.md) + [gs_backup](/reference-guide/tool-reference/tools-used-in-the-internal-system/2-gs_backup.md) diff --git a/product/zh/docs-mogdb/v3.0/toc_about.md b/product/zh/docs-mogdb/v3.0/toc_about.md index 0a78ef87f94083e526596c7f5c5bd82e074c4072..5e32d3e6ee8aeec4bca71ae7d2ff26189ee1ffe6 100644 --- a/product/zh/docs-mogdb/v3.0/toc_about.md +++ b/product/zh/docs-mogdb/v3.0/toc_about.md @@ -15,5 +15,6 @@ + [wal2json](/about-mogdb/open-source-components/5-wal2json-extention-for-mogdb&opengauss.md) + [mog_filedump](/about-mogdb/open-source-components/mog_filedump.md) + [mog_xlogdump](/about-mogdb/open-source-components/mog_xlogdump.md) + + [PostGIS](/about-mogdb/open-source-components/PostGIS.md) + [使用限制](/about-mogdb/usage-limitations.md) + [法律声明](/about-mogdb/terms-of-use.md) diff --git a/product/zh/docs-mogdb/v3.0/toc_characteristic_description.md b/product/zh/docs-mogdb/v3.0/toc_characteristic_description.md index ad0c5c3973ab446e4a2fe8c0127a577c25cff5f0..d7febcb9d5ae0a127033d2f81ca330cd3923824d 100644 --- a/product/zh/docs-mogdb/v3.0/toc_characteristic_description.md +++ b/product/zh/docs-mogdb/v3.0/toc_characteristic_description.md @@ -41,6 +41,7 @@ + [慢SQL诊断](/characteristic-description/maintainability/3-slow-sql-diagnosis.md) + [Session性能诊断](/characteristic-description/maintainability/4-session-performance-diagnosis.md) + [系统KPI辅助诊断](/characteristic-description/maintainability/5-system-kpi-aided-diagnosis.md) + + [故障诊断](/characteristic-description/maintainability/fault-diagnosis.md) + 数据库安全 + [访问控制模型](/characteristic-description/database-security/1-access-control-model.md) + [控制权和访问权分离](/characteristic-description/database-security/2-separation-of-control-and-access-permissions.md) @@ -75,11 +76,21 @@ + [发布订阅](/characteristic-description/enterprise-level-features/16-publication-subscription.md) + [外键锁增强](/characteristic-description/enterprise-level-features/17-foreign-key-lock-enhancement.md) + [支持OLTP场景数据压缩](/characteristic-description/enterprise-level-features/18-data-compression-in-oltp-scenarios.md) + + [事务异步提交](/characteristic-description/enterprise-level-features/19-transaction-async-submit.md) + + [索引创建并行控制](/characteristic-description/enterprise-level-features/23-index-creation-parallel-control.md) + + [动态分区裁剪](/characteristic-description/enterprise-level-features/21-dynamic-partition-pruning.md) + + [COPY导入优化](/characteristic-description/enterprise-level-features/20-copy-import-optimization.md) + + [SQL运行时状态观测](/characteristic-description/enterprise-level-features/22-sql-running-status-observation.md) + + [BRIN索引](/characteristic-description/enterprise-level-features/24-brin-index.md) + + [BLOOM索引](/characteristic-description/enterprise-level-features/25-bloom-index.md) + + [后台压缩](/characteristic-description/enterprise-level-features/26-backend-compression.md) + 应用开发接口 + [支持标准SQL](/characteristic-description/application-development-interfaces/1-standard-sql.md) + [支持标准开发接口](/characteristic-description/application-development-interfaces/2-standard-development-interfaces.md) + [PG接口兼容](/characteristic-description/application-development-interfaces/3-postgresql-api-compatibility.md) + [支持PL/Java](/characteristic-description/application-development-interfaces/4-pl-java.md) + + [Oracle兼容增强](/characteristic-description/application-development-interfaces/MogDB-Oracle-compatibility.md) + + [MySQL兼容增强](/characteristic-description/application-development-interfaces/MogDB-MySQL-compatibility.md) + AI能力 + AI4DB:数据库自治运维 + [数据库指标采集、预测与异常监控](/characteristic-description/ai-capabilities/ai4db-autonomous-database-o-m/1-database-metric-collection-forecast-and-exception-detection.md) diff --git a/product/zh/docs-mogdb/v3.0/toc_dev.md b/product/zh/docs-mogdb/v3.0/toc_dev.md index 63865c4ab7b583509fc3c011a37147974851abfa..06844187c433c61f51b913c5faa79c55045b0a0e 100644 --- a/product/zh/docs-mogdb/v3.0/toc_dev.md +++ b/product/zh/docs-mogdb/v3.0/toc_dev.md @@ -206,3 +206,14 @@ + [启动资源负载管理功能](/developer-guide/resource-load-management/resource-management-preparation/enabling-resource-load-management.md) + [设置控制组](/developer-guide/resource-load-management/resource-management-preparation/setting-a-cgroup.md) + [创建资源池](/developer-guide/resource-load-management/resource-management-preparation/creating-a-resource-pool.md) ++ 分区管理 + + 分区裁剪 + + [分区裁剪的好处](/developer-guide/partition-management/partition-pruning/benefits-of-partition-pruning.md) + + [可用于分区裁剪的信息](/developer-guide/partition-management/partition-pruning/information-that-can-be-used-for-partition-pruning.md) + + [如何确定是否使用了分区裁剪](/developer-guide/partition-management/partition-pruning/how-to-identify-whether-partition-pruning-has-been-used.md) + + [静态分区裁剪](/developer-guide/partition-management/partition-pruning/static-partition-pruning.md) + + [动态分区裁剪](/developer-guide/partition-management/partition-pruning/dynamic-partition-pruning.md) + + 选择分区策略的建议 + + [何时使用范围分区](/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-range-partitioning.md) + + [何时使用列表分区](/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-list-partitioning.md) + + [何时使用哈希分区](/developer-guide/partition-management/recommendations-for-choosing-a-partitioning-strategy/when-to-use-hash-partitioning.md) \ No newline at end of file diff --git a/product/zh/docs-mogdb/v3.0/toc_parameters-and-tools.md b/product/zh/docs-mogdb/v3.0/toc_parameters-and-tools.md index 4d583014ce2869f2bbd20cd147bb9bc1ee6917a3..a8d2b2dcdbbfe76de26984437703e147ecd735a9 100644 --- a/product/zh/docs-mogdb/v3.0/toc_parameters-and-tools.md +++ b/product/zh/docs-mogdb/v3.0/toc_parameters-and-tools.md @@ -66,6 +66,7 @@ + CM相关参数 + [cm_agent参数](/reference-guide/guc-parameters/cm-parameters/cm_agent.md) + [cm_server参数](/reference-guide/guc-parameters/cm-parameters/cm_server.md) + + [SQL模式](/reference-guide/guc-parameters/SQL-mode.md) + [升级参数](./reference-guide/guc-parameters/23-upgrade-parameters.md) + [其他选项](./reference-guide/guc-parameters/24-miscellaneous-parameters.md) + [等待事件](./reference-guide/guc-parameters/25-wait-events.md) @@ -340,11 +341,13 @@ + [gs_dump](./reference-guide/tool-reference/server-tools/5-gs_dump.md) + [gs_dumpall](./reference-guide/tool-reference/server-tools/6-gs_dumpall.md) + [gs_guc](./reference-guide/tool-reference/server-tools/7-gs_guc.md) + + [gs_gucquery](/reference-guide/tool-reference/server-tools/7-gs_gucquery.md) + [gs_encrypt](./reference-guide/tool-reference/server-tools/7.1-gs_encrypt.md) + [gs_om](./reference-guide/tool-reference/server-tools/8-gs_om.md) + [gs_plan_simulator](./reference-guide/tool-reference/server-tools/8.1-gs_plan_simulator.md) + [gs_restore](./reference-guide/tool-reference/server-tools/9-gs_restore.md) + [gs_ssh](./reference-guide/tool-reference/server-tools/10-gs_ssh.md) + + [gs_watch](/reference-guide/tool-reference/server-tools/gs_watch.md) + 系统内部使用的工具 + [gaussdb](./reference-guide/tool-reference/tools-used-in-the-internal-system/1-gaussdb.md) + [gs_backup](./reference-guide/tool-reference/tools-used-in-the-internal-system/2-gs_backup.md) diff --git a/product/zh/docs-mogdb/v3.0/toc_system-catalogs-and-functions.md b/product/zh/docs-mogdb/v3.0/toc_system-catalogs-and-functions.md index 8f6d1765e6da2c8aa80730995ec26d76fb041823..82df63370bb57f3c6fab3820c99cd1753d2fe609 100644 --- a/product/zh/docs-mogdb/v3.0/toc_system-catalogs-and-functions.md +++ b/product/zh/docs-mogdb/v3.0/toc_system-catalogs-and-functions.md @@ -123,6 +123,7 @@ + [GS_AUDITING](./reference-guide/system-catalogs-and-system-views/system-views/GS_AUDITING.md) + [GS_AUDITING_ACCESS](./reference-guide/system-catalogs-and-system-views/system-views/GS_AUDITING_ACCESS.md) + [GS_AUDITING_PRIVILEGE](./reference-guide/system-catalogs-and-system-views/system-views/GS_AUDITING_PRIVILEGE.md) + + [GS_ASYNC_SUBMIT_SESSIONS_STATUS](./reference-guide/system-catalogs-and-system-views/system-views/GS_ASYNC_SUBMIT_SESSIONS_STATUS.md) + [GS_CLUSTER_RESOURCE_INFO](./reference-guide/system-catalogs-and-system-views/system-views/GS_CLUSTER_RESOURCE_INFO.md) + [GS_DB_PRIVILEGES](./reference-guide/system-catalogs-and-system-views/system-views/GS_DB_PRIVILEGES.md) + [GS_FILE_STAT](./reference-guide/system-catalogs-and-system-views/system-views/GS_FILE_STAT.md)