首页 > 数据库 >条件中in值过多导致的慢SQL问题

条件中in值过多导致的慢SQL问题

时间:2024-08-08 16:08:32浏览次数:8  
标签:TMP 语句 导致 常量 值过 SQL INLIST id

在前段时间的项目中,出现了一个很典型的查询优化问题。在此跟大家分享问题分析及解决方法。

此例中SQL文本大小达1.8MB,如下:

这是一个多表连接的比较复杂的视图,SQL的过滤条件里id列 “in” 了几万个常量(红框部分)。这条语句第一次执行需要12秒,第二次执行时间为毫秒级。

原因分析                             

上述两次执行时间的差别,说明该语句执行时间主要消耗在SQL硬解析上。由于项目中相关功能的并发量较大,这条慢SQL引发了严重的性能问题。

这个问题比较普遍。主要原因是开发人员图简单,对“in”列表里常量的个数没有评估。常量动辄数万,甚至数十万,这种SQL在并发量较大的情况下就是灾难。

 

优化思路

1. 创建一个事务级的临时表

CREATE GLOBAL TEMPORARY TABLE TMP_INLIST(    ID VARCHAR(100)) ON COMMIT DELETE ROWS;

2. 将需要参与过滤的常量值插入临时表
--addBatch()批量绑定参数
INSERT INTO TMP_INLIST VALUES(?);
3. 改写SQL语句

select        count(1)from        V_XXXXXXXXXXXXXX t

where C1= '235432' and C2= '345436'

and
( C3 = 'SADFDSGADFDSAFDSAFSAD' or C3 is null ) and ( id in (select id from TMP_INLIST) );

 解决效果                             

按上述优化思路处理后,不管“in”列表里面有多少个常量,SQL解析的代价都是一样的,性能问题得到解决。在本例中,此条SQL首次执行时间由十几秒降至毫秒级

 

标签:TMP,语句,导致,常量,值过,SQL,INLIST,id
From: https://www.cnblogs.com/xuchuangye/p/18349115

相关文章

  • 【YashanDB数据库】由于网络带宽不足导致的jdbc向yashandb插入数据慢
    问题现象某客户环境,客户的业务使用jdbc驱动向其他操作系统上的yashandb插入90万条数据,耗时大约30分钟。问题的风险及影响影响客户的业务处理效率问题影响的版本所有的yashandb版本问题发生原因jdbc执行batchinsert时,是有绑定变量的。在准备好了PreparedStatement以后,jdbc......
  • 关于java连接数据库时提示异常java.sql.SQLException: No suitable driver found for
    当我们测试一个新的数据库服务时,需要使用对方提供jdbc驱动来连接数据库,有时候简单的写个demo去连接,发现提示异常:java.sql.SQLException:Nosuitabledriverfoundforjdbc:jdbc:nuuv://10.1.8.99:8832/xxoo比如有以下程序连接数据库测试:publicstaticvoidmain(String[]a......
  • 达梦数据库如何定位查询慢SQL
    数据库日常运维中,常常需要对数据库的性能和负载进行监控和优化,因此,能够及时采集发现慢SQL很重要。达梦有三种方式,可以获取数据库慢SQL。第一种,利用达梦的SQL日志如果将DM数据库配置文件中的参数SVR_LOG设置为打开,则系统还会在log目录下生成名为dmsql_实例名_日期_时间.log......
  • 推荐一个创新高效的开源数据翻译工具,一个注解搞定数据翻译,减少30%的SQL代码量
    前言在软件开发中,数据翻译是一个常见且关键的需求,尤其是在处理数据库字段与用户界面显示之间的转换时。然而,传统的数据翻译方式往往涉及到繁琐的SQL联表查询,这不仅增加了数据库的负担,也使得代码变得复杂难以维护。为了解决这一问题,提高开发效率,减少不必要的SQL代码量,一款新的......
  • 【原创】java+swing+mysql教材管理系统设计与实现
    个人主页:程序员杨工个人简介:从事软件开发多年,前后端均有涉猎,具有丰富的开发经验博客内容:全栈开发,分享Java、Python、Php、小程序、前后端、数据库经验和实战开发背景:随着高校教育的发展,学校规模越来越大,管理任务也越来越复杂。教材管理作为高校管理中的重要一环,其复杂性......
  • MySQL 常见日志清理策略
    前言:MySQL数据库服务器使用多种类型的日志来记录操作和事件,这对于故障诊断、审计和性能分析非常重要。然而,这些日志文件会随着时间的推移而不断增长,可能会占用大量的磁盘空间。因此,定期清理这些日志是必要的,本篇文章我们一起来学习下如何清理MySQL中的日志文件。二进制日志(......
  • 基于SpringBoot+MySQL+SSM+Vue.js的校园二手图书交易管理系统(附论文)
    获取见最下方名片信息获取见最下方名片信息获取见最下方名片信息演示视频基于SpringBoot+MySQL+SSM+Vue.js的校园二手图书交易管理系统(附论文)技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+M......
  • 基于SpringBoot+Vue+MySQL的在线网盘系统
    获取见最下方名片信息获取见最下方名片信息获取见最下方名片信息演示视频基于SpringBoot+Vue+MySQL的在线网盘系统技术描述开发工具:Idea/Eclipse数据库:MySQLJar包仓库:Maven前端框架:Vue/ElementUI后端框架:Spring+SpringMVC+Mybatis+SpringBoot文字描述......
  • ignite系列之19-数据源扩展Postgresql
    storeFactory.setDialect(dialect);storeFactory.setDataSourceFactory(newDefaultDataSourceFactory((Object)null));storeFactory.setCacheName(igniteTable.tableName());importjavax.cache.configuration.Factory;publicclassDefaultDataSourceFactory<T>impl......
  • Investigating Locks in MySQL
    InvestigatingLocksinMySQLhttps://emmer.dev/blog/investigating-locks-in-mysql/AcrashcourseonlocksMySQL(andmostrelationaldatabases)haveafewdifferenttypesoflockstolimitconcurrentaccessfromdifferentsessions,protectingschemaand......