数据库查询范文

2024-05-12

数据库查询范文(精选11篇)

数据库查询 第1篇

关键词:分布式数据库,并行数据库,查询优化技术

近年来,随着信息技术的快速发展,数据库技术应用越来越广泛,已成为信息化建设的核心。目前应用最广泛的数据库主要有两类,分别是分布式数据库和并行数据库。其中,由于网络技术的快速发展,分布式数据库已得到了广泛的应用。并行数据库在许多方面也得到了很好的应用。所以提高数据库的效率已成为迫切的任务。其中,查询是数据库中最常用操作,同时也是用户操纵、维护数据库中的数据的唯一途径。用户对数据库性能的直接感觉就是数据库管理系统对查询的处理是否高效、快速。查询处理的效率在很大程度上决定了数据库管理系统的性能。所以提高查询效率已成为数据库研究的热点。

现在我们看看,查询优化的发展:由CCA公司开发的SDD-1采用的查询优化方法是对逻辑关系用基本的运算操作来缩减;IBM公司设计的R*采用直接连接作为查询处理策略,同时为提高查询效率采用了动态规划的方法;加州大学伯克利分校研制的INGRES采用基于分解的优化算法;ORACLE是一款十分优秀的商业数据库,采用基于代价的优化或基于规则的优化找出一个执行代价较低的执行计划,由于在确定数掘的分布时,引入了直方图来描述数据值的分布而不是假设数据值是均匀分布的,从而大大提高了代价估计的精确度。可见,数据库查询优化已得到了快速的发展,从理论研究到了实践工程应用,并且在实际工程中的作用已经越来越重要了,特别是在实时数据库系统中尤为突出。数据库查询优化已成为数据库发展的一个重要研究方向。论文主要研究分布式数据库的查询优化问题,同时简单介绍并行数据库查询优化的常用方法及发展趋势。

1 数据库查询优化方法详解

为了让大家能清晰的了解数据库查询优化的主要方法,论文从两个方面来研究数据库的优化问题。首先介绍分布式数据库的查询优化技术,在该部分侧重于方法和策略的描述,不涉及到具体的算法。然后,研究一下并行数据库的查询优化技术,在该部分侧重于具体算法的论述。通过这两部分内容,就能较全面的为大家展现数据库查询优化技术的内涵。

1.1 常见分布式数据库查询优化方法

在分布式数据库中,我们进行查询优化的主要目标就是以最小的总代价,在最短的时间内获得所需的数据。它的实现既与通信时间有关,也与局部处理时间相关,根据不同的互连网络状况可以有不同的查询优化策略。总体上,可分为5个方面。

1) 基于关系代数的优化方法:

数据库查询操作的基础就是关系运算,所以利用关系代数变换来实现查询优化是目前最常见的方法。其主要原理就是通过关系代数的等价变换,从而减少查询中的计算量,进而实现查询的优化。主要原则就是在关系运算中尽量避免直接执行运算量较大的笛卡儿积运算,而采用先执行关系代数表达式中的选择和投影操作,后把笛卡儿积操作之前和之后的一连串选择和投影合并起来一起做。这样就能减小运算量。该方法主要用于删除无用数据,从而减小运算,主要作为预处理使用。

2) 基于直接连接查询的优化方法:

该方法的着眼点在于连接,通过研究关系的静态属性来构建一个最好的处理策略和连接顺序。在分布式数据库中,主要采用的优化策略为:

第一种,利用站点依赖信息来实现。就是在关系进行连接运算时,首先将同一站点上的子片段进行连接,然后再传输到目标站点上进行合并。该方法的主要优势是站点间无数据传送代价,并可利用本地索引信息加速连接。第二种是分片和复制算法。该方法就是将查询需要的关系的片段分配到选定的站点上,然后将其它关系进行复制,目的是让选定的站点上都搬出完整的关注,第三步就是在各站点上进行直接连接操作,最好将结合传到目的站点,该方法的主要优势是响应时间更短,但存在数据冗余的缺点。第三种是站点依赖和数据复制结合。该方法结合站点依赖信息和数据复制信息,减少关系片段的复制,使特定查询能以无数据传输的方式进行,从而缩短响应时间。最后一种方法是采用Hash划分策略。该方法采用Hash函数将关系根据连接属性进行片段划分,使得连接的两个关系之间满足站点依赖,以根据站点依赖方法进行连接查询。基于直接连接查询的优化方法由于传输代价太大,所以只适合于查询处理慢,传输快的高速局域网场合。

3) 半连接优化策略:

从上述基于直接连接查询的优化方法的论述中,我们可以看到该方法的主要缺点就是在不同站点间传输的数据量太大,针对这一缺点,开发出了半连接优化策略。该方法的主要特点是通过投影和连接运算可以有效的减少操作关系的大小,从而减少站点之间的数据传输量,以尽可能只传输参与连接的数据,减少了数据传输时间,降低了CPU和磁盘I/O代价,提高了查询效率;但半连接也会导致通信次数的增加和局部处理时间的增加,适用于传输代价高而局部处理时间短的场合。该方法的主要目标是能够有效降低站点间的数据传输量,从而降低网络传输代价,由于半连接不具有对称性,连接顺序的不同会导致中间结果大小的不同,因此基于半连接的多关系分布式查询优化算法的目标就是找到一个最优的半连接执行顺序,使得产生的中间结果最小,以降低网络传输代价,缩短查询响应时间。

为了进一步的提高半连接优化策略的效果,还设计了双向半连接策略和全归约技术。其中,双向半连接策略通过两次半连接将关系R和S完全归约,减少了网络间数据传输的代价,适用于明确要求将关系R和S传送到第三站点进行连接的情况。其中,全归约技术首先将所有关系的前导属性传送到一个站点进行连接操作,再将连接结果中的属性分别传回原节点,对原关系进行归约以得到所有的有效元组,最后将有效元组传送到目的节点进行连接。该方法是对半连接技术的加强,其最大限度的对分布式数据库中的关系进行了归约,在传输过程中只传送查询结果中要包含的元组,减少了传输代价。全归约算法不依赖于关系的静态特性,不需要对静态特性的维护,提高了准确率;不需要搜索对比所有可能的半连接操作程序,并减少了通讯代价。但当一个关系中具有多个连接属性时,多个连接属性投影后得到的临时关系可能会很大,与原关系记录数相差不多,这时传输代价较大。

4) 索引优化:

为提高查询的速度,通常会采用索引技术,该技术能够减少查询搜索的时间,从而优化查询效果。目前在数据库查询优化中主要采用3类索引技术,分别是:散列索引、基于树的索引和位图索引。其中,由于索引表需要占用内存空间,为减小系统开销,一般采用散列索引。散列索引的主要优势就是索引表占用的内存空间小。曾有学者提出“通过散列表保存关系中关键值的上下限记录位置,以确定一个小于整个表的扫描范围,以此减少扫描时间。”,还有学者对散列技术进行了改进,提出了双层的查询优化算法和双项的查询优化算法。其中双层的查询优化方法的主要原理是:通过建立双层散列,在散列表之上再加一次散列,以适应散列表较大时的情况。而双项的查询优化算法中对散列表增加了一个记录号次下限和次上限,以更精确的定位记录所在的区域,并减少删除、修改操作对散列表信息及查询优化效率的影响。

索引技术的本质就是利用添加限制条件来减少扫描的数据量,该方法对局部数据库查询有利,但在分布式数据库中由于建立索引较难,所以一般不采用。

5) 查询优化搜索策略:

上述4种方法是查询优化中最常见的方法,它们能够有效的降低查询处理的时间。但是如何有效的应该这些技术来实现一个最优查询方案是十分复杂的。目前查询策略表示主要有两类, 一类是基于图的查询优化,另一类是基于树的查询优化。其中,基于图的查询优化是目前最常用的搜索策略,它的主要思想是通过关系的静态属性计算两个关系的连接代价,依次将图中代价最小的两个站点进行连接合并,直到无法继续合并为止。如果能将查询台与其它优化策略如半连接结合起来,就能实现更加有效的查询。基于树的查询优化主要目的是生成一棵具有最小代价的查询树,并可通过树中连接操作的并行执行来进一步缩短查询响应时间。但由于在树的搜索算法中没有考虑到连接执行后其它边上的代价会发生改变的情况,即没有考虑到当前连接对之后连接的影响,而且所采用的贪婪搜索策略并不能保证最后的总代价一定是最小的。另外,基于树的搜索算法不适于环查询的情况,当查询图中存在环路时基于树的搜索策略无法满足所有的连接限制条件。

目前我们采用的搜索策略主要分为3类,分别是穷尽搜索策略、随机搜索策略以及启发式策略。其中,穷尽搜索策略是列出所有的组合顺序,并进行比较,这样就能找到最佳的查询方案。但该策略的最大缺陷是由于实际运算的复杂度太大,导致该策略部具有实际应用价值。随机搜索策略就是以一个随机状态作为出发点,并与随机选择的相邻状态进行比较,从而获得更加的状态,通过反复比较就能获得近似的最佳情况。该策略的主要优点是算法的空间复杂度较低,满足工程要求,但主要缺点是时间复杂度很难确定。常用的算法有代改进算法、模拟退火算法。其中,启发式策略具有多项式级的时间和空间复杂度,但其生成的可能并不是最优的查询计划,而是一个近似的最优解。这类算法的典型代表有贪婪算法等,常见的有SDD-1算法。

