- 浏览: 1010617 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (394)
- OSGI (14)
- 多线程 (10)
- 数据库 (30)
- J2ME (1)
- JAVA基础知识 (46)
- 引用包 (1)
- 设计模式 (7)
- 工作流 (2)
- Ubuntu (7)
- 搜索引擎 (6)
- QT (2)
- Ubuntu下编程 (1)
- 小程序 (2)
- UML (1)
- Servlet (10)
- spring (16)
- IM (12)
- 文档视频转为flash格式在线播放 (19)
- Maven (8)
- 远程调用 (2)
- PHPRPC (1)
- EXTJS学习 (2)
- Hibernate (16)
- 技术文章 (38)
- flex (5)
- 海量数据处理 (5)
- FTP (8)
- JS (10)
- Struts (1)
- hibernate search (13)
- JQuery (2)
- EMail (3)
- 算法 (4)
- SVN (7)
- JFreeChart (4)
- 面试 (4)
- 正规表达式 (2)
- 数据库性能优化 (10)
- JVM (6)
- Http Session Cookie (7)
- 网络 (12)
- Hadoop (2)
- 性能 (1)
最新评论
-
hy1235366:
能够随便也发一下,你退火算法程序使用的DistanceMatr ...
模拟退火算法总结(含例子)(转) -
梅强强:
感谢分享。。帮大忙了
swftools转换文件时线程堵塞问题的解决方法 -
wenlongsust:
openoffice和文件不在同一个服务器上,用过吗?
[JODConverter]word转pdf心得分享(转) -
2047699523:
如何在java Web项目中开发WebService接口htt ...
利用Java编写简单的WebService实例 -
abingpow:
唉,看起来好像很详细很不错的样子,可惜不是篇面向初学者的文章, ...
Spring与OSGi的整合(二)(转)
北工大计算机学院软件工程研究所 程颖
目前,几乎所有的应用程序都要和数据库打交道。通过查询数据库可很容易地获得想
要的数据。但是,令人不满意的是:某些查询时间长,响应速度慢。究其原因,一是硬件设
备(如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语言的功能、效率和灵活性
。
以上着重从实现的角度讨论了查询优化,实际上要想根本解决查询优化问题,还需从
设计上进行优化,如尽量使用大的内存,数据可适度冗余,库结构优化,对于频繁使用的表
建立索引,面向对象的数据库设计方法等等。
发表评论
-
SQL查询前10条记录(SqlServer/mysql/oracle/sybase)[语法分析] (转)
2011-04-22 00:45 5499这篇文章主要是分析下 ... -
SQL Group by Having 学习(转)
2011-04-19 10:33 1527在select 语句中可以使 ... -
使用PreparedStatement防止SQL注入(转)
2011-04-18 14:58 1823一条效率差的sql语句, ... -
JDBC Class.forName作用(转)
2011-04-13 14:53 1227使用JDBC时,我们都会很自然得使用下列语句: ... -
关于数据库内连接外连接左连接右连接(转)
2011-03-26 19:04 1612内连接:把两个表中数据对应的数据查出来 外连接:以某个表为基础 ... -
数据库事务隔离级别与锁(转)
2011-03-26 18:57 1295一,事务的4个基本特征 Atomic(原子性): 事务中包含的 ... -
PreparedStatement效率为什么高/为什么要使用PreparedStatement代替Statement(转)
2011-03-25 09:28 2798在JDBC应用中,如果你 ... -
浅谈数据库索引(转)
2011-03-23 10:10 1218数据库索引是为了增加查询速度而对表字段附加的一 ... -
漫谈数据库索引(转)
2011-03-23 10:00 1065一、引言 对数据库索引的关注从未淡出我的们的讨论,那 ... -
用SQL语句去掉重复的记录(转)
2011-03-23 01:25 6873海量数据(百万以上) ... -
数据库范式(转)
2011-03-23 01:18 1456当前我们使用的主流数 ... -
mysql中limit的用法详解[数据分页常用] (转)
2011-01-08 16:44 1439在我们使用查询语句的时候,经常要返回前几条或者中间某几行数据, ... -
查询优化的必要性(转)
2010-12-19 09:55 1511查询优化的最终目的是为了提高数据库系统的性能 ... -
Oracle导出数据(转)
2010-12-14 15:33 15171.1 exp 使用方法及 ... -
oracle初次使用
2010-12-14 13:06 1111以前都习惯了使用MySQL ... -
Mysql连接字符串大全(转)
2010-08-15 21:25 4874mysql JDBC 驱动常用的有两个,一个是gj ... -
Mysql的transaction实现(转)
2010-08-15 15:02 1977transaction在数据库编程 ... -
Hibernate 各种数据库的配置(转)
2010-07-22 20:27 16531. MySql连接配置 MySql数据库的hib ... -
左连接、右连接、全连接及区别(转)
2010-05-16 15:23 4330上节我们介绍了表连接,更确切的说是inner joins內连接 ... -
查询重复记录sql (转)
2010-05-16 15:23 1269这是我的一次笔试题,是查询一个表(id,name)中重复的记录 ...
相关推荐
### 数据库查询优化的核心知识点 #### 一、查询优化的重要性 数据库查询优化是数据库管理系统(DBMS)中的关键组件,其目标在于选择最有效的查询执行计划,以最小化资源消耗(如CPU时间、I/O操作)并提高响应速度。...
### 分布式数据库查询优化详解 #### 一、背景与挑战 随着信息技术的快速发展和各行各业对数据处理需求的增加,数据库系统面临着前所未有的挑战。一方面,数据量的急剧增长要求数据库具备更高的存储能力和更快的...
"浅析分布式数据库查询优化" 分布式数据库查询优化是分布式数据库系统中的一个关键技术,旨在提高分布式数据库查询的性能和效率。分布式数据库系统是一个物理上分散而逻辑上集中的数据库系统,使用计算机网络将地理...
分布式数据库查询优化是指在分布式计算环境下,对数据库的查询请求进行性能提升的技术。这种方法主要关注如何提高查询效率,降低查询延迟,保证查询结果的准确性和一致性。查询优化是数据库管理系统中非常重要的环节...
关系数据库查询优化是数据库管理系统中的核心任务,它涉及到如何高效地执行SQL语句,从而提高系统性能和响应时间。本教材主要围绕查询处理的各个方面展开,包括查询处理的定义、执行步骤、相关基本概念以及查询优化...
分布式数据库查询优化方法主要关注的是如何改善查询效率,减少查询成本,以及如何在不同的分布式系统架构中实施有效的查询处理。下面详细探讨分布式数据库的概念、查询优化的目的和基本方法,以及具体的查询优化算法...
分布式数据库查询优化是数据库技术中的一个重要领域,尤其在大数据时代,面对海量数据的处理和分析,高效的查询优化显得至关重要。本文将深入探讨分布式数据库的特点、分布式查询的基本概念以及查询优化的一般过程。...
数据库查询优化器是关系型数据库管理系统(RDBMS)的核心组件,其主要任务是对SQL查询进行分析和优化,以找出最高效的执行计划。优化器通过生成多种可能的执行方案,并根据预估的成本来选择最优的那一个。这个过程...
分布式数据库查询优化技术是提升数据库性能的关键手段,尤其是在互联网行业中,大数据量和高并发的查询需求使得优化显得尤为重要。分布式数据库是由多个分布在不同地理位置的子数据库组成的系统,它提供了高可用性和...
数据库的查询优化是数据库管理中的核心任务之一,它关乎到系统的性能...通过以上这些策略,我们可以有效地优化数据库查询,提高系统整体性能。在实际应用中,应结合具体情况灵活运用这些方法,实现数据库性能的最大化。
在分布式数据库查询优化过程中,主要的代价包括计算代价、CPU和I/O代价以及网络传输代价。计算代价涉及数据处理的计算资源消耗,CPU和I/O代价关注于本地数据存取的性能,而网络传输代价则是针对不同站点间数据交换的...
作者会详细讲解SQL执行计划、查询优化器的工作方式,以及如何通过调整SQL语句、创建合适的索引、使用绑定变量等方式提升查询速度。同时,书中还会涵盖如何使用Oracle的性能分析工具,如Explain Plan、Trace和AWR报告...
分布式数据库查询优化是数据库管理系统在分布式环境下的核心任务,其目标是提升查询性能,缩短响应时间,同时尽量降低总代价,包括CPU代价、I/O代价以及网络通信代价。在分布式数据库系统中,数据分散在多个节点上,...
### 分布式数据库查询优化算法研究与实现 #### 一、引言 随着信息技术的快速发展,数据处理的需求日益增加,特别是在大数据和云计算环境下,分布式数据库系统因其能够提供高可用性、可扩展性和容错能力而变得...
分布式数据库查询优化是当前数据库领域中的一个重要研究方向,尤其是在大型分布式系统中,查询优化成为了影响系统性能和效率的关键因素。随着大数据、云计算等技术的发展,分布式数据库系统得到了广泛的应用,因此,...
本文将深入探讨分布式数据库查询优化算法,并对目前流行的五种算法进行分析。 首先,分布式数据库环境要求数据不仅要在物理上分散存储,还要在逻辑上保持一致性,这就要求查询优化算法必须考虑到数据的分布特性。...
【数据库查询优化研究论文课程设计】的探讨主要集中在如何提升数据库系统的性能,特别是针对SQL查询的效率优化。在OLTP和OLAP应用中,数据库查询是核心操作,高效的查询优化对于银行、企业、政府等组织的数据处理至...