您正在看的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)、使用临时表加速查询
把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序*作,而且在其他方面还能简化优化器的工作。
但要注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。
分享到:
相关推荐
【SQL SELECT 语句性能优化】在数据库管理中,高效的SELECT查询对于系统性能至关重要。当涉及的数据表数量庞大时,不恰当的查询方式可能导致全表扫描,极大地影响系统响应速度。以下是一些针对SELECT语句优化的关键...
在本话题中,我们将探讨数据库设计的基础,特别关注SELECT语句、子查询以及语句嵌套这三个核心概念。 首先,数据库设计不仅仅是创建表格,更重要的是理解和分析业务需求,以构建一个能够支持高效数据存储、检索和...
### Oracle查询语句优化知识点详解 #### 一、概述 Oracle数据库因其强大的功能和灵活性,在企业级应用中占据着重要地位。随着业务的发展,数据库的数据量急剧增长,如何提高查询效率成为了亟需解决的问题之一。本文...
10. SQL语句优化的技术手段:技术手段包括但不限于使用子查询优化、使用JOIN代替子查询、避免SELECT *、使用更有效的查询方法(如IN代替OR)、利用数据库提供的存储过程和函数减少网络往返次数等。 11. 经验与实践...
在这个案例中,我们使用了EXPLAIN工具和画查询图的技术来优化查询语句,我们可以看到,使用索引的优化可以提高查询效率,而使用驱动表的优化可以提高查询速度。 七、总结 ORACLE中SQL查询语句的优化是一项复杂的...
三个关系模式为stud、class和sc,需要优化查询语句来提高查询速度。创建索引可以提高查询速度,避免表扫描和I/O开销。 本文还讨论了SQL查询思路优化的方法,包括使用EXISTS和IN代替子查询、使用索引、避免使用...
"MYSQL 查询效率优化技巧" ...查询优化器可以帮助你优化查询语句,例如,rearranging the order of tables in a multi-table query. 通过应用这些技巧,你可以提高 MySQL 查询效率,提高程序的执行速度。
### SQL 查询语句优化 #### 一、引言 在当今大数据时代,高效的数据处理能力对于任何企业都至关重要。SQL作为关系型数据库的标准查询语言,其性能直接影响着系统的响应时间和资源消耗。尤其对于大型数据库系统而言...
本文将以SQL查询语句为研究对象,探讨如何通过优化查询来提高数据库系统的响应速度和整体性能。 SQL(Structured Query Language)是关系型数据库的标准查询语言,其中,SELECT语句是SQL中最为核心的查询语句,用于...
### SQL查询语句优化策略详解 #### 一、选择最有效率的表名顺序 在基于规则的优化器中,如Oracle,SQL语句中表的处理顺序至关重要。Oracle的解析器遵循从右至左的处理逻辑,因此,位于FROM子句最右侧的表将被最先...
本文将详细介绍如何通过优化SQL语句来提高查询效率,特别关注那些能让索引等机制更高效地发挥作用的方法。 #### 二、避免全表扫描 全表扫描是指数据库遍历整个表来查找符合特定条件的数据记录,这种方式通常效率...
5. **使用`EXPLAIN`分析查询**:`EXPLAIN`可以显示MySQL如何执行SQL语句,帮助理解并优化查询计划。 6. **批量插入**:一次性插入大量数据比单条插入更高效。 7. **存储过程和预编译语句**:它们可以减少网络传输...
总结来说,针对Oracle数据库的update语句的优化,主要可以从简化SQL语句结构、合理使用子查询和join操作、采用merge语句以及编写PL/SQL游标处理等多方面入手。在实际应用中,根据具体情况选择合适的优化方案,能够...
由于在Oracle数据库中,select查询语句是最常用的,同时它也影响着update、insert和delete语句的执行效率,因此,本文重点讨论了select查询语句的优化。 文章详细介绍了Oracle数据库执行SQL语句的过程,这包括对...
在数据库管理领域,SQL优化是提升系统性能的关键环节,尤其是在处理大数据量时,优化SQL语句能够显著减少查询时间,改善用户体验,同时减轻服务器负担。 首先,SQL优化的基础在于理解SQL语句的工作原理。SQL是...
标题“基于SQL语句查询优化分析的研究”所指的是针对SQL查询语句执行效率和性能的研究。研究的目的是提高SQL查询语句的执行速度和效率,通过优化来减少对数据库资源的消耗。在描述中提及,优化的实质是提高查找效率...
在解析SQL语句时,明确指定查询的列名,而不是使用Select *,可以减少不必要的数据处理和CPU资源消耗。第三,使用EXISTS替代DISTINCT。EXISTS在子查询条件满足时可以立即返回结果,而DISTINCT需要对数据进行排序和...
复合索引的使用,以及避免全表扫描,都是优化查询速度的重要策略。 2. **查询结构优化**:SQL查询的结构对执行速度有很大影响。避免使用SELECT *,只选择需要的列可以减少数据传输量。合理使用JOIN操作,避免笛卡尔...
以上只是SELECT语句在MS SQL中部分应用的概述,实际上还有更多高级特性,如窗口函数、CTE(公共表表达式)、联接优化等。通过熟练掌握这些技巧,你将能够更有效地管理和分析你的数据库。在实践中不断探索和学习,将...
### SQL查询语句优化总结 #### 1. 前言 在客服业务场景中,SQL语句的优化至关重要。...本篇总结了基于索引的SQL查询语句优化方法,希望能够帮助开发者们更好地理解和应用这些技术,有效地优化查询性能。