返回首页

gbase数据、南大通用产品文档:GBase8aIN 改写为EXISTS(NOT IN => NOT EXISTS)

更新日期:2024年09月11日

GCluster 8a MPP Cluster 自动将所有带IN (subquery)的语句都被优化成了EXISTS
(rewrited-subquery)的语句,从而提高性能。
1.
优化特性:

IN 转成EXISTS:对单列及多列的IN 子查询语句均可转换成EXISTS。
示例:
原语句:
SELECT s1, s2 FROM t1 WHERE s2 IN (SELECT s1 FROM t1);
优化后:
(t1.s2,(select 1 AS Not_used FROM t1 WHERE ((t1.s2) =
t1.s1)

NOT IN 转成NOT EXISTS:与IN 转EXISTS 同理。
2.
优化限制:

IN 子查询中带LIMIT/UNION(…)/OLAP/GROUP 的语句不能优化;

支持多列In 子查询的语句,如果有非列名,如(a, 10) IN (SELECT a, 10 …)
则不能优化。
3.
优化参数:
_gbase_optimizer_in_subselect 控制是否使用优化,默认为开启。

GBase 8a MPP Cluster 产品手册
5 数据库管理指南
文档版本953(2022-09-15)
南大通用数据技术股份有限公司
1322
配置文件中
_gbase_optimizer_in_subselect= 1
或Client 中
Set _gbase_optimizer_in_subselect= 1。

本节描述了客户端函数的语法,它们的输入/输出参数,返回值和 SQL_BIGINT。

语法说明
该方法是在用户创建表时,可以同时创建全文索引,需要使用FULLTEXT 关键字进
行创建。
语法格式

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 925
CREATE TABLE table_name (
column defination… ,
fulltext [index] index_name (column_name)
[INDEX_DATA_PATH='path']);
参数说明

table_name:表名。

index_name:索引名(索引名表级唯一, 索引名将不区分大小写)。

column_name:索引列列名,支持CHAR、VARCHAR 或TEXT 类型。

INDEX_DATA_PATH:可选项,设置索引数据路径标志。如不填写,则索引数
据保存在默认路径上。

path:索引数据存放路径,此路径应为实际已存在的路径。
示例
示例1:不指定索引数据存放路径时,存放在默认路径中。
gbase> DROP TABLE IF EXISTS sms;
Query OK, 0 rows affected
gbase> CREATE TABLE sms (MB_No char(11),MB_Text varchar(1000) DEFAULT NULL,
FULLTEXT idx_t (MB_Text));
Query OK, 0 rows affected
示例2:
为索引数据指定存放路径,
步骤如下
(以使用gbase 用户登录数据库为例)



步骤1
gbase 用户对存放索引数据的文件夹有读写权限,可以使用root 用户执行如下
命令为gbase 用户赋权:
# chown gbase:gbase /home

步骤2
在每个节点上都要创建存放索引数据的文件夹。
# su gbase
$ mkdir fti

步骤3

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 926
将索引数据存放在/home/fti/路径下。
gbase> CREATE TABLE text1 (col1 varchar(100), FULLTEXT INDEX fti_col1 (col1)
INDEX_DATA_PATH='/home/fti/');
Query OK, 0 rows affected
示例3:指定的索引数据路径不存在,系统报告错误信息。
gbase> CREATE TABLE text1 (col1 varchar(100), FULLTEXT INDEX fti_col1 (col1)
INDEX_DATA_PATH='/index/dat/');
ERROR 1733 (HY000): (GBA-01EX-700) GBase general error: Empty or invalid index path