每秒执行6000的简单SQL优化(二)

简介: 继续前几天的一次性能调优,这次调优难度不小,而且空间很小,看起来简直就是绝处逢生的感觉。下面的两条SQL语句执行频率极高,每秒达到6000次,希望能够优化。 select companyname from license select supdepid from hrmdepartment where id ='' 前几天分析了一下,也尝试了很多种方法,但是始终无法启用索引,最后采用IOT的形式才看到效果,这是其一。

继续前几天的一次性能调优,这次调优难度不小,而且空间很小,看起来简直就是绝处逢生的感觉。下面的两条SQL语句执行频率极高,每秒达到6000次,希望能够优化。
select companyname from license

select supdepid from hrmdepartment where id =''
前几天分析了一下,也尝试了很多种方法,但是始终无法启用索引,最后采用IOT的形式才看到效果,这是其一。
还有一点很多明眼人看出来了,为什么创建了唯一性索引,表license中存在1行记录,但是却无法启用,一个根本原因就是唯一性索引的列没有非空约束。
为此我又进行了一次测试,添加了主键,那么就会是非空约束和唯一性主键。
create table license tablespace users as select * from  USERV6.LICENSE ;
alter table license modify(companyname primary key);
exec dbms_stats.gather_table_stats(ownname=>null,tabname=>'LICENSE');
测试结果如下:

可以看到达到了预期的改进效果。但是改进幅度到底有多大呢。
我们抓取了一个awr的报告来看看。
改进前,是全表扫描,每次执行的buffer gets是7

而改进之后的情况如下:

第一条语句的优化暂且到这里,如果是在11g中,可能result cache还有有一些改进之处。
再来看看第二条语句。
select supdepid from hrmdepartment where id =''
表hrmdepartment这种id是主键列,但是查询使用了id=''
查看执行计划可以很明显看到Filter的处理,里面的条件很微妙NULL IS NOT NULL

这样一个语句怎么优化呢,一个很明显的处理方式就是在SQL中做检查,尽可能调整逻辑。
但是让人尴尬的是这个应用是闭源的,无法直接修改里面的逻辑。怎么改进,或者说有什么是DBA能想办法缓解的。
首先使用唯一性索引是最高效的索引扫描方式。

能够沾沾索引的光,其实还真有点门路,那就是创建一个复合索引,基于列supdepid,id
create unique index ind_hrm_id on HRMDEPARTMENT(id,supdepid);      
exec dbms_stats.gather_table_stats(ownname=>null,tabname=>'HRMDEPARTMENT',cascade=>true);
这个语句的效果如下:


如果运行已有的主键id条件的查询,就会发现原来的唯一性索引变为了下面的区间扫描。

其实可以在继续改进,就是建立复合索引,基于列(supdepid,id)
这样的好处在于不会影响已有的唯一性主键索引。
查询id=''的效果如下:

而根据id的值来查询,这个是还是走原来的唯一性索引扫描。

这样做可能看起来效果不大,毕竟扫描返回的行数都是全表的行数。
我们把数据量增大到500万
create table test_obj as select level object_id ,'obj'||level object_name,'TABLE' object_type from dual connect by level<=5000000;
alter table test_obj modify(object_id primary key);
这个时候Ojbect_type为char类型,修改为varchar2
SQL> ALTER TABLE TEST_OBJ MODIFY(OBJECT_TYPE VARCHAR2(10));
然后把数据简单的处理一下,让数据的分布基本打散。
update test_obj set object_type='VIEW' where object_id>200000 and object_id<1430000;
update test_obj set object_type='SYNONYM' where object_id>2000000 and object_id<3430000;
update test_obj set object_type='SEQUENCE' where object_id>4000000 and object_id<4743000;
数据的分布情况如下:
SQL> select object_type,count(*)from test_obj group by object_type;
OBJECT_TYP   COUNT(*)
---------- ----------
VIEW          1229999
SYNONYM       1429999
SEQUENCE       742999
TABLE         1597003
如果我们创建复合索引基于列(object_type,object_id)
create index ind_test_obj_mx on test_obj(object_type,object_id);
exec dbms_stats.gather_table_stats(ownname=>null,tabname=>'TEST_OBJ');
全表扫描的cost为4342,则索引扫描的cost为3765,相比还是有不小的提高。
而对于这个问题的持续跟进结果就是,应用那边也做了一些努力,我可以看到的是语句的执行频率从原来的每小时2000万降到了200万。
这个改进的效果有多大。可以参见下面的图。
横轴是时间,纵轴是数据库的负载
绿色的部分是每小时2000万的时候数据库的负载曲线
红色的部分是每小时200万的时候数据库的负载曲线
蓝色的部分是优化之后,每小时200万的时候数据库的负载曲线。

