GBase 8a 可能有效的OR优化

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: GBase 8a 可能有效的OR优化

业务SQL中包含OR, 如果发现性能对比没有这个OR下降极大,可以考虑本文介绍的OR优化试试。包括在过滤条件里的OR以及JOIN条件里的OR两种情况。

所有改写都是在默认执行计划的优化效果不好时,看看这个手工指定的优化是否更好一些。性能是否提高以及最终结果是否正确,都建议多加验证。

过滤条件
分为两种情况,同一个列不同的值,以及不同的列不同的值(前者算后者的特殊情况,但更常见。核心就是手工将多个OR判断,改成1个判断。

A=XX OR A=YY 以及 A in (XX,YY)的写法
改写成适合数字的写法
decode(A,XX,XX,YY,XX,'')=XX
也就是把YY值改成XX,变成都判断等值XX

改成case的写法,适合字符

case A when XX then XX when YY then XX end)=XX
gbase> select * from t3 where id=1 or id=11;
+------+------+
| id | id2 |
+------+------+
| 1 | 1 |
| 11 | 11 |
+------+------+
2 rows in set (Elapsed: 00:00:00.07)

gbase> select * from t3 where decode(id,1,1,11,1)=1;
+------+------+
| id | id2 |
+------+------+
| 1 | 1 |
| 11 | 11 |
+------+------+
2 rows in set (Elapsed: 00:00:00.08)
A=XX OR B=YY or C=ZZ
改写成

concat(case when a=XX then XX else '' end,case when B=YY then XX else '' end,case when C=ZZ then XX else '' end) like 'XX%'
其中的XX,YY可以是相同值或者不同值。 核心也是将多个OR判断,改成1个判断。

gbase> select * from t3 where id=111 or id2=9999;
+------+------+
| id | id2 |
+------+------+
| 111 | 1111 |
+------+------+
1 row in set (Elapsed: 00:00:00.04)

gbase> select * from t3 where concat(case when id=111 then 111 else '' end,case when id2=9999 then 111 else '' end) like '111%';
+------+------+
| id | id2 |
+------+------+
| 111 | 1111 |
+------+------+
1 row in set (Elapsed: 00:00:00.09)
JOIN条件 要求结果集没有膨胀
如下的JOIN里,OR条件

select b.XX from a
left join b on (a.id=b.id or a.name=b.name) and ...其它join条件
改写成2个join

select coalesce(b.XX,b2.XX) from a
left join b on a.id=b.id and …其它join条件
left join b b2 on a.id<>b2.id and a.name=b2.name and …其它join条件
要求结果集没有膨胀,比如a表1万行,结果集依然是左表的1万行。也就是1对1的场景,右表不能出现重复值,导致左表膨胀。
否则因左表出现重复,1:n,导致改写后的方案结果集行数少了。

而select部分用到b表的列,需要根据b和b2的列进行选择,比如b.XX 变成 coalesce(b.XX,b2.XX)

gbase> select * from t1;
+------+------+
| id | id2 |
+------+------+
| 1 | 66 |
| 2 | 77 |
+------+------+
2 rows in set (Elapsed: 00:00:00.06)

gbase> select * from t3;
+------+------+
| id | id2 |
+------+------+
| 1 | 66 |
| 3 | 77 |
| 9 | 99 |
+------+------+
3 rows in set (Elapsed: 00:00:00.09)

gbase> select * from t1 left join t3 on t1.id=t3.id or t1.id2=t3.id2;
+------+------+------+------+
| id | id2 | id | id2 |
+------+------+------+------+
| 1 | 66 | 1 | 66 |
| 2 | 77 | 3 | 77 |
+------+------+------+------+
2 rows in set (Elapsed: 00:00:00.28)

gbase> select * from t1 left join t3 on t1.id=t3.id left join t3 t3_2 on t1.id<>t3_2.id and t1.id2=t3_2.id2;
+------+------+------+------+------+------+
| id | id2 | id | id2 | id | id2 |
+------+------+------+------+------+------+
| 2 | 77 | NULL | NULL | 3 | 77 |
| 1 | 66 | 1 | 66 | NULL | NULL |
+------+------+------+------+------+------+
2 rows in set (Elapsed: 00:00:00.28)

gbase> select t1.id,t1.id2,coalesce(t3.id,t3_2.id)id,coalesce(t3.id2,t3_2.id2)id2 from t1 left join t3 on t1.id=t3.id left join t3 t3_2 on t1.id<>t3_2.id and t1.id2=t3_2.id2;
+------+------+------+------+
| id | id2 | id | id2 |
+------+------+------+------+
| 2 | 77 | 3 | 77 |
| 1 | 66 | 1 | 66 |
+------+------+------+------+
2 rows in set (Elapsed: 00:00:00.16)
总结
本文的OR优化,都趋向于手工调整执行计划,特别是过滤条件。 而JOIN的OR优化,必须保证1:1,不能是1:n。否则结果集可能是错的

相关文章
|
2月前
|
SQL 数据挖掘 测试技术
南大通用GBase8s数据库:LISTAGG函数的解析
南大通用GBase8s数据库:LISTAGG函数的解析
|
1月前
|
SQL 运维 监控
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
南大通用GBase 8a MPP Cluster Linux端SQL进程监控工具
|
1月前
|
存储 索引
GBase 8a集群视图使用限制
GBase 8a集群视图使用限制
|
1月前
|
SQL 索引
GBase 8a 智能索引工作原理
GBase 8a 智能索引工作原理
|
2月前
|
存储 数据库
快速搭建南大通用GBase 8s数据库SSC共享存储集群
本文介绍如何GBase8s 数据库 在单机环境中快速部署SSC共享存储集群,涵盖准备工作、安装数据库、创建环境变量文件、准备数据存储目录、修改sqlhost、设置onconfig、搭建sds集群及集群检查等步骤,助你轻松完成集群功能验证。
|
2月前
|
SQL 安全 数据库
南大通用GBase 8s 查看用户权限查询指南
本文详细介绍了南大通用GBase 8s数据库中用户权限的查看与管理方法,涵盖数据库级别和表级别权限的定义、查看及赋权操作,以及相关系统表的使用,旨在帮助数据库管理员有效维护数据访问安全。
|
2月前
|
存储 缓存 网络安全
南大通用GBase 8s 数据库 RHAC集群基本原理和搭建步骤
南大通用GBase 8s 数据库 RHAC集群基本原理和搭建步骤
|
2月前
|
数据库连接 Linux Shell
Linux下ODBC与 南大通用GBase 8s数据库的无缝连接配置指南
本文详细介绍在Linux系统下配置GBase 8s数据库ODBC的过程,涵盖环境变量设置、ODBC配置文件编辑及连接测试等步骤。首先配置数据库环境变量如GBASEDBTDIR、PATH等,接着修改odbcinst.ini和odbc.ini文件,指定驱动路径、数据库名称等信息,最后通过catalog.c工具或isql命令验证ODBC连接是否成功。
|
2月前
|
存储 机器学习/深度学习 监控
南大通用GBase 8s数据库onbar基础使用教程
数据备份与恢复是确保数据安全和业务连续性的关键。onbar作为GBase 8s数据库的备份工具,需配合存储管理器使用,通过配置BAR_BSALIB_PATH等参数,实现数据的备份与恢复。本文详细介绍了onbar的配置、备份、恢复及监控流程,帮助数据库管理员构建高效的数据保护方案。
|
2月前
|
存储 SQL Oracle
南大通用GBase 8s数据库的WITH FUNCTION语句详解
南大通用GBase 8s数据库的WITH FUNCTION语句详解