`
hz_chenwenbiao
  • 浏览: 996490 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

数据库查询优化(转)

阅读更多

北工大计算机学院软件工程研究所 程颖
目前,几乎所有的应用程序都要和数据库打交道。通过查询数据库可很容易地获得想
要的数据。但是,令人不满意的是:某些查询时间长,响应速度慢。究其原因,一是硬件设
备(如CPU、磁盘)的存取速度跟不上,内存容量不够大,这需要计算机制造商的努力;另一
方面是没有进行查询优化。本文就查询优化问题,谈点实践体会。
分解查询
这种方法是把查询分解执行,根据付出开销的多少来决定如何分解,如何执行。
为方便叙述,先给出一个例子。
关系:SUPPLIER(S#,SNAME,CITY)
 :S
PARTS  (P#,PNAME,SIZE)
 :P
PROJECT (J#,JNAME,COLOR)
:J
INVENTORY(S#,P#,QO)
:V
SUPPLY(S#,J#,P#,QU)
:Y
其中,QO:现有数量
QU:要用的数量
这个查询是找出某城市能提供黑色轿车,且供应量大于1000的供应商名单。
1. 一般查询方法
(1) 形成卡氏积 S×P×J×V×Y;
(2) 从卡氏积中选择出满足条件的元组;
(3) 在S.SNAME上投影。
这是个5元查询。当查询涉及到卡氏积时,卡氏积的元组数将组合性增长,这样不仅需
要大量的存储空间,而且执行查询时间很长。
2. 优化查询方法
该方法是把查询分解处理。这里介绍两种方法:
(1) 一元子查询提取
任一N元查询Q(X1,X2......Xn)被替换为一个一元查询Q1和一个在其后执行的Q2,即
Q→(Q1,Q2)。
(2) 化简
Q被替换为两个查询Q1和Q2,Q2在Q1执行后执行,它们只有一个变化,即
Q1(X1,X2......Xm), Q2(Xm,Xm+1......Xn)。
例如上例的查询可以分成两个一元查询
SELECT P#
FROM P
WHERE P.PNAME=‘轿车’ AND P.COLOR=‘黑色’

SELECT S#,J#,P#,QO
FROM Y
WHERE V.QO>1000
另一部分查询为:
SELECT S.SNAME
FROM S,P,J,V,Y
WHERE (S.S#=V.S# AND S.S#=Y.S# AND
  S.CITY=J.CITY AND P.P#=V.P# AND
  T.P#=V.P# AND J.J#=Y.J#)
上面例子的查询也很容易化简化为一个涉及(P,V)的查询和在其后执行的涉及(S,J,
Y,V)的查询:
SELECT S.SNAME
FORM S,J,V,Y
WHERE S.CITY=J.CITY AND S.S#=Y.S# AND
  J.J#=Y.J# AND V.QO>1000 AND P.#=Y.P#
AND V.S#=Y.S# AND
 V.P#=(SELECT V.P#
  FROM  V,P
WHERE V.P#=P P#AND P.PNAME=‘轿车’ AND P.COLOR=‘黑色’)
3. 综上所述
·一元子查询提取几乎总会得到好处,因为在关系运算之前尽可能减少关系的体积对
减少相应的系统开销起很大的作用;
·通常会得到期待的优化结果,但也并不绝对如此。
选择最优存取路径
在计算查询表达式值时要充分考虑索引、数据的存储分布等存取路径,以进一步提高
查询效率。例如,选择字段、连接字段上是否有索引,利用索引和HASHING算法可快速地存
取包含索引属性特定值的记录。建立索引,用户可按顺序读文件中的记录,依照接近于物
理顺序的顺序读文件中的记录是非常有效的。这种接近的物理顺序读取文件中记录的索
引称为聚簇索引。聚簇索引使我们可利用存储块中的记录物理聚簇的优点,加快查询速度
。下面具体谈一点实践体会。
前不久,笔者参加了一个在国内开发的国外数据库应用系统的编程工作。该系统后台
使用Oracle 7.3数据库,Oracle的DBMS处理SQL执行语句的顺序如下:
(1) 根据WHERE子句选择行;
(2) 根据GROUP BY子句对这些行进行聚合;
(3) 对每一分组用组函数计算结果;
(4) 根据HAVING子句选择和排除分组;
(5) 根据ORDER BY子句中的组函数所得的结果对组进行排序。
这是一个体现查询优化思路的执行顺序,它对查询的性能具有直接影响。一般来说,
被WHERE子句滤去的记录越多,查询速度就越快。因为减少了在GROUP BY运算中必须处理
的行数量。在这次工作中笔者的体会如下。
1. 尽量避免连接
例如:
PowerBuilder 5.0数据窗口在选择库表时自动把各个表中的相同属性名(域也相同)
连接起来,如图所示:
@@0644900.JPG;图1@@
这种自动连接多数情况下是有益的,但有些情况却需要取消连接。如查询条件为P20
00、P3000、P4000的有效区分都为1,这时有两种方法:
(1) WHERE(P2000.有效区分=P3000.有效区分
  P3000.有效区分=P4000.有效区分
P2000.有效区分=1
)
(2) WHERE(P2000.有效区分=1
P3000.有效区分=1
P4000.有效区分=1
)
第一种方法在自动生成的基础上添加P2000.有效区分=1就可以了,第二种方法先要取
消连接,然后再重新写WHERE语句。表面看,第一种方法简单,其实第一种方法大大降低了
执行效率,因为它有不必要的连接。所以笔者在这里提醒使用者,不要为了一时省事而降
低了系统的效率。
2. 选择最佳的解决方案
解决同一问题的方法固然很多,但应用中应该选择最佳的解决方法。例如,对某一问
题的数据库查询有两种方法,执行结果一样,效率却不同。
这个问题是这样的:
@@0644901.JPG;图2@@
查询要求是:如果在程序运行界面上输入了负责人代码(放到code中),那么将查询P2
000表中负责人代码等于code的负责人名;如果没有输入负责人代码,那么查询P2000表中
所有负责人名。负责人代码的取值范围是0~9999,两种解决方法分别是:
(1) IF 没有输入负责人代码 THEN
code1=0
code2=9999
ELSE
code1=code2=负责人代码
END IF
执行SQL语句为:
SELECT 负责人名
FROM P2000
WHERE 负责人代码>=:code1 AND负责人代码
  <=:code2
(2) IF 没有输入负责人代码 THEN
  执行SQL语句为:
 SELECT 负责人名
FROM P2000
ELSE
code= 负责人代码
执行SQL语句为:
SELECT 负责人代码
FROM P2000
WHERE 负责人代码=:code
END IF
第一种方法只用了一条SQL语句,第二种方法用了两条SQL语句。在没有输入负责人代
码时,第二种方法显然比第一种方法执行效率高,因为它没有限制条件;在输入了负责人代
码时,第二种方法仍然比第一种方法效率高,不仅是少了一个限制条件,还因相等运算是最
快的查询运算。分析到这里,读者优劣自明。
此外,Oracle提供存储过程功能,它是编译好、优化过、且存储在数据库中的SQL语句
和控制流语言的集合,如果利用好存储过程,可极大地增强SQL语言的功能、效率和灵活性

以上着重从实现的角度讨论了查询优化,实际上要想根本解决查询优化问题,还需从
设计上进行优化,如尽量使用大的内存,数据可适度冗余,库结构优化,对于频繁使用的表
建立索引,面向对象的数据库设计方法等等。

分享到:
评论

相关推荐

    数据库高级优化技术

    数据库高级优化技术。 在运用这些高级优化技术之前,必须先对数据访问与表连接进行优化,只有在无法通过其他途径提升性能的时候,才建议使用这里介绍的高级优化技术。 物化视图 视图是一个虚拟表,每次访问他都会...

    数据库系统之查询处理与优化.pdf

    执⾏分布式数据库查询时,导致数据传输量⼤的主要原因时数据间的连接操作和并操作。 查询优化 同⼀个SQL查询语句的不同关系代数表达式,它查询代价时不同的,可以根据关系代数表达式的等价转换,将关系代数表达式...

    columbia:针对大型复杂联接查询的高效数据库查询优化器

    哥伦比亚针对大型复杂联接查询的高效数据库查询优化器对于在线分析处理(OLAP)和大数据仓库的查询功能的新兴趣,给商业关系数据库中的当前优化器带来了新的挑战,而事实证明,这些优化器通常不足以满足这些应用程序...

    数据库原理(第5版)

    ● 结构化查询语言(SQL) ● 数据建模 ● 数据库设计 ● 数据库管理 由于当前Internet、World Wide Web和分析工具的广泛使用,因此另外增加两个基本概念: ● Web数据库处理 ● 商业智能(BI)系统 像Colin这样的用户...

    分布式数据库试题及答案.doc

    5.1.3. 利用左深树、右深树、浓密树来进行查询优化的各自特点 29 5.1.4. 试解释影响并行数据库系统中并行算法性能的三个因数 30 5.1.5. 简述用爬山算法进行查询优化的基本思想 30 5.2. 下面是某个公司一个人事关系...

    MySql数据库优化之SQL和索引的优化

    索引的优化是面试中数据库部分可以说是必问的问题,这个和平时的积累有关。本文详细介绍了SQL和索引的优化。     目录 1 索引的执行分析 1.1 单表的查询索引的执行过程及优化-普通查询 1.2 单表查询索引的执行过程...

    SQLServer2008查询性能优化 2/2

    7.1 统计在查询优化中的角色 161 7.2 索引列上的统计 162 7.2.1 更新统计的好处 162 7.2.2 过时统计的缺点 164 7.3 在非索引列上的统计 165 7.3.1 在非索引列上统计的好处 166 7.3.2 丢失非索引列上的统计的...

    图数据库查询与算法正确性验证讲解ppt

    三、图计算与图数据库的区别 - 静态数据与动态数据 - OLAP与OLTP - 单边图与多边图 - 属性过滤 - 数据持久化 - 应用场景 - 数据一致性 - 图算法丰富度 - 查询接口或语言 四、图计算结果错误原因和验证方法 - 结果...

    graphql-compiler:将复杂的GraphQL查询转换为优化的数据库查询

    graphql-compiler:将复杂的GraphQL查询转换为优化的数据库查询

    数据库系统概论【史嘉权】

    数据库语言SQL(包括最新标准 SQL2和SQL3)及其系统环境、关系数据库设计理论及数据库设计、面向对象的对象定义语言和对象查询语言、以及查询优化和并发控制。 本书以关系数据库为基础,以数据库的设计与编程为重点...

    数据库设计培训.pptx

    数据库设计概述 什么是数据库设计 数据库设计是指对于一个给定的应用环境,构造(设计)优化的数据库逻辑模式和物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的应用需求,...

    研究生分布式数据库考试试题及其答案

    4.1.2. 半连接方法和枚举法各适用于何种查询优化情况. 25 4.1.3. 分布式事务有哪些基本性质. 25 4.1.4. 什么是2PL协议 25 4.2. 下面是某个公司的人事关系数据库的全局模式: 25 4.2.1. 将全局模式进行分片,写出分片...

    海量数据库解决方案_韩国_李华植

    第1部分中以影响数据读取效率的所有要素为类别,对其各自的概念、原理、 特征、应用准则,以及表的结构特征、多样化的索引类型、优化器的内部作用、优化器为各种结果制定的执行计划予以详细说明,并以对优化器的...

    Oracle数据库SQL语句优化策略

    ORACLE 试图将其转换成多个表的连接,如果转换不成功则先执行IN里面的子查询,再查询外层的表记录,如果转换成功则直接采用多个表的连接方式查询。由此可见用 IN的SQL至少多了一个转换的过程。一般的SQL都可以转换...

    数据库系统概述.doc

    第5章 查询优化和并发控制 【考试目的】 考核考生对查询优化的策略、方法和步骤理解和掌握的情况以及对并发控制的有关 协议的理解情况。 【考试的知识点】 1.查询优化的一般策略。 2.关系代数的等价变换规则。 3...

    数据库设计模板.docx

    7 7 优化 7 8 数据库管理与维护说明 7 引言 编写目的 本文档是时代集团产品跟踪平台 概要设计文档的组成部分,编写数据库设计文档的目的是:明确数据库的表名、字段名等数据信息,用来指导后期的数据库脚本的开发,...

    Firebird数据库中文版

    把数据库从一个平台转到另一个平台,非常的容易,只要备份数据库,然后,再到另一个平台上恢复即可 可连接性: Firebird 支持一系列的连接方法,目前,可以通过原生的DELPHI,C++组件连接,也可以通过ODBC,JDBC,...

    ACCESS数据库系统概述

    玩转Access数据库》共12章,介绍了Access数据库概述、Access数据库学习方法、表与字段属性、创建“人力资源管理系统”基础表、编辑各表之间的关系、创建查询、高级查询、创建窗体、创建报表、使用宏和VBA、导入与...

    01开源NewSql数据库TiDB Introduction (Feb 2018)

    1.0 版本已经从基于规则的查询优化器转向基于代价的查询优化器,但是还不够完善,在 2.0 版本中,一方面优化统计信息的精确度以及更新及时程度,另一方面提升 SQL 优化器的能力,对查询代价的估算更加精准、对复杂...

Global site tag (gtag.js) - Google Analytics