1.2 常见并行数据库查询优化方法

并行数据库的优化方法是目前研究较深入的部分,对整个数据库查询的优化具有重要的研究价值。从大的方面来看,可以分为4类,分别是基于查询树的传统优化方法、多重加权树优化方法、语义查询优化方法以及基于遗传的优化方法。其中,基于查询树的传统优化方法主要包括基于左线性树的查询优化算法、基于右线性树的查询优化算法、基于片段式右线性树的查询优化方法、基于浓密树的查询优化算法和基于操作森林的查询优化算法。多重加权树优化方法够处理最常用的选择一投影一连接查询,支持多种并行连接算法,包括流水线缓冲区的存储器优化分配算法、数据操作的处理机与存储器优化分配算法和连接操作实现算法的优选算法。语义查询优化方法包括传统语义查询优化方法和基于Agent技术的语义查询优化方法。目前研究较多的是基于Agent技术的语义查询优化方法。该方法利用人工智能中的Agent技术来实现并行数据库查询优化的优化。该方法采用Multi-Agent技术自动查找与给定查询有关的完整性约束条件,然后,修改给定的查询为更有效的等价查询,使得多个关系间连接操作的效率得到很大的提高,从而达到查询所期望达到的减少连接操作、缩短查询时间的优化效果,实现了基于Agent的语义查询优化。基于遗传的优化方法是目前发展较快的一种全局优化方法,它借助于生物学的遗传观点。可以明显的提高个体的实用性,从而实现更加的查询优化效果。

曾有学者对上述几类并行数据库查询优化方法进行了系统的比较研究,他得出的结论是基于遗传的优化方法是效率最高的方法。当然,我们也应看到基于遗传的优化方法方法目前还存在算法过程较复杂的缺点,但我们也必须意识到该方法是很有前途的一种方法。

2 结论

随着信息技术,特别是网络技术的快速发展,人们对数据库的效率要求更高,实时数据库领域尤为突出。查询是数据库操作最普通、最常用的操作之一。提高查询的效率就能明显的提高数据库的效率,所以数据库查询优化技术就越发重要了。论文主要从分布式数据库和并行数据库两个方面来论述数据库查询优化技术。在分布式数据库部分,侧重于方法和策略的研究,主要论述了5个方面。在并行数据库部分,侧重实际算法的介绍,主要介绍了4类算法,并指出基于遗传的优化方法是目前效率最高,最有前途的方法之一。

当然,我们也要认识到查询优化的核心就是减少操作的数据量,从而降低处理的代价。所以,我们在研究中,可以引入更多的人工智能、线性控制以及其其它方面的理论来提高优化的效率。同时,我们还有认识到每类优化策略或方法都有其特殊的应用场合,只有合理的应用优化策略才能实现高效的查询效果。我们可以预测随着相关学科的发展,查询优化技术必将获得更大的发展。

参考文献

[1]邵佩英.分布式数据库系统及其应用[M].北京:科学出版社, 2005.

[2].S.Pramanik, D.Vineyard.Optimizing Join Queries in Distributed Databases[J].IEEE, 1988, l4 (9) :1319-1326.

[3]Chiping Wang, O.K.Li, L.P.Chen.Distributed Query Optimization by One-Shot Fixed-Precision Semi-Join Execution[J].Seventh Interna-tional Conference0n Data Engineering, 1991:756-763.

[4]王小平, 曹立明.遗传算法—理论、应用与软件实现[M].西安:西安交通大学出版社, 2002:123-140.

[5]徐丽萍, 金雄兵, 赵小松.并行数据库查询优化技术研究[J].华中科技大学学报 (自然科学版) , 2006, 34 (3) :11-13.

数据库查询语句优化方法 第2篇

1、没有创建索引,或者没有正确地使用索引。这是最有可能影响数据库查询的原因之一。创建索引是优化数据库查询效率的重要手段。

2、存在死锁的情况,从而导致Select语句挂起,无法返回结果集。

3、返回不必要的列,很多程序员喜欢使用Select * from TableName 来查询表可视图中的数据,* 代表表或视图中所有字段,建议用户在使用Select语句时,只返回必要的列。浪费更多的系统资源,从而影响查询效率。

4、在Select语句中使用Where字句,设置查询条件,只返回必要的记录。

5、在Select语句中使用Top 关键字,限制返回的记录数量。

6、如果在Where字句中使用Like谓词进行模糊查询,则要注意通配符的使用方法。

7、慎用Union关键字,因为它会影响查询的效率。

8、慎用Distinct关键字,因为在结果集中返回重复的记录并不会影响查询的效率。相反,过滤掉重复的记录会浪费查询的时间和系统资源。因此,除非必须如此,不要使用Distinct关键字。

9、如果需要经常对表中的数据进行统计,可以在表中增加一个统计字段,每次表中数据发生变化时,动态更新统计字段。这样,在查询统计结果时,就不需要临时对表中的数据统计计算了。

10、如果需要多次对一个数据量非常大的表中的一部分数据进行查询操作,可以将这部分数据保存到临时表中,然后对临时表进行查询操作。如果需要,可以在临时表上创建索引。

11、在Where字句中,有时使用Between关键字比使用In关键字要快,因为In关键字对其后面的集合中的每个元素进行比较操作。如果必须使用In关键字,则可将频繁使用的值放在集合的前面,从而减少比较的次数。

12、尽量少使用视图,特别是嵌套视图,可以直接从表中获取数据。在开发应用程序时,有时程序员为了方便,设计一个包含很多字段的大视图,无论需要什么数据,都可以通过查询此视图获取到。实际上,最好从表直接获取数据,以避免查询大视图而造成的系统开销。建议使用存储过程代替视图,从而提高执行的效率。

13、如果不需对结果集进行排序,则不要使用Order By字句,因为排序操作会占用系统资源。

14、不要在Where字句中“=”的左侧使用函数和表达式,因为系统将无法应用函数或表达式中的索引。

15、当判断表中包含记录时,使用Exists关键字,而不要使用Count统计表中所有的记录数量。

你的数据库应用系统违反几条建议?欢迎提出更多优化建议!

数据库查询 第3篇

关键技术,包括构建全文索引、构建数据库模式图、查询语言及查询结果生成等等。通过分析相关检索系统的实现策略,给出了面向关系数据库的关键字查询的形式化描述,设计了支持关键字检索的系统架构和核心构成组件,主要包括数据库索引、关键字检索和结果生成。

关键词:关系数据库  关键词查询  数据库索引

1 系统总体设计

人们在求解一个复杂问题时,通常采用的是逐步分解、分而治之的方法。也就是把一个大问题分解成若干个比较容易求解的小问题,然后分别求解。设计一个复杂的系统时,往往也是把整个系统划分为若干个功能较为单一的功能模块,然后分别予以设计、实现,这就是模块化设计。本系统也采用这种模块化设计方式。

图1  面向关系数据库关键字查询系统框图

2 数据库设计

本系统为面向关系数据库的关键字查询系统,在实验中本文选取了IMDB 数据集,为了进行实验,将数据集整理为以下七个表数据结构。

实验数据集(电影信息数据库):

