优化SQL的另类思考

今天给大家介绍一个SQL优化案例,这是statpack中逻辑读排名第一的SQL.当前创建的索引建在 (username,ends,approve_status,promoted_status)上。

以下是引用片段:
Buffer Gets Executions Gets per Exec %Total Time (s) Time (s) Hash Value
------------- ------------ -------------- ------ -------- --------- --------
116,608,373 164,083 710.7 40.6 7027.07 11922.30 3701069644
Module: java@test.cm2 (TNS V1-V3)
select count(*) from test
where username = :1 --这是一个高势列,
and ends>sysdate
and approve_status in (0,1,-9)
and id <> :2 --这是主键
and promoted_status = 1

如果大家见到这样的SQL语句会怎么样优化?通常的做法,是在当前索引中冗余id字段,以避免回表。但这样要去调整这张大表的索引.

在看到上面的SQL后,询问开发能否明确的知道id=:2并且满足其它条件的这样的记录是否一定存在。开发经过查证后,最后的答复是无法肯定.既然在应用层无法确定,那也要想个办法来解决大量回表的问 题。在经过仔细观察后,我将上面这条SQL语句转换成下面两条SQL以及最后一步应用逻辑来实现:

第一条SQL:

Select/*+ index(a, PK_test_ID) */ count(*) from test a

where id=:1 and ends>sysdate and approve_status in (0,1,-9) and promoted_status = 1 and username=:2

第二条SQL:

select count(*) from test

where username = :1 and ends>sysdate and approve_status in (0,1,-9) and and promoted_status = 1

第三步,将两个结果相减即可实现业务

我们在做SQL优化时,如何把一条SQL根据需要等价转化成多条,需要考虑当前的应用逻辑,以及当前数据库中索引的情况,优化便会事半功倍。如何跳出ORACLE去思考问题,希望这个优化案例能对大家有所启示。

时间: 2025-01-21 00:35:40

优化SQL的另类思考的相关文章

优化Sql语句注意

优化Sql语句需要注意以下几点,当然,只是个人看法 1.尽量不要对列名进行函数处理.而是针对后面的值进行处理 例如where col1 = -5的效率比where -col1=5的效率要高 因为后面的条件对列值进行了计算.这样的条件下优化器无法使用索引 而是要针对所有值进行计算之后才能再比较 2.尽量使用和数剧列一样的值进行操作 如果col1是数值型 那么例如where col1 = 2和where col1= '2′ 则前者效率更高 因为比较字符和数值型的时候 引擎需要把两者都转化成双精度然后

应用事件探查器优化SQL Server系统

概述 当你的SQL Server数据库系统运行缓慢的时候,你或许多多少少知道可以使用SQL Server Profiler(中文叫SQL事件探查器)工具来进行跟踪和分析.是的,Profiler可以用来捕获发送到SQL Server的所有语句以及语句的执行性能相关数据(如语句的read/writes页面数目,CPU的使用量,以及语句的duration等)以供以后分析.但本文并不介绍如何使用Profiler 工具,而是将介绍如何使用read80trace(有关该工具见后面介绍)工具结合自定义的存储过

优化SQL Server索引的小技巧

server|技巧|索引|优化  SQL Server中有几个可以让你检测.调整和优化SQL Server性能的工具.在本文中,我将说明如何用SQL Server的工具来优化数据库索引的使用,本文还涉及到有关索引的一般性知识.关于索引的常识  影响到数据库性能的最大因素就是索引.由于该问题的复杂性,我只可能简单的谈谈这个问题,不过关于这方面的问题,目前有好几本不错的书籍可供你参阅.我在这里只讨论两种SQL Server索引,即clustered索引和nonclustered索引.当考察建立什么类

Oracle SQL_TRACE和10046事件的优化SQL实例

一数据库版本 LEO1@LEO1>select * from v$version; BANNER -------------------------------------------------------------------------------- Oracle Database11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production PL/SQL Release11.2.0.1.0 - Production CORE  

应用Profiler优化SQL Server数据库系统

当你的SQL Server数据库系统运行缓慢的时候,你或许多多少少知道可以使用SQL Server Profiler(中文叫SQL事件探查器)工具来进行跟踪和分析.是的,Profiler可以用来捕获发送到SQL Server的所有语句以及语句的执行性能相关数据(如语句的read/writes页面数目,CPU的使用量,以及语句的duration等)以供以后分析.但本文并不介绍如何使用Profiler 工具,而是将介绍如何使用read80trace(有关该工具见后面介绍)工具结合自定义的存储过程来提

优化SQL Server索引

SQL Server中有几个可以让你检测.调整和优化SQL Server性能的工具.在本文中,将说明如何用SQL Server的工具来优化数据库索引的使用,本文还涉及到有关索引的一般性知识.关于索引的常识 影响到数据库性能的最大因素就是索引.由于该问题的复杂性,我只可能简单的谈谈这个问题,不过关于这方面的问题,目前有好几本不错的书籍可供你参阅.我在这里只讨论两种SQL Server索引,即clustered索引和nonclustered索引.当考察建立什么类型的索引时,你应当考虑数据类型和保存这

MySQL中优化sql语句查询常用的30种方法

本篇文章是对MySQL中优化sql语句查询常用的30种方法进行了详细的分析介绍,需要的朋友参考下   1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以

sql优化-求大神怎么优化sql 和存储过程呢?

问题描述 求大神怎么优化sql 和存储过程呢? 需求是这样的: 每个人学习分3个阶段,查询出来每个人这3个阶段学习的开始时间和结束时间,放到一个表里t_stage_info. 第1阶段的结束时间做为第二阶段的开始时间,第2阶段学习结束时间作为第3阶段学习开始时间. 这个表结构: t_stage_info(idbigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',person_plan_idbigint(20) NOT NULL COMMENT 'pe

oracle语句-求高手优化sql 主要针对group by

问题描述 求高手优化sql 主要针对group by SELECT r.custid custid i.productid i.officialsocialprice price SUM(i.quanitity) amount FROM IMEIBATCH i RDCUST r RDCUSTDETAIL d WHERE (i.vendororgacode = 'ZD' OR i.vendororgacode IN (SELECT orgacode FROM organiza WHERE pare