`
klyuan
  • 浏览: 184555 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

SQL优化三例

阅读更多

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语句和执行计划分析贴出来)

 

 

 

6
1
分享到:
评论
2 楼 klyuan 2009-07-30  
hash join outer
jpacm 写道

“考虑如果用外关联来代替可能会获得一个更好的性能”... 我曾用过,以例为证:
在一个有上亿的查询匹配中,为减少对数据库的扫描次数,采用left join , where中尽量少用过滤条件,大部分过滤都移到 select 和 from 之间了。之前 需要半个多小时的查询最后降到3分钟左右...

主要是使用外关联后,表访问使用了hash join outer
这是查询效率提升的至关原因
1 楼 jpacm 2009-07-30  

“考虑如果用外关联来代替可能会获得一个更好的性能”... 我曾用过,以例为证:
在一个有上亿的查询匹配中,为减少对数据库的扫描次数,采用left join , where中尽量少用过滤条件,大部分过滤都移到 select 和 from 之间了。之前 需要半个多小时的查询最后降到3分钟左右...

相关推荐

    oracle sql优化 30例

    本文将深入探讨“Oracle SQL优化30例”中的关键知识点,旨在为初学者提供一个全面的入门指南。 1. **索引优化**:索引是提升查询速度的关键,合理创建和使用索引能显著提高数据检索的速度。例如,应优先为经常出现...

    SQL语句优化手册

    - **优化器选择**:以Oracle数据库为例,它提供了三种优化器:基于规则的优化器、基于成本的优化器和基于选择性的优化器。其中,基于成本的优化器更为灵活,可以根据统计信息动态地调整执行计划。 - **使用Hint**:...

    SQL语句优化方法30例

    SQL 语句优化方法 30 例 SQL 语句优化是一种非常重要的数据库优化技术,目的是为了提高数据库的查询效率,减少查询时间,提高系统的整体性能。在 SQL 语句优化过程中,我们经常会用到 hint,今天我们将总结一下在 ...

    sql 语句 优化30例

    以下是对描述和部分内容中提到的SQL优化方法的详细解释: 1. **/*+ALL_ROWS*/**:这个提示告诉Oracle优化器以最低的总体成本为目标,优先考虑吞吐量,而非最快的响应时间。这通常用于处理大量数据的情况。 2. **/*...

    sql语句优化建议

    然而,SQL优化并非一蹴而就的过程,它涉及多方面的考量和技术细节,需要根据具体的数据库环境和业务需求灵活调整。 #### SQL优化的核心策略 SQL优化主要可以从以下几个方面着手: 1. **避免全表扫描**:对于大型...

    LECCO SQL Expert (智能自动SQL优化)

    图1 人工智能自动SQL优化示意图 其核心模块之一“SQL语法优化器”的工作原理大致如下(如图1): 一条源SQL语句输入→“人工智能反馈式搜索引擎”对输入的SQL语句结合检测到的数据库结构和索引进行重写,产生N条等效...

    SQL优化方法介绍

    《SQL语句优化方法30例.doc》提供了30个具体的SQL优化案例,涵盖了多种常见问题和解决办法,这为数据库管理员和开发者提供了实用的参考指南。 最后,《高性能SQL优化.ppt》可能是一份演示文稿,详细展示了如何实现...

    SQL性能优化解决方案

    下面将详细介绍如何进行SQL性能优化,并以DMV(动态管理视图)脚本为例,阐述如何利用这些工具进行性能监控。 1. **性能瓶颈识别**: - SQL查询分析:通过执行计划查看SQL语句的执行过程,分析慢查询的原因,如全...

    lecco sql export pro(SQL优化器)

    图6 源语句与SQL124的比较 以上面优化的结果为例,为了查看源SQL语句和SQL124在写法上的不同,我们可以按下“比较器”按钮,对SQL124和源SQL语句进行比较。如果选择“双向比较”复选框,“SQL比较器”可以将两条...

    通过分析SQL语句的执行计划优化SQL

    ### 通过分析SQL语句的执行计划优化SQL 在数据库管理与开发过程中,SQL语句的性能优化至关重要。本文将详细介绍如何理解SQL及其执行计划,并给出具体的优化策略。通过优化SQL,可以显著提升应用程序的响应速度及...

    SQL 优化原则

    (转)SQL 优化原则 一、问题的提出  在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中...

    SQLSERVER完全优化教程

    《SQLSERVER完全优化教程》是一本专注于数据库性能提升的专业指南,尤其对于SQLSERVER数据库的使用者来说,这是一份非常实用的资源。数据库优化是确保系统高效运行的关键,尤其是在处理大量数据时,良好的优化策略...

    Oracle+SQL优化之使用索引提示一例

    ### Oracle SQL优化与索引提示应用案例解析 在Oracle数据库管理与优化的实践中,SQL语句的执行效率直接影响着系统的响应速度与资源消耗。当面对复杂的查询或批量更新操作时,合理利用索引提示(Index Hint)成为...

    sql server的性能优化x

    本文将以SQL Server自带的Northwind数据库为例,详细介绍SQL Server内部数据结构的相关知识,包括聚集索引、非聚集索引和堆等数据结构,以及如何利用这些知识进行性能优化。 #### 二、硬件优化 在硬件优化方面,...

    sql语句优化方法30例.sql.txt

    以下是从“sql语句优化方法30例.sql.txt”文件中提炼出的重要SQL优化技巧及其详细解释: 1. **/*+ALL_ROWS*/** 这个提示用于强制执行全表扫描,返回所有符合条件的行。在某些情况下,如数据量不大或需要返回所有...

    sql优化带代码

    根据提供的标题、描述、标签及部分内容,我们可以提炼出与SQL优化相关的知识点,这些知识点主要集中在如何构建高效查询、使用变量以及处理数据等方面。下面将详细展开这些知识点。 ### SQL优化的关键概念 #### 1. ...

    php sql 优化

    根据给定的信息,我们可以从多个角度来探讨与PHP和SQL优化相关的知识点,包括数据库优化、版本控制工具的选择、PHP的一些高级用法等。 ### 1. MySQL 数据库优化 #### (1) 选择合适的字段类型 为了提高MySQL的性能...

    sql server 存储过程100例

    在这个“SQL Server 存储过程100例”中,你将深入理解存储过程的多样性和实用性,超过100个示例将帮助你轻松掌握这个强大的功能。 1. **基础概念**: - 存储过程是数据库对象,由一系列SQL语句组成,可被多次调用...

Global site tag (gtag.js) - Google Analytics