`
sbpya
  • 浏览: 616467 次
  • 性别: Icon_minigender_1
  • 来自: 杭州,长沙
社区版块
存档分类
最新评论

查询语句(SELECT)的优化

阅读更多

您正在看的ORACLE教程是:查询语句(SELECT)的优化。
  这篇文章是基于Informix数据库写的。希望对大家有用。
  
  
   程序设计中的一个著名定律是20%的代码用去了80%的时间,在数据库应用程序中也同样如此。数据库应用程序的优化通常可分为两个方面:源代码的优化和 SQL语句的优化。源代码的优化在时间成本和风险上代价很高;另一方面,源代码的优化对数据库系统性能的提升收效有限。
  许多程序员认为查询优 化是DBMS(数据库管理系统)的任务,与程序员所编写的SQL语句关系不大,这是错误的。一个好的查询计划往往可以使程序性能提高数十倍。查询计划是用 户所提交的SQL语句的集合,查询规划是经过优化处理之后所产生的语句集合。DBMS处理查询计划的过程是这样的:在做完查询语句的词法、语法检查之后, 将语句提交给DBMS的查询优化器,优化器做完代数优化和存取路径的优化之后,由预编译模块对语句进行处理并生成查询规划,然后在合适的时间提交给系统处 理执行,最后将执行结果返回给用户。虽然现在的数据库产品在查询优化方面已经做得越来越好,但由用户提交的SQL语句是系统优化的基础,很难设想一个原本 糟糕的查询计划经过系统的优化之后会变得高效,因此用户所写语句的优劣至关重要。
  1、对查询语句进行优化的理由
  下列几方面的原因是我们进行SQL语句优化的理由:
  ◆ SQL语句是对数据库(数据)进行*作的惟一途径;
  ◆ SQL语句消耗了70%~90%的数据库资源;
  ◆ SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低;
  ◆ SQL语句可以有不同的写法;
  ◆ SQL语句易学,难精通。
  从大多数数据库应用系统的实例来看,查询*作在各种数据库*作中所占据的比重最大,而查询*作所基于的SELECT语句在SQL语句中又是代价最大的语句。
  2、查询语句(SELECT)的优化建议
  (1)、合理使用索引:where子句中变量顺序应与索引字键顺序相同。
  如:create index test_idx on test(hm, rq, xx)
       索引字键顺序:首先是号码hm,其次是日期rq,最后是标志xx,所以where子句变量顺序应是where hm<=“P1234”and rq=“06/06/1999”and xx=“DDD”,不应是where xx=“DDD” and rq=“06/06/1999” and hm <=“P1234”这样的不按索引字键顺序写法。
  (2)、将最具有限制性的条件放在前面,大值在前,小值在后。
     如:where colA<=10000 AND colA>=1 效率高
      where colA>=1 AND colA<=10000 效率低
  (3)、避免采用MATCHES和LIKE通配符匹配查询
  通配符匹配查询特别耗费时间。即使在条件字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。
  例如语句:SELECT * FROM customer WHERE zipcode MATCHES “524*”
  可以考虑将它改为SELECT * FROM customer WHERE ZipCode<=“524999” AND ZipCode >=“524000”,则在执行查询时就会利用索引来查询,显然会大大提高速度。
  (4)、避免非开始的子串
  例如语句:SELECT * FROM customer WHERE zipcode[2,3] >“24”,在where子句中采用了非开始子串,因而这个语句也不会使用索引。
  (5)、避免相关子查询
  一个字段的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的字段值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
  例如:将下面的语句
  select hm,rq from TabA
  where item IN (select item form TabB where TabB.num=50)
  改为:select hm,bf from TabA, TabB
   where TabA.item=TabB.item AND TabB.num=50
  (6)、避免或简化排序
   应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:
  ◆ 索引中不包括一个或几个待排序的字段;
  ◆ group by或order by子句中字段的次序与索引的次序不一样;
  ◆ 排序的字段来自不同的表。
   为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表(尽管有时可能影响表的规范化,但相对于效率的提高是值得的)。如果排序不可避免,那么应当试图简化它,如缩小排序的字段的范围等。
  (7)、消除对大型表行数据的顺序存取
    在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套3层的查询,如果每层都查询1000行,那么这个查询就要查 询10亿行数据。避免这种情况的主要方法就是对连接的字段进行索引。例如,两个表:学生表(学号、姓名、年龄……)和选课表(学号、课程号、成绩)。如果 两个表要做连接,就要在“学号”这个连接字段上建立索引。
   还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的where子句强迫优化器使用顺序存取。下面的查询将强迫对orders表执行顺序*作:
   SELECT * FROM orders WHERE (cust_num=126 AND order_num>1001) OR order_num=1008
   虽然在cust_num和order_num上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:
   SELECT * FROM orders WHERE cust_num=126 AND order_num>1001
   UNION
   SELECT * FROM orders WHERE order_num=1008
   这样就能利用索引路径处理查询。
  (8)、对于大数据量的求和应避免使用单一的sum命令处理,可采用group by方式与其结合,有时其效率可提高几倍甚至百倍。
  (9)、避免会引起磁盘读写的rowid*作。在where子句中或select语句中,用rowid要产生磁盘读写,是一个物理过程,会影响性能。
  (10)、使用临时表加速查询
   把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序*作,而且在其他方面还能简化优化器的工作。
   但要注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。 

分享到:
评论

相关推荐

    select语句性能优化小结

    【SQL SELECT 语句性能优化】在数据库管理中,高效的SELECT查询对于系统性能至关重要。当涉及的数据表数量庞大时,不恰当的查询方式可能导致全表扫描,极大地影响系统响应速度。以下是一些针对SELECT语句优化的关键...

    数据库设计(包括select语句、子查询、语句嵌套)

    在本话题中,我们将探讨数据库设计的基础,特别关注SELECT语句、子查询以及语句嵌套这三个核心概念。 首先,数据库设计不仅仅是创建表格,更重要的是理解和分析业务需求,以构建一个能够支持高效数据存储、检索和...

    oracle查询语句优化

    ### Oracle查询语句优化知识点详解 #### 一、概述 Oracle数据库因其强大的功能和灵活性,在企业级应用中占据着重要地位。随着业务的发展,数据库的数据量急剧增长,如何提高查询效率成为了亟需解决的问题之一。本文...

    Effective MySQL之SQL语句最优化.pdf

    10. SQL语句优化的技术手段:技术手段包括但不限于使用子查询优化、使用JOIN代替子查询、避免SELECT *、使用更有效的查询方法(如IN代替OR)、利用数据库提供的存储过程和函数减少网络往返次数等。 11. 经验与实践...

    ORACLE中SQL查询语句的优化.pdf

    在这个案例中,我们使用了EXPLAIN工具和画查询图的技术来优化查询语句,我们可以看到,使用索引的优化可以提高查询效率,而使用驱动表的优化可以提高查询速度。 七、总结 ORACLE中SQL查询语句的优化是一项复杂的...

    SQL查询思路优化与语句优化.pdf

    三个关系模式为stud、class和sc,需要优化查询语句来提高查询速度。创建索引可以提高查询速度,避免表扫描和I/O开销。 本文还讨论了SQL查询思路优化的方法,包括使用EXISTS和IN代替子查询、使用索引、避免使用...

    提升MYSQL查询效率的10个SQL语句优化技巧.doc

    "MYSQL 查询效率优化技巧" ...查询优化器可以帮助你优化查询语句,例如,rearranging the order of tables in a multi-table query. 通过应用这些技巧,你可以提高 MySQL 查询效率,提高程序的执行速度。

    sql 查询语句优化

    ### SQL 查询语句优化 #### 一、引言 在当今大数据时代,高效的数据处理能力对于任何企业都至关重要。SQL作为关系型数据库的标准查询语言,其性能直接影响着系统的响应时间和资源消耗。尤其对于大型数据库系统而言...

    基于SQL查询语句的查询优化方法.pdf

    本文将以SQL查询语句为研究对象,探讨如何通过优化查询来提高数据库系统的响应速度和整体性能。 SQL(Structured Query Language)是关系型数据库的标准查询语言,其中,SELECT语句是SQL中最为核心的查询语句,用于...

    SQL 查询语句优化

    ### SQL查询语句优化策略详解 #### 一、选择最有效率的表名顺序 在基于规则的优化器中,如Oracle,SQL语句中表的处理顺序至关重要。Oracle的解析器遵循从右至左的处理逻辑,因此,位于FROM子句最右侧的表将被最先...

    sql语句的优化

    本文将详细介绍如何通过优化SQL语句来提高查询效率,特别关注那些能让索引等机制更高效地发挥作用的方法。 #### 二、避免全表扫描 全表扫描是指数据库遍历整个表来查找符合特定条件的数据记录,这种方式通常效率...

    最新整理的常用sql语句及优化大全

    5. **使用`EXPLAIN`分析查询**:`EXPLAIN`可以显示MySQL如何执行SQL语句,帮助理解并优化查询计划。 6. **批量插入**:一次性插入大量数据比单条插入更高效。 7. **存储过程和预编译语句**:它们可以减少网络传输...

    update语句的优化-oracle .pdf

    总结来说,针对Oracle数据库的update语句的优化,主要可以从简化SQL语句结构、合理使用子查询和join操作、采用merge语句以及编写PL/SQL游标处理等多方面入手。在实际应用中,根据具体情况选择合适的优化方案,能够...

    基于Oracle数据库SQL查询语句优化规则的研究.pdf

    由于在Oracle数据库中,select查询语句是最常用的,同时它也影响着update、insert和delete语句的执行效率,因此,本文重点讨论了select查询语句的优化。 文章详细介绍了Oracle数据库执行SQL语句的过程,这包括对...

    《Effective MySQL之SQL语句最优化》手册

    在数据库管理领域,SQL优化是提升系统性能的关键环节,尤其是在处理大数据量时,优化SQL语句能够显著减少查询时间,改善用户体验,同时减轻服务器负担。 首先,SQL优化的基础在于理解SQL语句的工作原理。SQL是...

    基于SQL语句查询优化分析的研究.pdf

    标题“基于SQL语句查询优化分析的研究”所指的是针对SQL查询语句执行效率和性能的研究。研究的目的是提高SQL查询语句的执行速度和效率,通过优化来减少对数据库资源的消耗。在描述中提及,优化的实质是提高查找效率...

    Oracle中SQL查询语句优化探析.pdf

    在解析SQL语句时,明确指定查询的列名,而不是使用Select *,可以减少不必要的数据处理和CPU资源消耗。第三,使用EXISTS替代DISTINCT。EXISTS在子查询条件满足时可以立即返回结果,而DISTINCT需要对数据进行排序和...

    Effective MySQL之SQL语句最优化

    复合索引的使用,以及避免全表扫描,都是优化查询速度的重要策略。 2. **查询结构优化**:SQL查询的结构对执行速度有很大影响。避免使用SELECT *,只选择需要的列可以减少数据传输量。合理使用JOIN操作,避免笛卡尔...

    SELECT语句的应用 - MS SQL

    以上只是SELECT语句在MS SQL中部分应用的概述,实际上还有更多高级特性,如窗口函数、CTE(公共表表达式)、联接优化等。通过熟练掌握这些技巧,你将能够更有效地管理和分析你的数据库。在实践中不断探索和学习,将...

    SQL查询语句优化总结

    ### SQL查询语句优化总结 #### 1. 前言 在客服业务场景中,SQL语句的优化至关重要。...本篇总结了基于索引的SQL查询语句优化方法,希望能够帮助开发者们更好地理解和应用这些技术,有效地优化查询性能。

Global site tag (gtag.js) - Google Analytics