create table Actor(     //演员表

actorname varchar(50) Primary Key ;   //演员姓名key

sex varchar(2);     //性别

mvname varchar(50);    //出演电影或电视剧名

mvyear varchar(10);    //电影上映时间

mvactorname varchar(10);   //电影中人物姓名

position varchar(20);    //电影中人物排名

made varchar(10);   //TV 或是Video

setname varchar(50);     //出演电视剧集名

episode varchar(10);   //出演电视剧集

date varchar(10);     //电视剧播出日期

classification varchar(30);  //(achieve football)

creat table Consume(    //设计师

consumename varchar(20) Primary Key;     //设计师姓名key

mvname varchar(20);     //电影名或电视剧名

mvyear varchar(10);     //上映日期

setname varchar(20);    //电视剧集名

episode varchar(10);   //电视剧集

productiondate varchar(10);  //电视剧播放日期

classification varchar(30);     //(as M...)

made varchar(10);    ///(V/TV/uncredited)

creat table Director(   //导演信息

directorname varchar(20) Primary Key;   //导演姓名key

mvname varchar(20);      //电影或电视剧名

mvyear varchar(10);       //上映日期

setname varchar(20);    //电视剧集名

episode varchar(20);    //电视剧集

made varchar(10);    //(V/TV/VG)

explantaion varchar(30);      //(as M...)

creat table Business(     //投资

mvname varchar(20) Primary Key;      //电影名key

productiondate varchar(20);  //拍摄日期

company varchar(50);      //出品公司

studiodate varchar(50);     //上映日期

masterpiece varchar(1000);///OW

budget varchar(20);      //预算

ad varchar(50);     ///AD

general_revenue varchar(20);   //收入

wg varchar(50);  //WG

creat table Editor(    //编辑

editorname varchar(20)  Primary Key;     //编辑名

mvname varchar(20);       //电影或电视剧名key

mvyear varchar(10);      //上映日期

made varchar(10);   //(V/TV/video)

setname varchar(20);   //电视剧集名key

episode varchar(20);   //电视剧集key

explantaion varchar(30);   //(as M...)

creat table Color {  //颜色信息

mvname varchar(20);    //电影或电视剧名key

mvyear varchar(10);     //上映日期

setname varchar(20);   //电视剧集名key

episode varchar(20);  //电视剧集key

color varchar(20);   //颜色分类color或black and white

explantaion varchar(10); //颜色分类之后的()中有(HD)等,(HD)是高清

Primary Key(mvname,setname,episode);

}

creat table Keyword(     //关键词

mvname varchar(20);    //电影或电视剧名key

mvyear varchar(10);    //上映日期

setname varchar(20);    //电视剧集名key

episode varchar(10);    //电视剧集key

keyword varchar(50);    //关键词

Primary Key(mvname,setname,episode);

3 数据库索引设计

由于关系型数据库对于文本属性上全文索引的支持,所以在文本属性可以直接利用数据库中的全文索引。对于给定的关键字k,全文索引能检索出查询关键字所在位置。

对于数据库中的表属性,构建索引的方式比较简单,依赖于DBMS的IR索引。对于数据库中具有文本属性的列,在该列上建立全文索引。在进行关键字查询时,对于给定的关键字,通过数据库的全文索引,会返回包含该关键字的元组集合。

在进行关键字查询的时候,对于用户给定查询关键字,系统首先要对给定的关键字进行定位,确定关键字所匹配的信息是模式项还是数值项。

例如,关键字{“Color”“Director”}的索引结构如表1所示。

表1  关键字{“Color”“Director”}的索引结构

4 关键字检索设计

在搜索引擎行业,所谓关键字,就是用户在使用搜索引擎时输入的、能够最大程度概括用户所要查找的信息内容的字或者词,是信息的概括化和集中化。关键字检索作为一种易于使用的检索方式,为大量普通用户所喜爱。本文从关键字个数角度介绍现有的关键字检索技术中最常见的单关键字查询和多关键字查询这两种关键字检索形式。

5 结果生成设计

在本文中,将查询结果定义为元组连接树。

元组连接树(Joined Tuple Tree)是给定一个数据库模式图GS,一个元组连接树T是一棵元组树。其中,T中的每一条边(ti,tj)(ti∈Ri,tj∈Rj)满足以下两个要求:

①(Ri,Rj)∈RS,

②ti∞tj∈Ri∞Rj。

同时这些元组连接树满足以下条件:

①完整性:用户提交的所有关键字均出现在元组连接树上;

②最小性:从元组连接树中移除任何元组后的元组连接树都不具有完整性。

6 结束语

通过分析相关检索系统的实现策略,设计了支持关键字检索的系统架构和核心构成组件,主要包括数据库索引、数据库模式图、关键字检索和结果生成。

参考文献:

[1]吴清怡,马良荔,孙煜飞.基于数据关系表的XML查询算法[J].辽宁工程技术大学学报(自然科学版),2013(01).

[2]林子雨,杨冬青,王腾蛟,张东站.基于关系数据库的关键词查询[J].软件学报,2010(10).

数据库查询优化策略分析 第4篇

1 基于SQL查询语句的查询优化办法

在SQL中要提高查询效率,除了提高网速、把数据、日志、索引放到不同的I/O设备上,以增加读取速度等措施以外,对查询语句进行优化也是常用的提高查询效率的办法。从用户的角度实现查询优化主要是通过对SQL语句进行调整,减少计算量,提高查询。以下就对SQLServer数据库查询方法作一下探讨。

1.1 合理建立和使用索引

索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下:

1)在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。

2)在经常进行连接的列上建立索引,而不经常连接的字段则由优化器自动生成索引。

3)不要对只有有限几个值的字段建立单一索引。例如若对“性别”字段建立了索引不但不会提高查询效率,反而会严重降低更新速度。

4)如果等待排序的列有多个,就在这些列上建立复合索引(compound index)。

1.2 避免相关子查询

查询嵌套层数每增加一层,查询的效率成几何级的降低。要想提高嵌套语句的执行效率,应减少嵌套语句的嵌套层次。所以在实际应用中,使用连接查询代替子查询可以提高效率。

如:查询选修了05号课程的学生基本信息,用子查询得方法如下所示:

改成连接查询如下:

1.3 数据类型的优化

数据类型的优化中最主要的问题就是在WHERE子句中对具有不同类型的属性的比较。例如float与int,char与varchar,binary与varbinarv,money与int是不兼容的,因此要求

WHERE子句中表达式的数据类型是兼容的。例如,有如下SQL语句:

由于WHERE子句中,字段price是货币(money)型字段,而20是整型数,优化器无法对其进行优化,只有耗费一定的时间将整型数20转化成money型字段后,才能进行优化,才能与字段price进行比较因此,在编程时可将整型数20先转化成money型字段,而不要等到运行时由系统来转化,即语句改为:

1.4 对多个表查询时,将返回结果集记录数较少的表放在后面

对多个表格进行查询操作时,FROM子句中表格的次序也影响查询的响应速度。设学生档案管理系统中有一个表students,还有一个与students结构类似的表students1,students中2010年9月5号入学的学生有1000个,students1中2010年9月5号入学的学生有200个,若要查询students和students1两个表中2010年9月5号入学的学生,则SQL语句将返回包含所有1200个记录的表,相应的SQL查询语句如下:

在具体的执行过程中,先对表格students进行选择运算,得到1000个记录的临时表,再对students1进行选择运算,然后将得到的符合条件的200个记录插入到1000个记录的临时表中,需200次插入运算。若将FROM语句后面的表次序对换,即为“FROM Students1,Studentds”,则先得到一个200行的临时表后,需要做1000次的插入运算,其工作量远大于第一种情况,故可将返回较少记录的表格排在后面,较多记录的表格排在前面,以便减少插入运算。

1.5 使用临时表优化查询

在涉及相关查询得某些情形中,构造临时关系可以提高查询效率。

如:查询每个部门中月工资最低的“职工编号”

Select职工编号from职工as al where月工资=(select min(月工资)from职工as a2

where a1.部门号=a2.部门号)

以上查询对于外层职工关系a1中每一个元组,都要对内层整个职工关系a2进行检索,

查询效率不高。但是可以通过构建临时关系的方法提高查询效率:

Select min(月工资)as最低工资,部门号into temp from职工group by部门号

Select职工编号from职工,temp where月工资=最低工资and职工.部门号=temp.部门号

2 通过优化器实现查询优化

实际的DBMS对查询优化的具体实现方法不尽相同,一般地可以归纳为四个步骤:

1)将查询需求转换成某种内部表示,通常是语法树。

2)根据一定的等价变换规则把语法树转换成标准形式。

3)选择低层的操作算法。对于语法树中的每一个操作需要根据存取路径、数据的存储分布、存储数据得聚簇信息来选择具体的执行算法。

4)生成查询计划。查询计划也称执行方案,是由一系列内部操作组成的。这些内部操作按一定的次序构成查询的一个执行方案。通常这样得执行方案有多个,需要计算每个执行方案的执行代价,从中选择代价最小的一个。

通常对优化器的查询优化都是基于第2个阶段的,由原查询开始,优化器对查询形式进行转换,直至它认为所得到的形式一句某些启发式规则已经是最优的为止。

3 结束语

随着数据库技术的发展,数据库系统占据着越来越重要的地位。现代数据库规模越来越大,数据量呈指数级上升,数据库查询性能的优化越来越引起人们的重视。从大多数系统的应用实例来看,查询操作在各种数据库操作中所占据的比重最大,而查询操作所基于的SELECT语句在SQL语句中又是代价最大的语句。如果数据的量积累到一定的程度,全表扫描一次往往需要数十分钟,甚至数小时。如果采用比全表扫描更好的查询策略,往往可以使查询时间降为几分钟,由此可见在系统的开发过程中,充分利用SQL查询语句的基本优化方法,可以明显的提高SQL查询语句的执行效率。

参考文献

[1]萨师煊.数据库系统概论[M].北京:高等教育出版社,2003.

[2]黄维通.SQLServer简明教程[M].北京:清华大学出版社,2002.

[3]尹萍.SQLServer数据库性能优化[J].计算机应用与软件,2005,22(03).

年整理数据库嵌套查询实验报告 第5篇

实验目的 :

加深对嵌套查询语句的理解。

实验内容:

使用 IN、比较符、ANY 或 ALL 和 EXISTS 操作符进行嵌套查询操作。

实验步骤:

一.使用带 N IN 谓词的子查询

1.查询与’刘晨’在同一个系学习的学生的信息: 比较 select * from student where sdept in

(select sdept from student where sname=“刘晨”)与: select * from student where sdept =

(select sdept from student where sname=“刘晨”)的异同

比较: select * from student where sdept =

(select sdept from student where sname=“刘晨”)and sname <> ‘刘晨’ 与: select S1.* from student S1, student S2 where S1.sdept=S2.sdept and S2.sname=“刘晨”的异同

2.查询选修了课程名为’信息系统’ 的学生的学号和姓名: 比较 select sno, sname from student where sno in(select sno from sc where cno in

(select cno from course where cname=“信息系统”))与: select sno, sname from student where sno in

(select sno from sc, course where sc.cno=course.cno and cname=“信息系统”)

3.查询选修了课程’1’和课程’2’的学生的学号: select sno from student where sno in(select sno from sc where cno=“1”)and sno in(select sno from sc where cno=“2”)

比较: 查询选修了课程’1’或课程’2’的学生的 sno: select sno from sc where cno=“1” or cno=“2”

比较连接查询:

