KingbaseES Query Mapping 查询映射功能
有过SQL优化经历的人都知道,对于有些SQL性能问题,可能需要涉及到SQL层面的修改,这不仅麻烦,而且在已上线的系统还存在很大的风险。KingbaseES V8R6 提供了query mapping功能,用户可以通过SQL映射,可以避免直接修改SQL的过程。
以下以举例介绍query mapping 的功能及使用。
一、设置功能开关参数
query mapping 功能开启与否,是通过参数 enable_query_rule 控制的。设置 enable_query_rule = on ,开启query mapping功能。
二、使用例子
1、准备数据
create table t1(id integer,name varchar(9));
insert into t1 select generate_series(1,1000000),'a'||generate_series(1000001,2000000);
create index ind_t1_name on t1(name);
create view v_t1 as select id,upper(name) name from t1;
例子建了个视图,视图对于索引列做了upper操作。upper 操作使得原有的索引无法使用。
2、Mapping前SQL 执行计划分析
假设应用有这么一条SQL : select id from v_t1 where name=$1; 可以看下执行计划:由于做了upper转换,无法使用索引。
test=# explain select id from v_t1 where name='A1234567';
QUERY PLAN
--------------------------------------------------------------------------------------------
Seq Scan on t1 (cost=0.00..22906.00 rows=5000 width=4)
Filter: (((upper((name)::text))::character varying(8000 char))::text = 'A1234567'::text)
如果需要使用索引,只能修改SQL,直接查询表。可以看下执行计划:索引访问
test=# explain select id from t1 where name=lower('A1234567');
QUERY PLAN
----------------------------------------------------------------------
Index Scan using ind_t1_name on t1 (cost=0.42..8.44 rows=1 width=4)
Index Cond: ((name)::text = 'a1234567'::text)
3、创建Query Mapping
像以上例子,可能修改SQL是不现实的,或是很麻烦的。有没有能不修改SQL,并且能快速解决问题的方法?KingbaseES Query Mapping 就是为实现该功能而量身定做的优化技术。
#创建SQL映射关系
select create_query_rule('qm1','select id from v_t1 where name=$1;','select id from t1 where name=lower($1);', true, 'text');
select create_query_rule('qm2','select id from v_t1 where name=$1;','select id from t1 where name=lower($1);', true, 'semantics');
#删除映射关系
select drop_query_rule('qm1');
在创建mapping时,有两种模式:
- text在语法词法解析之前做的转化,字符串匹配,执行快。
- semantics是转化为查询树之后再做转化,会进行语法检查,区分不同schema。对于过程或者匿名块内部的SQL,需要使用这种模式。优化器首先对匿名块作词法语法解析,然后执行的时候发现是查询的查询树,会先进行替换,生成执行计划。
可以查看sys_query_mapping,确认系统创建了哪些query mapping。
4、Mapping后执行计划
查询视图 v_t1 也可以使用到索引。
test=# explain (usingquerymapping, analyze) select id from v_t1 where name='A1234567';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Index Scan using ind_t1_name on t1 (cost=0.42..8.44 rows=1 width=4) (actual time=0.018..0.019 rows=1 loops=1)
Index Cond: ((name)::text = 'a1234567'::text)
Planning Time: 0.067 ms
Execution Time: 0.035 ms
(4 rows)
注意 usingquerymapping 不能少。
再看下不使用 (usingquerymapping, analyze) 情况下的执行计划:显示的是映射前的执行计划。
test=# explain select id from v_t1 where name='A1234567';
QUERY PLAN
--------------------------------------------------------------------------------------------
Seq Scan on t1 (cost=0.00..22906.00 rows=5000 width=4)
Filter: (((upper((name)::text))::character varying(8000 char))::text = 'A1234567'::text)
(2 rows)
4、如何确认Query Mapping是否有效?
如何确认SQL :select id from v_t1 where name=$1 是否会进行转换了?可以通过查询 sys_stat_statements 确认实际执行的SQL。
test=# select id from v_t1 where name='A1234567';
id
--------
234567
(1 row) test=# select id from v_t1 where name='A1234567';
id
--------
234567
(1 row) test=# select id from v_t1 where name='A1234567';
id
--------
234567
(1 row) test=# select query,calls from sys_stat_statements where query like '%lower%';
query | calls
----------------------------------------+-------
select id from t1 where name=lower($1) | 3
(1 row)
可以看出SQL映射是生效的。
三、Query Mapping对于性能影响
Query Mapping 在生成执行计划时,必须先读取sys_query_mapping,不可避免对于性能有一定影响。以下的例子可以看到,query mapping 还是会有20%左右的性能影响。
test=# declare
test-# v_temp integer;
test-# v_val text;
test-# begin
test-# for i in 1000001..2010000 loop
test-# execute 'select id from t1 where name=$1' into v_temp using 'a'||i;
test-# end loop;
test-# end;
test-# /
Time: 102585.759 ms (01:42.586) test=# declare
test-# v_temp integer;
test-# v_val text;
test-# begin
test-# for i in 1000001..2010000 loop
test-# execute 'select id from v_t1 where name=$1' into v_temp using 'A'||i;
test-# end loop;
test-# end;
test-# /
Time: 128438.435 ms (02:08.438)
四、使用注意
query mapping 要求大小写严格一致。
--表名 大小写不一致,无法使用query mapping
test=# explain (usingquerymapping, analyze) select id from V_T1 where name='A1234567';
QUERY PLAN
------------------------------------------------------------------------------------------------------
Seq Scan on t1 (cost=0.00..22906.00 rows=5000 width=4) (actual time=99.525..407.516 rows=1 loops=1)
Filter: (((upper((name)::text))::character varying(8000 char))::text = 'A1234567'::text)
Rows Removed by Filter: 999999
Planning Time: 0.448 ms
Execution Time: 407.542 ms
(5 rows)
--空格后面不一致,不影响 query mapping使用
test=# explain (usingquerymapping, analyze) select id from v_t1 where name='A1234567';
QUERY PLAN
----------------------------------------------------------------------------------------------------------------
Index Scan using ind_t1_name on t1 (cost=0.42..8.44 rows=1 width=4) (actual time=0.022..0.022 rows=1 loops=1)
Index Cond: ((name)::text = 'a1234567'::text)
Planning Time: 0.062 ms
Execution Time: 0.036 ms
(4 rows)
--FROM 大小写不一致,无法使用query mapping
test=# explain (usingquerymapping, analyze) select id From v_t1 where name='A1234567';
QUERY PLAN
------------------------------------------------------------------------------------------------------
Seq Scan on t1 (cost=0.00..22906.00 rows=5000 width=4) (actual time=98.008..417.077 rows=1 loops=1)
Filter: (((upper((name)::text))::character varying(8000 char))::text = 'A1234567'::text)
Rows Removed by Filter: 999999
Planning Time: 0.159 ms
Execution Time: 417.097 ms
(5 rows)
KingbaseES Query Mapping 查询映射功能的更多相关文章
- Hibernate Query Language查询:
Hibernate Query Language查询: Criteria查询对查询条件进行了面向对象封装,符合编程人员的思维方式,不过HQL(Hibernate Query Language)查询提供 ...
- HoloLens开发手记 - Unity之Spatial mapping 空间映射
本文主要讨论如何在Unity项目中集成空间映射功能.Unity内置了对空间映射功能的支持,通过以下两种方式提供给开发者: HoloToolkit项目中你可以找到空间映射组件,这可以让你便捷快速地开始使 ...
- MVC5搜索/查询 流程功能的实现
接着上次的篇幅,我们这篇手动来写一个查询的流程代码! 搜索/查询 流程功能的实现 那现在要做搜索(查询)功能我们第一步应该做什么呢!第一次是不是我们应该去Controller(控制器)里去搞一个搜索 ...
- MySQL中间件之ProxySQL(9):ProxySQL的查询缓存功能
返回ProxySQL系列文章:http://www.cnblogs.com/f-ck-need-u/p/7586194.html ProxySQL支持查询缓存的功能,可以将后端返回的结果集缓存在自己的 ...
- mysql慢查询日志功能的使用
作用:mysql慢查询日志可监控有效率问题的SQL .. 一.开启mysql慢查询日志功能 1.查看是否开启 未使用索引的SQL记录日志查询 mysql> show variables like ...
- Elasticsearch Query DSL查询入门
本篇为学习DSL时做的笔记,适合ES新手,大佬请略过~ Query DSL又叫查询表达式,是一种非常灵活又富有表现力的查询语言,采用JSON接口的方式实现丰富的查询,并使你的查询语句更灵活.更精确.更 ...
- 【Spring Data 系列学习】Spring Data JPA @Query 注解查询
[Spring Data 系列学习]Spring Data JPA @Query 注解查询 前面的章节讲述了 Spring Data Jpa 通过声明式对数据库进行操作,上手速度快简单易操作.但同时 ...
- ProxySQL(9):ProxySQL的查询缓存功能
文章转载自: https://www.cnblogs.com/f-ck-need-u/p/9314459.html ProxySQL支持查询缓存的功能,可以将后端返回的结果集缓存在自己的内存中,在某查 ...
- 关于SubSonic3.0插件使用SubSonic.Query.Select查询时,字段类型为tinyint时列丢失问题的Bug修复
下午在写代码时,突然发现一个列名为Enable的字段怎么也查询不出来,开始以为可能这个名称是关键字,所以给过滤掉了,所以就将名称修改为IsEnable,问题还是一样......将名称又改为IsEnab ...
随机推荐
- 一次 MySQL 误操作导致的事故,「高可用」都顶不住了!
这是悟空的第 152 篇原创文章 官网:www.passjava.cn 你好,我是悟空. 上次我们项目不是把 MySQL 高可用部署好了么,MySQL 双主模式 + Keepalived,来保证高可用 ...
- SAP 实例 1 Images in HTML
REPORT zharpo_010 NO STANDARD PAGE HEADING. TABLES : t001. TYPE-POOLS: slis. DATA : w_repid LIKE sy- ...
- 疫情在校学生之——用python对某校园热水服务app进行测试,实现自动免费用水(仅供参考)
写在前面的过场话: 本文只是对某校园热水服务app做个测试,其实本人并没有做大坏事,并未传播相关技术,文章以下内容的敏感部分会打码,并且相关厂商已经正在进行漏洞修复,大家看看就好.文章后会提供&quo ...
- 方法引用(Method References)
* 方法引用的使用 * * 1.使用情境:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用! * * 2.方法引用,本质上就是Lambda表达式,而Lambda表达式作为函数式接口 ...
- nginx服务器配置传递给下一层的信息的一些参数-设置哪些跨域的域名可访问
http { server_tokens off; #隐藏nginx版本 proxy_headers_hash_max_size 51200; proxy_headers_hash_bucket_si ...
- BUCK 电路PSIM仿真模型搭建之一 (PI模块稳定性分析)
1. 利用PI 模块仿真BUCK 电路电流环 在调制通道上未加入延迟环节时,无论KP, KI 参数如何调整系统都是稳定的 仿真结果: 在调制通道上引入 一个开关周期的延迟 系统出现明显的震荡情况,说 ...
- golang面试-代码编写题1-14
目录 1.代码编写题--统计文本行数-bufio 2.代码编写题--多协程收集错误信息-channel 3.代码编写题--超时控制,内存泄露 4.代码编写题--单例模式 5.代码编写题--九九乘法表 ...
- 翟佳:高可用、强一致、低延迟——BookKeeper的存储实现
分享嘉宾:翟佳 StreamNative 联合创始人 编辑整理:张晓伟 美团点评 出品平台:DataFunTalk 导读:多数读者们了解BookKeeper是通过Pulsar,实际上BookKeepe ...
- gotoscan:CMS指纹识别工具
gotoscan 前言 项目地址 https://github.com/newbe3three/gotoscan 结合自己学习到的Go相关知识,通过实现这个简易的CMS指纹识别工具来锻炼一下自己写代码 ...
- 8000字讲透OBSA原理与应用实践
摘要:OBSA项目是围绕OBS建立的大数据和AI生态,其在不断的发展和完善中,目前有如下子项目:hadoop-obs项目和flink-obs项目. 文章作者:存储服务产品部开发者支持团队 OBS存储服 ...