SQL优化三例
原创:袁光东
在压力测试时发现,如果原来的查询在0.1秒之内,那么在40个并发时,平均速度是3秒。目标要求是所有的查询必须要在7秒之内。有好几条SQL都是在7秒左右,肯定不能通过压力测试,必须要优化到2秒之内才有希望通过压力测试。
(注:主要数据表的记录数都会超过60W条),所以只能是在项目组内进行SQL优化。
(因为某些原因,案例所使用的SQL都是经过笔者处理过的,已经不是最原始的SQL了。所以不便于贴出详细的执行计划)
1、索引很重要
当查询的记录数小于表记录总数的10%时,索引的效果是非常明显的。
优化前要看执行计划,去掉不必要的全表扫描,找出花费时间的SQL。然后加上适当的索引。
2.注意复合索引失效
create index n1 on ht(code,status,ht) ;
在ht表上的ht,code,status三列上已经存在复合索引n1
select * from ht ,qt where ht.ht= qt.ht
发现这个查询需要20秒左右。
查看执行计划时发现,n1这个索引并没有被使用。
于时,使用提示 index
select index h(n1) from ht h , qt q where h.ht = q.ht
使用提示后,查询只需要0.01秒了。
为什么n1这个索引没有被使用呢?
原因就是复合索引的问题。
对于复合索引,复合索引的第一列必须出现在WHERE条件中,复合索引才会被使用。
其实按照ORACEL的说法,“复合索引只有索引的所有列都作为查询条件时,索引才会被使用”。看来并非如此。
因为当时系统还没有上线,所以结合实际情况。因为ht列都会出现在查询的WHERE条件中。所以可以重新建立索引,调整索引列的顺序。
create index n1 on ht(hth,code,status)
这样,查询只需要0.01秒了。
3.not exists并不是最快的
有一些SQL优化经验的程序员都知道。总是该用not exists来代替not in.好像not exists就应该是最快的了。其实不尽然。
使用not exists时一定是要进行关联子查询。如果是非关联子查询,not exists是没有意义的。
select * from ht a where not exists ( select id from bills where ht = a.ht and bill_type =1)
因为ht表的数据量非常大。运行执行计划时发现对ht表的开销非常大。同时还发现ht表的索引失效了。
考虑如果用外关联来代替可能会获得一个更好的性能
select * from ht a, bills b where a.ht = b.ht(+)
and b.ht is null
and b.type = 1
再次执行执行计划时,发现两个表是通过 hash join outer方式进行访问。
原来的SQL需要20秒,优化后的SQL只需要0.02秒。
4.合理使用提示
有时使用提示,可以使查询效率提升。
h表和q表的记录数都是60w以上。
select h.a ,h.b,q.a,q.b, q.c from q, h where h.a = q.a and h.b = '' and h.c = ''
在h表的a表有索引。
执行计划发现对h表的a列上的索引进行了index fast full scan访问
对q表进行index range scan 和table access by index rowid访问。
然后进行hash join连接
因为h表都非常大,索引也非常大。就算是对索引进行完全访问,开销也很大。
这两个表的连接方式是比较慢的。
因为在h表是有其它的条件限制,可以过滤掉大部分数据,得到一个小的结果集,再与q表进行nested loop访问。这样性能就会有显著的提升。
所以可以加上提示,要求SQL按照指定的顺序访问,并且使用nested loop进行连接。
select /* + ordered use_nl(h)/ h.a, h.b, q.a, q.b, q.c from q,h where h.a = q.a
and h.b = ''
and h.c = ''
原来的SQL需要7秒,优化后的SQL只需要0.7秒。
性能提升10倍
总结:
SQL优化是个技术活,也是个体力活。需要耐心,不断的试验。
首先要会看执行计划,迅速的定位性能慢的SQL片段。
其次就是对建立适当的索引,尽量减少全表扫描
再次就是要对SQL进行优化,对优化前和优化后进行对比
最后就是可以使用提示试试
如果不行就需要对环境进行调优化了。如sort_area等。
(因为商业的原因不能把真实的SQL语句和执行计划分析贴出来)
分享到:
相关推荐
常见oracle sql优化,sql优化入门
SQL语句优化方法30例! 很值得下载看看!资源免费,大家分享!!
一些sql 优化案例例,一些sql 优化案例
oracle 语句优化方法,简单的SQL语句优化的一些基本知识!
图1 人工智能自动SQL优化示意图 其核心模块之一“SQL语法优化器”的工作原理大致如下(如图1): 一条源SQL语句输入→“人工智能反馈式搜索引擎”对输入的SQL语句结合检测到的数据库结构和索引进行重写,产生N条等效...
sql语句优化方法30例.sql.txt
Oracle+SQL优化之使用索引提示一例
图6 源语句与SQL124的比较 以上面优化的结果为例,为了查看源SQL语句和SQL124在写法上的不同,我们可以按下“比较器”按钮,对SQL124和源SQL语句进行比较。如果选择“双向比较”复选框,“SQL比较器”可以将两条...
(转)SQL 优化原则 一、问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中...
新增文件:例 d:\mydoc\plan.sql '0001'为user_define为使用者自定义编号 EXPLAIN PLAN SET STATEMENT_ID = '0001' FOR SELECT 'X' FROM sales.stockiohis a ,sales.product_info b ,sales.vendor c WHERE a.card_...
本书还包含了大量的代码示例和表示例以帮助数据库开发人员和管理员理解复杂的逻辑并掌握查询调整和优化。通过阅读本书,数据库开发人员将能够加深对查询优化背景的理解和应用,并开发和调整优化出反应速度更快的...
在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法.
本书还包含了大量的代码示例和表示例以帮助数据库开发人员和管理员理解复杂的逻辑并掌握查询调整和优化。通过阅读本书,数据库开发人员将能够加深对查询优化背景的理解和应用,并开发和调整优化出反应速度更快的...
该书解释并比较了SQL Server 2000和SQL Server 2005在数据库开发相关问题上的解决方案,深入讨论了SQL Server 2005中新增的T-SQL编程特性,包含了大量的代码示例、表示例和逻辑难题以帮助数据库开发人员和管理员理解...
使用案例加深对MySQL SQL查询理解,适合对mysql有了解的朋友,促进SQL的优化
里有msicuu2.exe,srvinstw.exe,前者是微软的卸载工具,后者是加载或卸载服务...以sql2005为例:先用msicuu2.exe卸载所有的sqlserver2005的应用程序,再卸载其服务,在用第三方软件清空注册表即可(我用的是优化大师)。
设计1个应用系统似乎并不难,但是要想使系统达到最优化的性能并不是一件容易的事。在开发工具、数据库设计、应用...本文以SQL Server为例,从后台数据库的角度讨论应用程序性能优化技巧,并且给出了一些有益的建议。
行式引擎按页取数只适用于Oracle,mysql,hsql和sqlserver2008及以上数据库,其他数据库,如access,sqlserver2005,sqlite等...今天我们以Access数据库为例介绍需要写分页SQL的数据库怎样利用行式的引擎实现层式报表。
本文以SQL Server为例,从后台数据库的角度讨论应用程序性能优化技巧,并且给出了一些有益的建议。1 数据库设计 要在良好的SQL Server方案中实现最优的性能,最关键的是要有1个很好的数据库设计方案。在实际工作中...