select A.sno from sc A, sc B where A.sno=B.sno and A.cno=“1” and B.cno=“2”

二.使用带比较运算的子查询 4.查询比’刘晨’年龄小的所有学生的信息: select * from student where sage<

(select sage from student where sname=“刘晨”)

三.使用带 Any, All 谓词的子查询 5.查询其他系中比信息系(IS)某一学生年龄小的学生姓名和年龄;select sname, sage from student where sage

(select sage from student where sdept=“IS”)and sdept<>“IS”

6.查询其他系中比信息系(IS)学生年龄都小的学生姓名和年龄: select sname, sage from student where sage “IS”

7.查询与计算机系(CS)系所有学生的年龄均不同的学生学号, 姓名和年龄: select sno,sname,sage from student where sage<>all(select sage from student where sdept=“CS”)

四.使用带 s Exists 谓词的子查询和相关子查询

8.查询与其他所有学生年龄均不同的学生学号, 姓名和年龄: select sno,sname,sage from student A where not exists(select * from student B where A.sage=B.sage and A.sno<>B.sno)

9.查询所有选修了 1 号课程的学生姓名: select sname from student where exists(select * from sc where sno=student.sno and cno=“1”)

10.查询没有选修了 1 号课程的学生姓名: select sname from student where not exists(select * from sc where sno=student.sno and cno=“1”)

11.查询选修了全部课程的学生姓名: SQL Server 中:

select sname from student where not exists(select * from course where not exists(select * from sc where sno=student.sno and cno=course.cno))

11.查询至少选修了学生 95002 选修的全部课程的学生的学号: SQL Server 中: select distinct sno from sc A where not exists

(select * from sc B where sno=“95002”and not exists(select * from sc C where sno=A.sno and cno=B.cno))

12.求没有人选修的课程号 cno 和 cnamecname: select cno,cname from course C where not exists(select * from sc where sc.cno=C.cno)

13*.查询满足条件的(sno,cno)对, 其中该学号的学生没有选修该课程号 cno的课程 SQL Server 中: select sno,cno from student,course where not exists(select * from sc where cno=course.cno and sno=student.sno)

14*.查询每个学生的课程成绩最高的成绩信息(sno,cno,grade): select * from sc A where grade=(select max(grade)from sc where sno=A.sno)

思考: 如何查询所有学生都选修了的课程的课程号 cno? select cno

from sc

group by cno

数据库查询 第6篇

关键词:海量数据;多数据库;表分区;分表技术

中图分类号:TP311.131文献标识码:A文章编号:1007-9599 (2010) 14-0000-03

Massive Data Query Optimization Research and Application Based on Data Partition

Jia Junkai1,Xu Hui1,Gu Guoqiang1、2

(1.Donghua University,School of Computer Science,Shanghai200051,China;2.Shanghai Triman Informatin&Technology Co.,Ltd.,Shanghai200051,China)

Abstract:The low efficiency of massive data data query,comparison and analysis of a variety of massive data query optimization solutions,advantages and disadvantages,division massive data based on data query performance optimization.The method uses multi-database processing,table partitioning,sub-table technology will be in three dimensions the data stored in the data division,reducing the size of massive data queries.After large-scale experiments that the method improves the efficiency of massive data queries.

Keywords:Massive data;Multi-database;Table partition;Points table technology

在面对海量数据时,用户关心的是如何从其中查询出对自己有价值的信息而非海量数据本身,如何使查询海量数据的性能更为高效是目前国内外数据库系统研究的热点问题。

在海量数据查询优化策略有:一:代数优化;它对查询语句进行变换以减少语句执行开销[1]。二:规则优化;它是根据启发式规则选择执行策略[2]。两种方法的不足表现在:当数据量规模超出系统软硬件处理能力时,通过优化语句很难提升查询性能。三:物理优化;它是选择合适的存储策略进行的优化,但是在对语句的执行效率考虑不足。四:代价估算优化。它是对已经存的优化策略进行代价估算,选择最小的执行代价策略[3]。不足:计算最小执行代价耗费时间过多且实用性不高。

目前的海量数据查询性能低下大都是由于数据的规模超出系统的软硬件处理能力。本文利用多数据库中间件插件技术在存储海量数据时将数据划分存储到多个自治的数据库中,在一维上降低数据规模并优化查询语句;在本地数据库中运用表分区技术,将海量数据划分存储到多个表分区中,在二维上降低海量数据的规模;利用分表措施将分区表分成多个子表,再次降低海量数据的规模。通过对海量数据的三维划分、优化查询语句以及降低数据的扫描规模提高了海量数据的查询性能。

一、数据划分

数据划分是指按照某种规则将数据分布到特定范围内,使得在对数据进行查询时系统并行处理能力提高,以此降低查询的响应时间,提高数据库的查询性能。数据划分对于能否充分利用系统的cpu和带宽资源,减少通信开销,平衡系统负载和减少计算量,最佳的发挥并行性和系统性能至关重要[4]。

(一)多数据库并行处理技术

多数据库并行处理技术是以中间件为技术支撑,对海量数据进行合理存储,高效查询的一种技术。多数据库并行处理结构如图a所示:

当用户提出加载请求时,通过负载均衡系统将请求均衡的分发给并行加载服务,并行加载服务首先读取全局数据字典中的元数据,通过数据划分器和表加载器将数据加载到底层数据库中,当用户提出的查询服务时,系统将请求发给并行查询服务,并行查询服务首先读取全局数据字典用于获得多数据库的配置信息,然后通过查询语句改写服务优化查询语句并发送给查询服务器,用以完成数据的查询功能。

多数据库并行查询技术通过中间层组件对查询语句进行分析、优化,根据分析的结果将查询分解或者复制为多个等价的子查询,将多个子查询语句在相应的数据库节点上执行,它降低了每个本地数据库的查询规模,并实现查询的本地化并行查询,提高了数据的查询效率。

(二)表分区

针对底层数据库数据查询规模大的问题,对其特定业务的查询条件属性做表分区,以提高查询的性能。图b为根据时间将底层数据库中的数据进行表分区的示意图。

由图可知,经表分区后,数据在数据库中按一定的规律存放。当进行数据查询时,系统只需扫描存放数据的响应表分区,因而查询扫描规模可以大大降低,数据查询性能也会得到相应的提高。

当分区的规模较大时,在海量数据库中无法有效降低数据规模,这样的数据划分无意义;当用户分区规模较小时,在进行多数据查询时,会涉及到多个表分区,查询性能也难以提高。因此表分区的粒度需要优先考虑两方面:一是数据的存储规模;二是用户的查询粒度。

(三)分表技术

1.原理。

在分区表的基础上,将表根据所查找的属性字段划分成为多个子表,利用数据库的Union ALL视图将需要查询的子表动态的合并起来,使对原表的查询转化为对视图或者子表的查询,以此降低数据查询的扫描规模。

2.算法。

输入:业务层提交给中间层的查询语句;

输出:语句改写后的查询语句;

流程:

(1)将业务层提交的查询语句提交给语法分析器;通过语法分析器截取where子句后的条件表达式。

(2)分析条件表达式中是否含有与分表字段有关的条件。当不包含分表字段时返回原语句,算法结束;否则提取该字段。

(3)根据提取的字段分析其涉及到的数据范围,找到相对应的视图或者子表。

(4)将原语句中from子句后的原表改为3得到的视图或者子表,此时得到查询语句a。

(5)去除a中与分表有关字段的条件,返回改写后的查询语句,算法结束。

二、数据划分性能分析

(一)数据库级别的数据划分

通过中间件,将复杂查询语句转化为简单查询,将的串行查询改为在各个本地库上的并行查询。如果将数据分布到各个数据库中,此时需要的网络和磁盘I/O开销会非常的大,通过中间组件服务在数据加载时预先进行数据布局,在对大规模的数据进行处理的时候,不需要将中间结果在局部数据库之间的网络上进行传输,可以极大提高并行处理的性能。

(二)数据库表级别的数据划分

为更好的分析数据划分对查询性能的作用,建立以下场景:设有结构为TB{RID,CSDZ,XZDZ,CJSJ,NRXX}的表,RID为主键,CSDZ和XZDZ为二维空间属性,其各自的值域为0-31,CJSJ为时间属性,NRXX为内容信息属性。

通过表分区的方式将其按照时间来进行数据划分。由于数据量大并且查询针对小时范围较为频繁,选取按小时对海量数据进行表分区。

不考虑物理存储的条件下:

假设a查询扫描同等数据规模所花费的时间相同。

假设b查询的响应时间仅仅考虑数据的扫描时间。

假设c查询数据划分的各部分时能充分并行。

对于基于表分区的数据划分:

查询时间间隔为n小时的数据时,理想条件下,数据被平均的分成24分,这样查询扫描的数据在规模上减少到n/24;在假设a和假设b的条件下,查询的响应时间会减少到n/24,在查询性能上提高了24/n倍。实际情况下,数据不可能被完全的平分,这样查询扫描的数据在最坏情况下受到最大表分区规模的制约。

对于基于分表的数据划分:

