[转帖]KingbaseES不同字符类型比较转换规则

kingbasees,不同,字符,类型,比较,转换规则 · 浏览次数 : 0

小编点评

**示例测试** ```sql -- test_char_bind_text SELECT test_varchar_bind_text('123456'); -- test_text_bind_char SELECT test_text_bind_char('123456'); -- test_varchar_bind_text SELECT test_varchar_bind_text('123456'); -- test_text_bind_varchar SELECT test_text_bind_varchar('123456'); ``` **测试结果** ``` -- test_char_bind_text 123456 -- test_text_bind_char 123456 -- test_varchar_bind_text 123456 -- test_text_bind_varchar 123456 ``` **注意** * 以上示例仅用于测试 KingbaseES V8R6 版本。 * 测试结果可能因版本和硬件而不同。

正文

https://www.cnblogs.com/kingbase/p/14798059.html

 

Postgresql 常用的字符数据类型的有char、varchar和text,其中 char 固定长度类型, varchar 和 text 是可变长度类型。这三种类型在进行比较时,会进行隐含的类型转换。这种转换会导致索引可能无法使用,影响SQL的执行计划。以下以例子的形式展示Postgresql 不同字符数据类型间的转换规则。

一、创建测试数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
create table test_char(id char(9),desc_info text);
create table test_varchar(id varchar(9),desc_info text);
create table test_text(id text,desc_info text);
insert into test_char select generate_series(100001,200000),repeat('a',100);
insert into test_varchar select generate_series(100001,200000),repeat('a',100);
insert into test_text select generate_series(100001,200000),repeat('a',100);
create index ind_test_char on test_char(id);
create index ind_test_varchar on test_varchar(id);
create index ind_test_text on test_text(id);
analyze test_char;
analyze test_varchar;
analyze test_text;

二、创建SQL游标