可以看到蓝色的曲线还是略微要低于红色的部分,但是改进的空间在200万的执行频率下效果被缩小了。
改进最大的是应用的调整,幅度可不是简单的几倍几十倍,而是根本性的改变。

目录
相关文章
|
1月前
|
SQL 存储 监控
SQL日志优化策略:提升数据库日志记录效率
通过以上方法结合起来运行调整方案, 可以显著地提升SQL环境下面向各种搜索引擎服务平台所需要满足标准条件下之数据库登记作业流程综合表现; 同时还能确保系统稳健运行并满越用户体验预期目标.
175 6
|
9月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(07) 她气鼓鼓递来一条SQL | 怎么看执行计划、SQL怎么优化?
在日常研发工作当中,系统性能优化,从大的方面来看主要涉及基础平台优化、业务系统性能优化、数据库优化。面对数据库优化,除了DBA在集群性能、服务器调优需要投入精力,我们研发需要负责业务SQL执行优化。当业务数据量达到一定规模后,SQL执行效率可能就会出现瓶颈,影响系统业务响应。掌握如何判断SQL执行慢、以及如何分析SQL执行计划、优化SQL的技能,在工作中解决SQL性能问题显得非常关键。
|
6月前
|
SQL 存储 自然语言处理
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
SQL的解析和优化的原理:一条sql 执行过程是什么?
|
8月前
|
SQL 关系型数据库 MySQL
如何优化SQL查询以提高数据库性能?
这篇文章以生动的比喻介绍了优化SQL查询的重要性及方法。它首先将未优化的SQL查询比作在自助餐厅贪多嚼不烂的行为,强调了只获取必要数据的必要性。接着,文章详细讲解了四种优化策略:**精简选择**(避免使用`SELECT *`)、**专业筛选**(利用`WHERE`缩小范围)、**高效联接**(索引和限制数据量)以及**使用索引**(加速搜索)。此外,还探讨了如何避免N+1查询问题、使用分页限制结果、理解执行计划以及定期维护数据库健康。通过这些技巧,可以显著提升数据库性能,让查询更高效流畅。
|
9月前
|
SQL 关系型数据库 MySQL
基于SQL Server / MySQL进行百万条数据过滤优化方案
对百万级别数据进行高效过滤查询,需要综合使用索引、查询优化、表分区、统计信息和视图等技术手段。通过合理的数据库设计和查询优化,可以显著提升查询性能,确保系统的高效稳定运行。
418 9
|
10月前
|
SQL Oracle 关系型数据库
如何在 Oracle 中配置和使用 SQL Profiles 来优化查询性能?
在 Oracle 数据库中,SQL Profiles 是优化查询性能的工具,通过提供额外统计信息帮助生成更有效的执行计划。配置和使用步骤包括:1. 启用自动 SQL 调优;2. 手动创建 SQL Profile,涉及收集、执行调优任务、查看报告及应用建议;3. 验证效果;4. 使用 `DBA_SQL_PROFILES` 视图管理 Profile。
|
11月前
|
SQL Oracle 数据库
使用访问指导(SQL Access Advisor)优化数据库业务负载
本文介绍了Oracle的SQL访问指导(SQL Access Advisor)的应用场景及其使用方法。访问指导通过分析给定的工作负载,提供索引、物化视图和分区等方面的优化建议,帮助DBA提升数据库性能。具体步骤包括创建访问指导任务、创建工作负载、连接工作负载至访问指导、设置任务参数、运行访问指导、查看和应用优化建议。访问指导不仅针对单条SQL语句,还能综合考虑多条SQL语句的优化效果,为DBA提供全面的决策支持。
274 11
|
10月前
|
SQL 分布式计算 Java
Spark SQL向量化执行引擎框架Gluten-Velox在AArch64使能和优化
本文摘自 Arm China的工程师顾煜祺关于“在 Arm 平台上使用 Native 算子库加速 Spark”的分享,主要内容包括以下四个部分: 1.技术背景 2.算子库构成 3.算子操作优化 4.未来工作
1305 0
|
12月前
|
SQL 存储 BI
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
gbase 8a 数据库 SQL合并类优化——不同数据统计周期合并为一条SQL语句
|
12月前
|
SQL 数据库
gbase 8a 数据库 SQL优化案例-关联顺序优化
gbase 8a 数据库 SQL优化案例-关联顺序优化