设关系R为CSDZ和XZDZ之间组成的关系,关系R可以划分成多个子关系Rc_x,在CSDZ和XZDZ的数据划分基础上,针对全表的查询,在假设c成立的条件下,其查询性能受限于最大子关系的数据规模上。假设最大子关系的数据规模为m,总的数据规模为v,在上述假设都成立的情况下,查询性能的响应时间减少为原来的m/v,性能提高了v/m;考虑数据结果合并的开销,设原来查询相应时间为T,查询处理时间为T1,查询合并时间为T2,则T=T1+T2。基于上述分析,T1的时间减少为原来的m/v,查询合并时间不变,则经过数据划分后查询的响应时间为m/v*T1+T2,其查询性能提升T1+T2/(m/v*T1+T2)。

在考虑物理存储的条件下:

假设rownum为原表中信息总数,length为每条记录的长度,k为子关系的个数,ROWNUMi为子关系i的信息总数。在数据划分之前,设q为查询的总时间复杂度,则q=O(rownum*length)。设q1为数据划分后的查询总时间复杂度,q2为所有子关系的查询时间复杂度总和,q3为返回合并结果的时间复杂度。则q1=q2+q3。因海量数据查询时查询的响应时间远远大约返回合并结果的时间复杂度,即q3<

三、海量数据划分策略的总体架构

通过对数据划分的理解以及对数据划分性能的分析,本文提出基于数据划分策略的海量数据查询模型总体架构分为如图c所示:

底层是各种异构数据库,通常我们称之为“本地数据库”;此层主要用来存放海量数据,并在此层实现表分区、分表的数据划分。中间层是一个基于CORBA标准的事务处理“中间件”层。它的作用是优化数据的存储结构,改写语句的执行策略。上层为业务层,为中间层提供数据和查询语句来源。

该架构数据划分存储到多个自治的数据库中并优化查询语句的执行效率,在底层数据库中用表分区、分表减少数据规模以期提高查询效率。

四、试验

试验一:

试验方案:在公安系统中的oracle9i数据库中选取一组集群,在集群中建立一张TB表,同时建立1000张与TB表相同表结构的子表,其表命名为TB1-TB1000。将数据量为1TB的数据导入到TB表中,并将这1TB的数据平均划分然后导入到1000张子表中,同时将子表动态的组成一张和TB表相同的视图。对TB表和视图分别进行大规模数据查询。

本试验的目的在于测试相同数据规模下单表查询和对多表建立的视图查询的数据查询性能对比,因此在视图查询时不采用并行查询方式,仅测试多表建立的全局视图对查询性能的影响。

试验结果:在数据规模都在80000万的条件下,在串行条件下,对无索引的时间进行顺序扫描,单表扫描的时间大约为十五至二十分钟多分钟,而对分表建立的索引所花费时间要超过二十五分钟;对分表属性进行查询时,二种方式的查询都不超过三分钟。当调整查询方式为并行查询,并行度为10时,对时间的扫描,二者都约三分钟。对内容字段的查询,二者在查询性能上差别不大。

试验结论:在相同规模的海量数据情况下,虽然通过对分表建立统一视图会导致存储空间的增大,但是不明显。并行全视图扫描在查询性能和单表查询达到相同的水平,因而得出结论分表视图的方案可行。

试验二:

方案:在试验一得基础上,通过中间件的并行查询服务对TB表进行单向匹配、双向匹配、不同属性值之间组合的统计查询。

试验结果:

结果分析:在三类查询中除测试c中的一般查询外,分表后的查询相应时间都比为分表后的响应时间短。测试c的一般查询涉及到未进行分表的内容字段,此时会受到文本索引的影响,同时查询结果会在局部的数据库之间传递,此时网络通信时间会占据数据查询响应时间的大部分时间。在对常用的分表字段进行条件查询时,因对数据的扫描规模降低,数据查询相应时间会小于未分表的查询相应时间。进而证实了多维数据划分查询优化方法的可行性。

五、结论

通过对海量数据查询的优化与性能的分析,基于数据划分策略的海量数据优化方法解决了因数据规模在系统的软硬件处理能力之外所造成的数据查询性能低的问题。查询性能得到大幅提升。

数据划分中的分表技术将原表转为子表,子表太多会使系统I/O的次数剧增,造成数据查询性能降低。因此我们要不断的总结、探索找到子表个数的峰值,使得系统充分利用并行性的时候数据的查询性能最高。

参考文献:

[1]朱宁贤.数据库查询的优化策略探讨.办公自动化杂志,2007,8

[2]王能斌.数据库系统.电子工业出版社,1998

[3]韩忠,汪伟.海量数据的查询优化.科技资讯,2006,10

[4]侯潇.海量数据处理中基于数据划分的查询优化研究与实现,2007,11

[5]陈光.多数据库事务处理策略的研究,2000,4

数据库查询优化策略探究 第7篇

关键词:DBMS,查询优化,优化策略

数据库技术作为信息管理系统的核心技术, 在信息处理领域越来越受到重视。在数据库系统的各种操作中, 其中数据库的查询操作是其核心操作, 是最重要的, 也是最复杂的。SQL (Structure Query Language) 作为国际标准的数据库查询语言, 其核心功能就是查询技术。目前主流的DBMS均支持SQL语言或者有与SQL的接口软件。所以, SQL语句的执行性能的高低直接影响着数据库应用系统的运行效率。因此, 优化SQL查询语句, 可以节省数据查询操作的时间和空间, 提高效率。

一、实现DBMS查询优化的常用策略

数据库查询优化的总目标是:选择有效的策略, 求的给定关系表达式的值。关系运算理论是SQL语言的理论基础。关系代数语言是以集合操作为基础的语言。查询优化的步骤为: (1) 首先, 给出SQL语句后, 查询优化器对查询语句先需要做代数优化和存取路径的优化。 (2) 其次, 由预编译模块对语句进行处理并生成查询规划。 (3) 最后, 在合适的时间提交给系统处理执行。也就是由DBMS确定合理的有效的查询策略, 这称为DBMS的查询优化。查询优化一般会常用以下几种优化策略:

(一) 应尽可能先做选择运算, 以得到较小的中间结果。

这是查询优化策略中最重要也是最基本的一条。选择操作就是根据选择条件对关系做水平分割, 即选取符合条件的元组 (记录) 。先做选择操作, 可以大大减少中间结果, 减少运算量, 后面其他运算的运算时间也大大减少。

(二) 在执行连接操作的时候, 首先对关系进行预处理。

预处理的一般方法就是对关系建立合适的索引或者排序。现在的DBMS一般都是采用索引的方法。索引是数据库操作中重要的数据结构。其使用原则如下: (1) 在经常进行连接但没有指定为外键的列上建立索引, 这样的列一般是关系中的关键字, 而不经常连接的字段则由优化器自动生成索引。 (2) 在频繁进行分组group by操作或排序order by操作的列上建立索引。 (3) 在条件表达式中经常用到的重复值较少的列上建立索引, 在重复值较多的列上不要建立索引。如果在重复值较多的列上建立索引, 不但不会提高查询效率, 反而会严重降低更新的效率。 (4) 如果是多关键字排序, 可以建立复合索引。

(三) 对同一个关系进行的选择运算和投影运算应该尽量的同时进行。

如果选择和投影运算都是针对同一个关系的, 可以对关系连续做一串操作, 即同时计算一连串的选择和投影操作, 以免多次扫描文件, 从而节省时间。

(四) 对关系的一个子集排序并且创建临时表, 能加速查询。

创建临时表有助于避免多重排序操作, 还能简化优化器的工作。临时表是主表的子集, 其行和列要比主表中的行和列少, 而且元组物理顺序就是所要求的顺序, 减少了磁盘输入输出操作, 所以查询工作量可以得到大幅减少。在SQL中, 临时表的建立一般是通过建立视图的方法来实现。需要注意的是:临时表创建后不会反映主表的修改, 在主表中数据频繁修改的情况下, 应该经常更新视图, 以防丢失数据和数据错误。

(五) 应尽量避免对大型表的顺序存取。

在嵌套查询中, 大型表的顺序存取对查询效率可能产生致命的影响。避免这种情况的主要方法就是对连接的列建立索引, 按照索引路径来完成连接运算, 从而可以大大降低连接运算的执行代价。

二、实现SQL语句查询优化的常用方法

SQL语言作为一种非过程化的查询语言, 用户仅表达查询的要求, 而不必描述查询的过程。要想设计高性能的SQL语句, 首先要做到三点: (1) 熟悉所用的DBMS优化器的优化策; (2) 深入理解数据库中的数据; (3) 透彻的分析用户的需求。然后在此基础之上, 才能尝试编写效率最高的SQL语句, 优化程序设计。完整的SQL语句有5个子句构成。其格式如下:

SELECT目标表的列名或列表达式序列;

FROM基本表或视图序列;

WHERE行条件表达式;

GROUP BY列名HAVING分组条件表达式;

ORDER BY列名ASC/DESC;

在SQL语句中, 通过优化各个子句的方法, 同样可以提高查询效率, 下面是在数据库中常用的一些提高SQL语句性能的方法。

(一) SELECT子句的优化方法。

当需要在SELECT子句中列出关系中所有的列时, 使用*是一个很方便的方法, 但是, 这种方法的执行效率很低, 因为在解析这类语句时, 优化器首先要查询数据字典, 将*转换成所有的列名, 这个过程将花费较多的时间, 所以要尽量避免*的使用。

(二) WHERE子句的优化方法。

1. 合理设置WHERE子句中的条件顺序。

