达梦clob字段查询优化
达梦clob字段查询优化
准备测试环境
创建测试表
CREATE TABLE user_info (
uid VARCHAR(50) PRIMARY KEY,
name VARCHAR(100) NOT NULL,
oid CLOB
)
生成10万条记录
查询方式
Like查询方式
select * from "SYSDBA"."USER_INFO" WHERE OID LIKE 'AZCONGaT%';
从查询结果和执行计划可以看到,先是表扫返回了10万条记录,这样查询耗时80毫秒。
正则表达式
select * from "SYSDBA"."USER_INFO" WHERE REGEXP_LIKE(OID,'AZCONGaT');
从查询结果和执行计划可以看到,同样是先走表扫返回结果集10万,但是后面的结果集为5k,所以耗时更长,607毫秒。
创建全文索引
-- 创建全文索引(事务同步)
CREATE CONTEXT INDEX idx_uinfo_oid ON USER_INFO(OID)
LEXER DEFAULT_LEXER
SYNC TRANSACTION;
更新全文索引(完全更新)
alter context index idx_uinfo_oid on USER_INFO rebuild;
执行查询
从查询结果和执行计划可以看到,走全文索引的代价较低,耗时2毫秒。
另外,全文索引不支持模糊查询,如*、%等
验证未更新全文索引的查询
insert into "SYSDBA"."USER_INFO"("UID", "NAME", "OID")
VALUES('xxxxx', '测试', 'ABCDBHBJBKBKANHS');
可以看到查询通过走全文索引,但是没有返回结果
更新全文索引(增量更新)
再次查询
更新索引之后,可以通过全文索引查询返回正确的结果。
总结
对于Clob等类型的字段,可通过创建全文索引提高查询效率。
但是需要注意全文索引的维护,比如全文索引的更新,若新数据插入后没有更新全文索引则将无法通过该索引查询到新数据,全文索引的更新包括两种方式:完全更新(代价较大)和增量更新(代价较小)。
更多详细资料可前往达梦社区:https://eco.dameng.com