1
2
3
4
5
6
7
8
prepare test_char_bind_varchar(varcharas select from test_char where id=$1;
prepare test_char_bind_text(text) as select from test_char where id=$1;
prepare test_varchar_bind_char(charas select from test_varchar where id=$1;
prepare test_text_bind_char(charas select from test_text where id=$1;
prepare test_varchar_bind_text(text) as select from test_varchar where id=$1;
prepare test_text_bind_varchar(varcharas select from test_text where id=$1;

三、Postgresql字符类型的隐含转换规则

1、对于 varchar 与 char 比较,默认是 varchar 转成 char。

例子2,由于等式左边发生了类型转换,无法使用索引。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
例子1:
testdb=# explain execute test_char_bind_varchar('123456');
                                   QUERY PLAN                                   
---------------------------------------------------------------------------------
 Index Scan using ind_test_char on test_char  (cost=0.42..8.44 rows=1 width=111)
   Index Cond: (id = '123456'::bpchar)
(2 rows)
例子2:等式左边发生类型转换,无法使用索引
testdb=# explain execute test_varchar_bind_char('123456');
                           QUERY PLAN                           
-----------------------------------------------------------------
 Seq Scan on test_varchar  (cost=0.00..2975.00 rows=1 width=108)
   Filter: ((id)::bpchar = '123456'::bpchar)
(2 rows)

2、对于 text 与 char 比较,默认是 char 转成 text 。

例子3,由于等式左边发生了类型转换,无法使用索引。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
例子3:等式左边发生类型转换,无法使用索引。
testdb=# explain execute test_char_bind_text('123456');
                           QUERY PLAN                          
----------------------------------------------------------------
 Seq Scan on test_char  (cost=0.00..3225.00 rows=500 width=111)
   Filter: ((id)::text = '123456'::text)
(2 rows)
例子4:
testdb=# explain execute test_text_bind_char('123456');
                                   QUERY PLAN                                   
---------------------------------------------------------------------------------
 Index Scan using ind_test_text on test_text  (cost=0.29..8.31 rows=1 width=108)
   Index Cond: (id = '123456'::text)
(2 rows)

3、对于 varchar 与 text 比较,默认是 varchar 转成 text ,但二者的转换不影响索引的使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
testdb=# explain execute test_varchar_bind_text('123456');
                                      QUERY PLAN                                      
---------------------------------------------------------------------------------------
 Index Scan using ind_test_varchar on test_varchar  (cost=0.29..8.31 rows=1 width=108)
   Index Cond: ((id)::text = '123456'::text)
(2 rows)
testdb=# explain execute test_text_bind_varchar('123456');
                                   QUERY PLAN                                   
---------------------------------------------------------------------------------
 Index Scan using ind_test_text on test_text  (cost=0.29..8.31 rows=1 width=108)
   Index Cond: (id = '123456'::text)
(2 rows)

PG 字符类型数据转换规则:varchar -> char -> text

四、KingbaseES 类型转换及优化

用过Oracle的人都知道,char与varchar 之间的比较不会因为类型不同而无法使用索引,Kingbase在特性上向Oracle靠拢,为用户从Oracle向KingbaseES迁移提供便利。KingbaseES 继承Postgresql 的特性,同时通过代码的优化,避免了char与varchar和text之间比较导致的转换而无法使用索引的情况。以下的例子在KingbaseES V8R6 版本进行过实际验证。

1、对于 varchar 与 char 比较,同样是 varchar 转成 char。

kingbase 针对这个问题,进行了特殊的优化处理,即使等式左边的varchar发生了类型转换,也不影响索引的使用,如:例子6。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
例子5:
testdb=# explain execute test_char_bind_varchar('123456');
                                   QUERY PLAN                                   
---------------------------------------------------------------------------------
 Index Scan using ind_test_char on test_char  (cost=0.42..8.44 rows=1 width=111)
   Index Cond: (id = '123456'::bpchar)
(2 rows)
例子6:不会因为等式左边发生类型转换而无法使用索引。
testdb=# explain execute test_varchar_bind_char('123456');
                                      QUERY PLAN                                      
---------------------------------------------------------------------------------------
 Index Scan using ind_test_varchar on test_varchar  (cost=0.29..8.31 rows=1 width=108)
   Index Cond: ((id)::text = '123456'::text)
(2 rows)

2、对于 text 与 char 比较,kingbase 进行了特殊的优化处理,使得转换发生在等式的右边,不影响索引的使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
例子7:
testdb=# explain execute test_char_bind_text('123456');
                                   QUERY PLAN                                   
---------------------------------------------------------------------------------
 Index Scan using ind_test_char on test_char  (cost=0.42..8.44 rows=1 width=111)
   Index Cond: (id = '123456'::bpchar)
(2 rows)
例子8:
testdb=# explain execute test_text_bind_char('123456');
                                   QUERY PLAN                                   
---------------------------------------------------------------------------------
 Index Scan using ind_test_text on test_text  (cost=0.29..8.31 rows=1 width=108)
   Index Cond: (id = '123456'::text)
(2 rows)

3、对于 varchar 与 text 比较,默认是 varchar 转成 text 。与PG一样,二者的转换不影响索引的使用。

1
2
3
4
5
6
7
8
9
10
11
12
13
test=# explain execute test_varchar_bind_text('123456');
                                      QUERY PLAN                                      
---------------------------------------------------------------------------------------
 Index Scan using ind_test_varchar on test_varchar  (cost=0.29..8.31 rows=1 width=108)
   Index Cond: ((id)::text = '123456'::text)
(2 rows)
test=# explain execute test_text_bind_varchar('123456');
                                   QUERY PLAN                                   
---------------------------------------------------------------------------------
 Index Scan using ind_test_text on test_text  (cost=0.29..8.31 rows=1 width=108)
   Index Cond: (id = '123456'::text)
(2 rows)

 

Tips:以上例子是基于Postgresql 12.3 和 KingbaseES V8R6版本测试的结果。

与[转帖]KingbaseES不同字符类型比较转换规则相似的内容:

[转帖]KingbaseES不同字符类型比较转换规则

https://www.cnblogs.com/kingbase/p/14798059.html Postgresql 常用的字符数据类型的有char、varchar和text,其中 char 固定长度类型, varchar 和 text 是可变长度类型。这三种类型在进行比较时,会进行隐含的类型转换

[转帖]金仓数据库KingbaseES V8R6 索引膨胀

索引膨胀 对于索引,随着业务不断的增删改,会造成膨胀,尤其Btree索引,也会涉及索引分裂、合并等,导致索引访问效率降低、维护成本增加。另外,索引页的复用与HEAP PAGE不一样,因为索引的内容是有序结构,只有符合顺序的ITEM才能插入对应的PAGE中,不像HEAP TUPLE,只要有空间就可以插

[转帖]金仓数据库KingbaseES V8R6 中unlogged表

KingbaseESV8R6有一种表称为unlogged,在该表新建的索引也属于unlogged。和普通表的区别是,对该表进行DML操作时候不将该表的变更记录变更写入到wal文件中。在数据库异常关机或者异常崩溃后该表的数据会被truncate掉,但是在写入性能上会比普通表快几倍。 这个特性类似于or

[转帖]5.2. 使用HINT

¶ 本章节包含以下内容: 概述 HINT的功能 HINT的使用 配置参数 示例 注意 5.2.1. 概述 ¶ KingbaseES使用的是基于成本的优化器。优化器会估计SQL语句的每个可能的执行计划的成本,然后选择成本最低的执行计划来执行。因为优化器不计算数据的某些属性,比如列之间的相关性,优化器有

[转帖]KingbaseES和Oracle数据类型的映射表

随着数据库国产化的进程,Oracle向KingbaseES数据库的数据迁移需求也越来越多。数据库之间数据迁移的时候,首先遇到的,并且也是最重要的,就是数据类型之间的转换。 下表为KingbaseES和Oracle数据类型的映射表: Oracle数据类型 KingbaseES 数据类型 备注说明(Or

[转帖]KingbaseES 事务总结

目录 1. 什么是事务? 2. 事务的属性-ACID 3. 数据库事务的操作方式 3.1. SET TRANSACTION 3.2. BEGIN 3.3. COMMIT 3.4. ROLLBACK 3.5. SAVEPOINT 3.6. ROLLBACK TO SAVEPOINT 4. 事务的并发控

[转帖]KingbaseES V8R6 中walminer的使用

https://www.cnblogs.com/kingbase/p/17315750.html 前言 walminer工具可以帮助dba挖掘wal日志中的内容,看到某时间对应数据库中的具体操作。例如挖掘日志后可以看到数据库某时间有哪些dml语句。 walminer的限制与约束 WalMiner工具

[转帖]KingbaseES wal(xlog) 日志清理故障恢复案例

https://www.cnblogs.com/kingbase/p/16266365.html 案例说明:在通过sys_archivecleanup工具手工清理wal日志时,在control文件中查询的检查点对应的wal日志是“000000010000000000000008”,但是在执行清理时,

[转帖]【KingbaseES】sys_dump逻辑备份工具详解

KingbaseES逻辑备份还原工具提供了数据库对象一级的联机备份还原功能,备份对象包括: 数据库 模式 表 视图 约束 权限 触发器 函数 序列 逻辑备份的输出格式包括: 二进制 SQL脚本 此外,针对表数据,还支持多种格式的导出: CSV JSON HTML 从而帮助用户可灵活调整、实施数据的备

[转帖]KingbaseES 服务器运行参数分类

https://www.cnblogs.com/kingbase/p/16969149.html Kingbase 服务器运行参数分类 说明: KingbaseES 数据库中,服务器运行参数分为多种类型,有些是系统初始化时设置,有些可以在系统运行时设置,有些可以在运行session中进行直接设置。下