因为大部分的SQL语句解析器解析语句的循序都是自上而下的, 所以条件的循序应该是:表和表之间的连接条件必须写在其他条件之前, 而那些可以过滤掉最大数量元组的条件则必须写在WHERE子句的末尾。如果按照条件限制的严格程度设计WHERE子句, 则需要将条件限制最严格的部分放在末尾, 而将条件限制最不严格的部分放在顶部。

2. WHERE子句中对列的任何操作都将导致对表扫描。

如, SELECT*FROM student WHERE substr (sno, 1, 4) =“2006”应改为SELECT*FROM student WHERE sno LIKE“2006%”。应当避免对WHERE子句中的条件参数使用其他数学操作符, 如果WHERE子句中存在一个代数表达式, 那么优化器就不能使用分布统计信息。

3. 避免使用困难的正规表达式。

所谓正规表达式, 是指在SELECT查询语句中LIKE关键字支持的_和%通配符匹的使用。但实际的执行中, 这种正规表达式的匹配非常耗时, 如上例从Student表中查询2006级所有学生信息, 即使在Sno列上建立了索引, 优化器还是会采用顺序扫描方式处理该SELECT语句。可以把SELECT语句改为如下形式:SE-LECT*FROM Student WHERE Sno>‘2006000000’AND Sno<‘2007000000’, 去掉通配符的使用, 改用关系表达式给出条件, 则优化器就会利用索引来执行查询, 显然会大大提高查询速度。

4. 在WHERE子句中应使用子查询时尽量使用EXISTS (NOT EXISTS) 而不是IN (NOT IN) 。

在子句中可以使用两种格式的子查询:第一种格式是使用操作符:Where xi IN (WHERE……….) ;第二种格式是使用操作符:Where xi EX-ISTS (WHERE……….) 。使用EXISTS (NOT EXISTS) , DBMS系统的执行循序是:首先检查主查询, 然后运行子查询直到找到第一个匹配项。这样就节省了时间。如果使用IN (NOT IN) 子查询, 则系统先将主查询挂起, 首先执行子查询, 并将获得的结果列表存放在一个加了索引的临时表中, 待子查询执行完毕, 存放在临时表中以后再执行主查询。因此。使用EXISTS (NOT EXISTS) 要比使用IN (NOT IN) 查询速度快。因此, 在WHERE子句中使用子查询时, 应尽量使用EXISTS (NOT EXISTS) 而不是IN (NOT IN) 。在写SQL语句的时候, 同样也应该尽量用UNION而不是OR操作符, 这样也会起到加快查询速度的作用。

5. 用WHERE子句代替HAVING子句。

HAVING子句很有用, 但是用起来要付出很大的代价。因为HAVING子句的执行将导致SQL语句优化器的额外工作, 从而花费额外的时间, 所以应当尽量避免使用HAVING子句。HAVING子句和WHERE子句类似, 都能根据条件对关系进行筛选.但HAV-ING子句必须配合GROUP BY来进行筛选, 否则没有任何意义, 但WHERE子句可以不带GROUP BY。WHERE子句HAVING子句的执行顺序也略有不同:WHERE子句先根据条件对记录进行过滤而形成结果集, 然后再进行分组 (如果带有GROUP BY) 。而HAVING子句则首先要通过GROUP BY检索出所有记录, 然后才根据条件对结果进行过滤, 其处理过程中还用到排序、总计等操作。所以, 如果能用WHERE子句来代替HAVING子句, 则能较好的减少系统的开销, 提高SQL语句的执行效率。

(三) ORDER BY子句的优化方法。

在ORDER BY子句中, 不要有非索引项或者计算表达式。ORDER BY语句决定了DBMS如何将返回的查询结果排序。在ORDER BY语句中, 如有非索引项或计算表达式, 则将降低查询速度。

(四) 其他优化方法。

利用SQL语句查询, 还有一些优化方法, 例如:合理使用索引, 尽量避免使用排序;简化或避免对大型表进行重复的排序;避免对查询的列使用数学运算;使用临时表加速查询等等。

三、结语

总之, SQL优化的实质就是在结果正确的前提下, 用优化器可以识别的语句, 尽量减少类型转换和计算, 充分利用索引, 减少表扫描的I/O次数, 尽量避免表搜索的发生。查询优化是一个复杂的问题。随着数据库技术的广泛应用, 理解关系数据库查询优化的实现方法, 书写合理的查询计划, 借助于关系数据库查询优化的新技术, 可以使数据库应用系统的性能得到更大程度的提升, 人们的工作效率得到进一步提高。

参考文献

[1].萨师煊.数据库系统概论[M].北京:高等教育出版社, 2004

[2].[美]Microsoft公司著.SQL Server2000资源大全[M].北京:机械工业出版社, 2002, 2

[3].陈建荣, 叶天荣.分布式数据库设计导论[M].北京:清华大学出版社, 1993:86~89

如何进行数据库查询优化 第8篇

据统计, 计算机具有十分强大的查询操作功能, 查询操作是计算机数据库重要的组成部分, 其主要依据select语言在Sql语言中得到广泛应用。一般来说, 如果数据库的量积达到一定的程度, 就会使数据库系统信息存储量达到最大的记录极限时, 再进行测量工作的话, 其测量数据就不能存储到数据库里面, 这时就需要把里面的数据存储到别的地方进行查询。

一、DBMS处理查询计划

在现实的项目中, 许多程序编辑人员在利用一些前端数据库开发工具在进行其程序开发时, 不重视实际查询的效率, 只是对用户界面进行优化, 不具有实用性, 且查询时效率较低, 造成巨大的资源浪费。因此, 设计高效合理的查询程序是进行查询优化的关键环节。在进行查询优化的过程中, 不能错误地认为查询优化只是DBMS的任务, 与程序员编制的SQL语句不存在任何关系。在平时应用查询系统进行查询时, 不能盲目地进行查询, 要根据所要查询的内容, 制定详细的查询计划以便提高数据库系统的使用性能。在计算机的数据库系统中, 根据用户提交的SQL语句的集合制定详细的查询计划, 而查询规划则是经过优化处理后所产生的语句集合。

DBMS处理查询计划首先对查询语句的词法、语法进行检查, 其次将检查的结果传送到DBMS的查询优化器中, 再次对所要查询的语句进行优化及存取的顺序优化之后, 按照编辑的程序模块对语句进行处理并出现新的查询规划, 最后, 根据编辑好程序系统功能来进行数据处理, 用户可得到新的查询结果。据统计, 几乎接近百分之百的客户在应用数据库时都采取对版本较高的产品实行代价的优化方式, 提高了查询的效率, 淘汰了一部分查询落后的查询方式, 对推动数据库查询优化发展起十分重要的作用, 使查询效率高的规划为最终的查询方法。随着我国科学技术不断进步, 数据库产品在查询优化方面取得了长足的发展, 为数据库优化查询提供了重要基础条件, 在实际的数据库系统中, 用户主要以应用系统优化为基础来对所要表达的SQL语言进行提交, 而不去研究怎么对系统进行优化提高查询的效率, 因此, 为了提高查询的效率, 必须对系统进行优化, 使查询系统变得优质高效。

二、查询优化方案

2.1利用索引进行优化。

索引主要为读者提供查询方便, 它是数据库组成的重要组成部分, 通过对索引进行优化可提高查询效率。据统计, 在实际的数据库应用中还是使用IBM以前的ISAM的索引结构形式。对使用索引者来说, 索引怎么方便、快捷, 使用方便是他们的追求, 而不是索引多么复杂、繁琐, 针对不同的查询内容, 要建立不同的链接方式, 在实际的应用中难免会出现没有查询所需的索引, 不经常使用的索引情况出现, 这时可通过查询优化器进行自动生成的索引进行查询。对于经常使用的列需要进行排序或分组的列上建立索引时, 要对索引进行优化以提高查询的效率;也可采取对经常使用的不同值较多的列上建立索引, 以方便进行查询, 较少时可不建立索引;例如对员工的考勤表“时间”中, 每天上午和下午的考勤, 一看就比较清楚的事情, 就没有必要建立索引, 否则, 会影响使用者的查询效率及查询的更新速度, 为了清楚地查询多个类的排序时, 可通过建立符合索引来进行查询优化以提高查询效率。

2.2简化排序进行优化。

有的企业需要排序的内容较多时, 这时就要用大型数据表来满足查询的需要, 由于大型表设计的内容较多, 就要对数据表进行简化避免出现重复排序的现象。在应用索引时, 对于能自动进行排序的次序输出时, 查询优化器就发挥了优化功能, 使繁琐的排序变得简单, 使排序得到简化。在实际应用中其影响因素通常为需要排序的列, 就像语言中的order by或group by句中的列次序与索引的次序一般是不一样的, 但排序的列可通过表的不同形式表现出来。

通过建立完善的增建索引功能, 避免了很多不必要的排序, 并对数据库进行合理合并。如非进行排序, 就要把所需排序的范围进行缩小简化, 以提高查询使用效率。

2.3大型表行数据存取的合理消除。

大型表行数据有些内容是不必要的, 在进行查询时, 表中的存取顺序将影响查询的效率。例如需要采用存取策略时, 一般查询时需要3层嵌套, 而每层查询的行数达到1000行时, 要查询这个数据就要进行10亿行的查询, 可见查询过程的繁琐, 为了提高这种数据的查询效率, 就要建立列的索引。列的索引建立后, 使大型表行数的存取数据得到合理的归类, 对不合理的数据进行合理清楚。

2.4避免相关子查询。

在对列标签进行查询时, 由于列标签之间的相关性, 会发生列标签在主查询和where子句中出现, 很容易造成错误的索引, 针对这种情况, 可通过改变主查询中的列值, 再对子查询进行查询。由此, 当所需查询的嵌套层次越多时, 查询效率就越低。在相关子查询系统中必须子查询时, 就要采取措施去掉一些影响子查询的行。

2.5用排序来取代非顺序存取。

用排序来取代非顺序存取是查询系统中较为常见的一种优化查询的方法, 一般来说, 非顺序磁盘存取可确保磁盘存取臂的来回移动, 但查询效率较低。再者就是使用SQL语句, 可对此情况进行隐藏, 不过会导致在写应用程序时, 要求写出存取大量非顺序页的查询现象出现。为了提高查询效率, 在实际查询时, 可通过用排序能力来取代非顺序的的存取能力, 来提高查询效率。

结束语

综上所述, 计算机数据库系统除具有存取功能外还有十分强大的查询功能, 在实际的应用中, 通过对于数据库查询系统不断进行优化, 不但提高了数据库查询的使用效率, 而且提高了数据库更新的速度, 最大限度地满足了人们利用计算机查询的需求。

摘要:随着我国计算机技术的迅速发展, 数据化系统在实际工作中得到非常广泛的应用, 通过对数据库进行查询优化, 提高了工作效率, 对推动计算机技术的发展具有十分重要的参考意义。

关键词:查询优化,索引,查询计划

参考文献

[1]孟小峰.数据库技术发展趋势[J].软件学报, 2004.

[2]欧阳为民.数据库中加权关联规则的发现[J].软件学报, 2001.

关系数据库查询优化技术研究 第9篇

1 技术现状

目前, 大多数的应用程序都要和数据库打交道。现实中许多数据库开发人员在利用一些前台开发语言 (如PHP、Java、C# 等) 开发数据库应用程序时 , 只注重用户界面的美观、具体功能是否实现, 并不重视查询语句的效率问题, 导致开发出来的应用程序中某些查询时间过长, 响应速度较慢, 而整个系统的工作效率低下。

许多数据库开发人员认为在数据库设计是查询优化的关键, 把精力集中在数据库设计阶段, 旨在选择一个较优的方案。现在的数据库产品 (SQL Server、Oracle等) 在查询优化已经做得越来越好, 但用户提交的SQL语句是系统优化的基础, 因此用户提交的SQL语句至关重要。下面以图书借阅管理数据库为例, 介绍数据库查询优化的方法。

图书借阅管理数据库表结构如表1, 表2, 表3所示。

2 优化技术

2.1 合理使用索引

索引是关系数据库中重要的数据结构, 其根本目的是为了提高查询速度, 其作用与书籍中的目录类似。使用索引虽然可以提高系统的性能, 大大加快数据检索的速度, 但使用索引要付出额外的代价。每个表中, 除了聚集索引外, 其他的索引列需要占用数据表以外的存储空间, 而且创建和维护索引需要花费一定的时间。因此为表建立索引时, 要根据实际情况, 认真考虑哪些列应该建立索引, 哪些列不需要建立索引。一般原则如下:

(1) 主键列上一定要创建索引。当前常用的关系数据库 (如SQL Server) 会自动在主键列上创建聚集索引。

(2) 外键列可以创建索引。

( 3) 在经常查询的字段上最好建立索引。比如图书表Book表中的出版社字段 , 如果经常需要按出版社查询图书信息, 则最好在该字段上建立索引。

(4) 查询中较少涉及的列、重复值比较多的列不要建立索引。比如读者表Reader中的readSex字段, 其取值只有“男”、“女”两个, 就没必要建立索引。

(5) 对于定义为text、image和bit数据类型的列上不要建立索引。

2.2 使用存储过程

存储过程是一种重要的数据库对象, 可以接收参数值, 也可以返回参数值或状态值。存储过程主要由如下两个优点:

(1) 避免冗余代码, 减少程序员的工作量。存储过程可以是简单的SQL语句, 如select * from Book, 也可以是一系列用来对数据库表实现复杂操作的SQL语句集合。将公共集合编写成合理的存储过程, 程序员可以用存储过程名多次调用存储过程, 从而避免冗余代码, 减少程序员的工作量。

(2) 提高查询速度。存储过程在第一次执行时进行编译 , 然后将编译好的代码保存在高速缓存中, 当用户再次执行该存储过程时, 调用的是高速缓存中的编译代码, 因此存储过程的执行速度要比执行相同的SQL语句快得多。

2.3 使用临时表加速查询

把表的一个子集进行排序并创建临时表, 有时能加速查询。比如要查询借期超出3个月未还的读者、图书信息, 一般情况下会给出如下的SQL语句:

如果这个查询要被执行多次, 可以把所有未还的读者、图书信息找出来放在一个临时表notreturn中, 并按读者的姓名进行排序:

然后以下面方式在临时表中查询:

临时表中的数据行要比主表中的行少, 而且物理顺序就是所要求的顺序, 减少了磁盘I/O, 所以可以提高查询速度。

2.4 避免对大型表进行全表顺序扫描

在嵌套查询中, 对表的顺序扫描会使查询效率急剧下降。避免这种情况的主要方法是对连接的列建立索引。尽管在所有的检查列上都有索引, 但某些形式的where子句会强迫优化器使用顺序存取。如下面的查询将强迫对Borrow表执行顺序扫描:

虽然在bookID列上建了索引, 但是执行上面的语句时优化器还是会使用顺序扫描整个表, 因为这个语句要检索的是分离的行的集合, 所以应把上面语句改为:

2.5 避免使用正则表达式

在select语句中, matches和like关键字支持通配符匹配, 称为正则表达式。但这种通配符匹配查找特别费时间。比如从图书表Book表中查询2013年出版的图书信息, 一般情况下会给出如下的SQL语句:

即使在publishDate字段上建立索引, 在这种情况下也还是按照顺序扫描的方式扫描全表。如果把SQL语句改成:

在publishDate字段建立索引的情况下, 执行查询时则按索引进行查找, 大大提高查询效率。

2.6 尽量避免相关子查询

如果一个列同时在主查询和where子句中出现, 很可能当主查询中的列值改变之后, 子查询必须重新查询一次。而且查询嵌套层次越多, 效率越低, 因此应当尽量避免子查询, 而采用连接查询代替。如果子查询不可避免, 那么要在子查询中过滤掉尽可能多的行。比如要查询“张三” 读者的借阅情况可以采用子查询:

或连接查询:

在上面两种查询语句中, 连接查询的查询效率要高于子查询。

3 结语

在数据库的管理和开发过程中, 优化查询可以提高数据库的性能。以一个具体的实例介绍了几种较常用的查询优化技术。 但关系数据库的优化是一个和实际数据库结构密切相关的问题, 在实际应用中应该结合具体的数据库服务器, 深入地理解服务器的运作模式、资源配置, 优化服务器的运行环境, 选择合适的操作系统, 最大限度地发挥服务器的性能。

摘要:对关系数据库查询技术的现状进行了分析,结合关系数据库理论知识,介绍了常用的一些数据库查询优化技术。

数据库多条件组合查询实现 第10篇

ASP.NET 3.5是Microsoft公司推出的新一代Web应用程序平台, 并已成为网络应用的主流。在Web应用系统开发中, 数据操作工作量极大。ASP.NET提供了ADO.NET技术, 它是一组向.NET编程人员公开数据访问的服务的类。ADO.NET提供了对关系数据、XML和应用程序数据的访问, 是.NET Framework不可缺少的一部分[1]。其主要功能是为生成动态的交互式Web服务器应用程序提供一种功能强大的方法或技术。

信息时代, 企业、学校、政府部门等都需要对各种数据进行管理, 尤其是数据查询方面。因此, 在各数据管理系统中, 设计灵活而完善的查询功能并实现一种可以构造多个条件组合的查询方法尤为必要。查询语句可以通过字符串的拼接技术, 大大减少代码的冗余度, 使得开发变得更加直观方便。

1 多条件组合查询设计

1.1 设计依据

数据绑定是ASP.NET提供的一种访问数据库的方法, 其最大特点是:可以让程序员不用关注数据库连接、数据库命令以及如何格式化这些数据并显示在页面上等环节, 而直接将数据与HTML元素绑定。Grid View为数据显示控件, 绑定school数据库中student表的数据, 实现从TextBox (文本框) 或是Dropdown List (下拉列边框) 任意输入相关信息或选项, 可以将正确结果通过GridView显示在网页上。关于查询数据库的语言, 使用字符串将用户从文本框输入的字符和从下拉列表框选择的选项进行拼接。

1.2 网页基本界面

基于Visual Studio 2005, 新建一个以【ASP.NET网站】为模板的网站, 界面如图1所示。

1.3 SQL查询语句

数据库查询是数据库的核心操作, SQL语言提供了SELECT语句实现数据库的查询, 该语句具有灵活的使用方式和丰富的功能[2]。本文研究的多条件组合查询主要利用了SQL查询语句中使用通配符% (百分号) 和_ (下横线) 的模糊查询以及使用逻辑运算符AND和OR的多重条件查询[2]。

2 多条件组合查询方法与功能实现

2.1 数据库创建

在Access中创建school数据库, 并添加student表, 表中信息如图2所示。

2.2 基本步骤

使用数据适配器OledbDataAdapter和DataSet对象访问数据库的一般步骤及注意事项如下[1]:

(1) 建立数据库连接。让连接字符串中data source元素的值为Server.MapPath (“数据库名”) , 该方法是返回与Web服务器上虚拟路径相对的物理文件路径。

(2) 建立OledbCommand对象, 设置SQL语句。该语句应包含用户输入信息检索的代码, 以及巧用字符串拼接技术将用户所输入的信息进行组合来查询满足要求记录的代码。可以用谓词LIKE进行字符串的匹配, 用AND来联接接多个查询条件, 代码如下:

(3) 建立并实例化一个OledbDataAdapter对象。DataAdapter对象是数据库和ADO.NET对象模型中非连接对象之间的桥梁。能够用来保存和检索数据。

(4) 建立DataSet对象, 用于接收执行SQL命令时返回的数据集。

(5) 填充数据库。应用DataAdapter类的Fill方法将查询结果填充到DataSet或DataTable中。

(6) 绑定数据库。通过数据绑定将数据显示在GridView控件中。应用GridView的DataSource方法获取源, 该源包含用于填充控件中项的值列表, 并用GridView的DataBind方法将数据源绑定到GridView控件中。

(7) 关闭数据库。

其基本流程[3]如图3所示。

2.3 关键代码

2.4 功能实现

用户在Visual Studio 2005创建的网页 (见图2) 中输入多个条件, 查询所满足的信息。例如:输入满足以下条件的信息:姓张的女同学, 则查询结果如图4所示。

3 结语

本文基于ASP.NET实现了对SQL Server数据库的查询, 使用字符串拼接对Access数据库进行了模糊查询及多条件组合查询, 加深了对数据库操作技术的理解, 发挥了结构化查询语言的优势, 强化了数据管理系统的功能, 也为后续学习打下了良好基础。

摘要:随着数据库技术的不断发展与数据库管理系统的广泛应用, 人们对数据进行有效管理的能力也越来越重要。通过对用户在网页上输入的动态查询语句进行研究, 给出了基于ASP.NET平台巧用字符串拼接技术实现多条件组合查询的实例, 进一步加强了人们对该技术的理解与应用。

关键词:ASP.NET,ACCESS,C#,多条件组合查询

参考文献

[1]王辉, 来羽, 陈德祥.ASP.NET 3.5 (C#) 实用教程[M].北京:清华大学出版社, 2011.

[2]王珊.数据库系统简明教程[M].北京:高等教育出版社, 2004.

[3]赵大伟, 陈刚.基于.NET的多条件组合查询技术的设计与实现[J].电脑知识与技术, 2012, 8 (25) :6045-6048.

数据库的查询优化方法分析 第11篇

数据库系统作为管理信息系统的核心, 各种基于数据库的联机事务处理以及联机分析处理正慢慢的转变成为计算机应用的最为重要的部分, 根据以往大量的应用实例来看, 在数据库的各种操作中, 查询操作所占的比重最大, 而在查询操作中基于SELECT语句在SQL语句中又是代价最大的语句。如果在使用中采用了优秀的查询策略, 往往可以降低查询的时间, 提高查询的效率, 由此可见查询优化在数据库中的重要性。本文就数据库查询优化中的策略进行介绍及探索。

一、基于索引的优化

数据库的优化方法多种多样, 不同的方法对提高数据库查询效率也不相同。

索引作为数据库中的重要数据结构, 它的根本目的就是为了提高查询的效率。而优化查询的重要方法就是建立索引, 建立适合关系数据库系统的索引, 这样就可以避免表扫描, 并减少了因为查询而造成的输入输出开销, 有效提高数据库数据的查询速度, 优化了数据库性能。然而在创建索引时也增加了系统时间和空间的开销。所以创建索引时应该与实际查询需求相结合, 这样才能实现真正的优化查询。

1. 判断并建立必要的索引

对所要创建的索引进行正确的判断, 使所创建的索引对数据库的工作效率提高有所帮助。为了实现这一点, 我们应做到以下要求:在熟记数据库程序中的相关SQL语句的前提下, 统计出常用且对性能有影响的语句;判断数据库系统中哪些表的哪些字段要建立索引。其次, 对数据库中操作频繁的表, 数据流量较大的表, 经常需要与其他表进行连接的表等, 要进行重点关注。这些表上的索引将对SQL语句的性能产生重要的影响。

2. 对索引使用的一些规则

索引的使用在一些大型数据库系统中会经常使用到, 这样可以有效的提高数据库性能, 使数据库的访问速度得到提高。但索引的使用要恰倒好处, 所以我们在使用索引时应遵守使用原则:建立索引可以提高数据库的查询速度, 但索引过多, 不但不能实现优化查询, 反而会影响到数据库的整体性能。索引作为数据库中实际存在的对象, 每个索引都要占用一定的物理空间。所以对于索引的建立要考虑到物理空间容量, 以及所建立索引的必要性和实用性。

3. 合理的索引对SQL语句的意义

索引建立之后, 还要确保其得到了真正的使用, 发挥了其应有的作用。首先, 可以通过SQL语句查询来确定所建立的索引是否得到了使用, 找出没有使用到的索引。分析索引建立但没有使用的原因, 使其真正发挥作用。其次, 索引得到使用以后, 是否得到了预期的效果, 对数据库的性能是否实现了真正意义上的提高, 只有合理的索引才能真正提高数据库的性能。

二、优化SQL语句

在使用索引时可以有效的提高查询速度, 但如果SQL语句使用不恰当的话, 所建立的索引就不能发挥其作用。所以我们应该做到不但会写SQL, 还要写出性能优良的SQL语句。下面, 就如何优化引用例子进行说明。

首先, 在进行查询时, 返回的值应该是查询所需要的。在查询中应该尽量减少对数据库中的表的访问行数, 使查询的结果范围最小, 这就意味着在查询时, 不能过多的使用通配符, 如:select*from table1语句, 而应该做到最小化查询范围, 要查询几行几列就选择几行几列, 如:select col1 from table1;多数情况下, 用户并不需要查询到的所有数据, 而只是部分或靠前的数据时, 我们也可以通过SQL语句来进行限制查询的结果, 如:select top 50 col1 from table1。

其次, 对于一些特殊的SQL语句, 在使用时应正确选择。我们用一组例子来说明, 如:EXISTS, NOT EXISTS。

语句一:select sum (t1.c1) from t1 where ( (selectcount (*) from t2 where t2.c2=t1.c2) >0)

语句二:select sum (t1.c1) from t1 whereexists (select*from t2 where t2.c2=t1.c1)

两个语句所得到的结果相同, 但, 语句二的效率要远高于语句一, 因为语句一在查询中产生了大量的索引扫描。

在对数据库查询时, 所使用的语句多种多样, 但选择恰当的的字句能够有效的提高查询效率。

最后, WHERE子句在使用时应该注意的问题。

在WHERE子句中可以使用exist和not exist代替in和not in。应该尽量避免使用in, not in, or或者having。可以使用表链接代替exist。Having可以用where代替, 如果无法代替可以分两步处理。

三、其他优化方法

数据库的查询优化方法不仅仅是索引和SQL语句的优化, 其他方法的合理使用同样也能很好的对数据库查询功能起到优化作用。我们就来列举几种简单实用的方法。

1. 避免或简化排序

应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时, 优化器就避免了排序的步骤。

2. 避免相关子查询

如果在主查询和WHERE子句中的查询中同时出现了一个列的标签, 这样就会使主查询的列值改变后, 子查询也必须重新进行一次查询。因为查询的嵌套层次越多, 查询的效率就会降低, 所以我们应当避免子查询。如果无法避免, 就要在查询的过程中过滤掉尽可能多的。

3. 创建使用临时表

在表的一个子集进行排序并创建临时表, 也能实现加速查询。在一些情况下这样可以避免多重排序操作。但所创建的临时表的行要比主表的行少, 其物理顺序就是所要求的顺序, 这样就减少了输入和输出, 降低了查询的工作量, 提高了效率, 而且临时表的创建并不会反映主表的修改。

4. 用排序来取代非顺序存取

磁盘存取臂的来回移动使得非顺序磁盘存取变成了最慢的操作。但是在SQL语句中这个现象被隐藏了, 这样就使得查询中进行了大量的非顺序页查询, 降低了查询速度, 对于这个现象还没有很好的解决方法, 只能依赖于数据库的排序能力来替代非顺序的存取。

对于数据库的优化, 我们要抓住关键问题, 提出改善查询效率, 这样才能真正使数据库服务得到根本提高。

摘要:本文主要探讨了在数据库的应用中对数据库查询优化的一些策略, 其中包括基于索引、SQL语句的优化的方法, 并简要对其他一些常用优化方法做了介绍。本文在对数据库查询优化的方法上, 进行了分析, 提出了部分见解, 有效地提高数据库查询效率。

关键词:数据库,查询优化,查询,优化,索引

参考文献

[1]王珊, 孟小峰:《数据库系统导论 (第七版) 》, 机械工业出版社, 2000年10月。

[2]王磊, 王熙宁:《网上考试系统的性能与安全分析》, 情报科学, 2004年22期。

[3]Abnhrmx Silbersehaa:《数据库系统概念》, 机械工业出版社, 2006年10月。

上一篇:全面质量下一篇:企业增值税审计