WEB报表论文:基于Web的报表生成技术优化及其应用
【中文摘要】报表作为企业信息系统的重要组成部分,是信息浏览、分析、打印的有力工具,只有具备美观完善的报表,企业信息系统才是一个完整的系统。随着企业信息系统在Web上的应用越来越多,报表生成也必然朝这个方向发展,如何实现快速有效的Web报表生成成为软件应用系统研究的重要课题。目前,大部分企业信息系统在报表生成方面均存在一些技术难点,主要体现在不能充分发挥数据库性能,造成数据库处理数据效率降低,以及企业信息系统与数据库交互过程中读取数据效率低下等方面。本文对目前基于Web的报表生成过程中所应用到的技术进行了研究,找到了影响报表生成效率的关键因素,并做了如下工作:(1)对报表的概念、特点、历史发展、研究状况进行了介绍,分析了Web报表生成的相关技术,并对其中关键技术的优化进行了详细介绍。(2)针对信息系统的报表模块读取数据库数据效率相对较低的问题,本文是从SQL语句的优化和应用程序架构对数据库的支持这两个角度进行分析和解决的。(3)将研究得到的报表生成的关键技术的优化方案应用到了河北省人口信息管理系统的Web报表生成模块开发中。对数据库的性能进行了优化,在应用程序的设计过程中加强了对数据库的支持...
【英文摘要】As an important part of enterprise information system, report is a powerful tool for information browsing, analyzing and printing. Only with perfect report, can
enterprise information system be a complete one. With its increasing usage on the web, it is doomed for report generating to direct this way. How to implement efficient report system based on Web becomes an important problem of application software research. At present, the majority of enterprise information system has some technical difficulty in t...
【关键词】WEB报表 Oracle数据库 SQL语句 性能优化 报表生成
【英文关键词】Web report Oracle database SQL statements performance optimization report generation
【索购全文】联系Q1:138113721 Q2:139938848
【目录】基于Web的报表生成技术优化及其应用4-59-10展10
Abstract5-6
1 概述9-13
10-12
摘要
1.1 背景和意义1.2.1 报表的发1.2.3 现阶段报表
1.2 研究状况和发展趋势
1.2.2 国内外研究现状10-11
1.3 课题的提出2.1 WEB 报表综述
的研究方向11-12相关技术13-2013-15平台14-15的发展概况1515-16
12-1313
2 WEB 报表2.2 WEB 技术2.2.2 .NET 开发
2.2.1 WEB 技术的发展13-14
2.3 数据库技术15-18
2.3.1 数据库技术
2.3.2 数据库系统访问技术
2.4 SQL 语句
2.3.3 Oracle 数据库16-18
18-203 WEB 报表生成技术的优化20-293.1 数据库
3.1.2 性能优化20-233.1.1 数据库性能优化概述20
3.2 SQL 语句的优化
23-24数据库性能优化的步骤20-2323-293.2.1 SQL 语句优化的意义3.2.2 SQL 优
化技术的发展24-26
26-29
29-543.2.3 ORACLE SQL 性能优化4 河北省人口信息管理系统WEB 报表的优化设计4.1 河北省人口信息管理系统概述29-32
4.1.2 系统各模块功能
4.2.1 数4.1.1 系统的整体架构29-3131-324.2 数据库的优化设计与实现32-38
据库环境优化32-33
33-384.2.2 人口信息系统数据库优化设计38-394.4 报表模块的4.3 系统报表需求分析
优化设计与实现39-54
39-42
42-45
45-54
实现54-65
70-714.4.1 报表数据录入模块优化设计4.4.2 报表数据的生成模块优化设计4.4.3 报表的生成和导出模块的优化设计5 系统报表的实现54-705.1 系统固定报表的结论5.2 系统自定义报表的实现65-70参考文献71-73致谢73
一、问题的提出
在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的SQL语句,提高系统的可用性。
在多数情况下,Oracle使用索引来更快地遍历表,优化器主要根据定义的索引来提高性能。但是,如果在SQL语句的where子句中写的SQL代码不合理,就会造成优化器删去索引而使用全表扫描,一般就这种SQL语句就是所谓的劣质SQL语句。在编写SQL语句时我们应清楚优化器根据何种原则来删除索引,这有助于写出高性能的SQL语句。
二、SQL语句编写注意问题
下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。
1. IS NULL 与 IS NOT NULL
不能用null作索引,任何包含null值的列都将不会被包含在索引中。即使索引有多列这样的情况下,只要这些列中有一列含有null,该列就会从索引中排除。也就是说如果某列存在空值,即使对该列建索引也不会提高性能。任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。
2. 联接列
对于有联接的列,即使最后的联接值为一个静态值,优化器是不会使用索引的。我们一起来看一个例子,假定有一个职工表(employee),对于一个职工的姓和名分成两列存放(FIRST_NAME和LAST_NAME),现在要查询一个叫比尔.克林顿(Bill Cliton)的职工。
下面是一个采用联接查询的SQL语句:
select * from employss
where
first_name||''||last_name ='Beill Cliton';
上面这条语句完全可以查询出是否有Bill Cliton这个员工,但是这里需要注意,系统优化器对基于last_name创建的索引没有使用。
当采用下面这种SQL语句的编写,Oracle系统就可以采用基于last_name创建的索引。
Select * from employee
where
first_name ='Beill' and last_name ='Cliton';
遇到下面这种情况又如何处理呢?如果一个变量(name)中存放着Bill Cliton这个员工的姓名,对于这种情况我们又如何避免全程遍历,使用索引呢?可以使用一个函数,将变量name中的姓和名分开就可以了,但是有一点需要注意,这个函数是不能作用在索引列上。下面是SQL查询脚本:
select * from employee
where
first_name = SUBSTR('&&name',1,INSTR('&&name',' ')-1)
and
last_name = SUBSTR('&&name',INSTR('&&name’,' ')+1)
3. 带通配符(%)的like语句
同样以上面的例子来看这种情况。目前的需求是这样的,要求在职工表中查询名字中包含cliton的人。可以采用如下的查询SQL语句:
select * from employee where last_name like '%cliton%';
这里由于通配符(%)在搜寻词首出现,所以Oracle系统不使用last_name的索引。在很多情况下可能无法避免这种情况,但是一定要心中有底,通配符如此使用会降低查询速度。然而当通配符出现在字符串其他位置时,优化器就能利用索引。在下面的查询中索引得到了使用:
select * from employee where last_name like 'c%';
4. Order by语句
ORDER BY语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或者附加等)。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。 仔细检查order by语句以找出非索引项或者表达式,它们会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order by子句中使用表达式。
5. NOT
我们在查询时经常在where子句使用一些逻辑表达式,如大于、小于、等于以及不等于等等,也可以使用and(与)、or(或)以及not(非)。NOT可用来对任何逻辑运算符号取反。下面是一个NOT子句的例子:
... where not (status ='VALID')
如果要使用NOT,则应在取反的短语前面加上括号,并在短语前面加上NOT运算符。NOT运算符包含在另外一个逻辑运算符中,这就是不等于(<>)运算符。换句话说,即使不在查询where子句中显式地加入NOT词,NOT仍在运算符中,见下例:
... where status <>'INVALID';
再看下面这个例子:
select * from employee where salary<>3000;
对这个查询,可以改写为不使用NOT:
select * from employee where salary<3000 or salary>3000;
虽然这两种查询的结果一样,但是第二种查询方案会比第一种查询方案更快些。第二种查询允许Oracle对salary列使用索引,而第一种查询则不能使用索引。
6. IN和EXISTS
有时候会将一列和一系列值相比较。最简单的办法就是在where子句中使用子查询。在where子句中可以使用两种格式的子查询。
第一种格式是使用IN操作符:
... where column in(select * from ... where ...);
第二种格式是使用EXIST操作符:
... where exists (select 'X' from ...where ...);
我相信绝大多数人会使用第一种格式,因为它比较容易编写,而实际上第二种格式要远比第一种格式的效率高。在Oracle中可以几乎将所有的IN操作符子查询改写为使用EXISTS的子查询。
第二种格式中,子查询以‘select 'X'开始。运用EXISTS子句不管子查询从表中抽取什么数据它只查看where子句。这样优化器就不必遍历整个表而仅根据索引就可完成工作(这里假定在where语句中使用的列存在索引)。相对于IN子句来说,EXISTS使用相连子查询,构造起来要比IN子查询困难一些。
通过使用EXIST,Oracle系统会首先检查主查询,然后运行子查询直到它找到第一个匹配项,这就节省了时间。Oracle系统在执行IN子查询时,首先执行子查询,并将获得的结果列表存放在在一个加了索引的临时表中。在执行子查询之前,系统先将主查询挂起,待子查询执行完毕,存放在临时表中以后再执行主查询。这也就是使用EXISTS比使用IN通常查询速度快的原因。
同时应尽可能使用NOT EXISTS来代替NOT IN,尽管二者都使用了NOT(不能使用索引而降低速度),NOT EXISTS要比NOT IN查询效率更高。 =====================================================
Oracle的SQL调优是一个复杂的主题,甚至是需要整本书来介绍OracleSQL调优的细微差别。不过有一些基本的规则是每个OracleDBA都需要跟从的,这些规则可以改善他们系统的性能。SQL调优的目标是简单的:
消除不必要的大表全表搜索:不必要的全表搜索导致大量不必要的I/O,从而拖慢整个数据库的性能。调优专家首先会根据查询返回的行数目来评价SQL。在一个有序的表中,如果查询返回少于40%的行,或者在一个无序的表中,返回少于7%的行,那么这个查询都可以调整为使用一个索引来代替全表搜索。对于不必要的全表搜索来说,最常见的调优方法是增加索引。可以在表中加入标准的B树索引,也可以加入bitmap和基于函数的索引。要决定是否消除一个全表搜索,你可以仔细检查索引搜索的I/O开销和全表搜索的开销,它们的开销和数据块的读取和可能的并行执行有关,并将两者作对比。在一些情况下,一些不必要的全表搜索的消除可以通过强制使用一个index来达到,只需要在SQL语句中加入一个索引的提示就可以了。
在全表搜索是一个最快的访问方法时,将小表的全表搜索放到缓存中,调优专家应该确保有一个专门的数据缓冲用作行缓冲。在Oracle7中,你可以使用
altertablexxxcache语句,在Oracle8或以上,小表可以被强制为放到KEEP池中缓冲。
确保最优的索引使用:对于改善查询的速度,这是特别重要的。有时Oracle可以选择多个索引来进行查询,调优专家必须检查每个索引并且确保Oracle使用正确的索引。它还包括bitmap和基于函数的索引的使用。
确保最优的JOIN操作:有些查询使用NESTEDLOOPjoin快一些,有些则是HASHjoin快一些,另外一些则是sort-mergejoin更快。
这些规则看来简单,不过它们占SQL调优任务的100%,并且它们也无需完全懂得OracleSQL的内部运作。以下我们来简单概览以下OracleSQL的优化。 我们首先简要查看Oracle的排序,并且看一看排序操作是如何影响性能的。 调整Oracle的排序操作
排序是SQL语法中一个小的方面,但很重要,在Oracle的调整中,它常常被忽略。当使用createindex、ORDERBY或者GROUPBY的语句时,Oracle数据库将会自动执行排序的操作。通常,在以下的情况下Oracle会进行排序的操作: 使用Orderby的SQL语句
使用Groupby的SQL语句
在创建索引的时候
进行tablejoin时,由于现有索引的不足而导致SQL优化器调用MERGESORT 当与Oracle建立起一个session时,在内存中就会为该session分配一个私有的排序区域。如果该连接是一个专用的连接(dedicatedconnection),那么就会根据init.ora中sort_area_size参数的大小在内存中分配一个
ProgramGlobalArea(PGA)。如果连接是通过多线程服务器建立的,那么排序的空间就在large_pool中分配。不幸的是,对于所有的session,用做排序的内存量都必须是一样的,我们不能为需要更大排序的操作分配额外的排序区域。因此,设计者必须作出一个平衡,在分配足够的排序区域以避免发生大的排序任务时出现磁盘排序(disksorts)的同时,对于那些并不需要进行很大排序的任务,就会出现一些浪费。当然,当排序的空间需求超出了sort_area_size的大小时,这时将会在TEMP表空间中分页进行磁盘排序。磁盘排序要比内存排序大概慢14,000倍。
上面我们已经提到,私有排序区域的大小是有init.ora中的
sort_area_size参数决定的。每个排序所占用的大小由init.ora中的
sort_area_retained_size参数决定。当排序不能在分配的空间中完成时,就会使用磁盘排序的方式,即在Oracle实例中的临时表空间中进行。
磁盘排序的开销是很大的,有几个方面的原因。首先,和内存排序相比较,它们特别慢;而且磁盘排序会消耗临时表空间中的资源。Oracle还必须分配缓冲池块来保持临时表空间中的块。无论什么时候,内存排序都比磁盘排序好,磁盘排序将会令任务变慢,并且会影响Oracle实例的当前任务的执行。还有,过多的磁盘排序将会令freebufferwaits的值变高,从而令其它任务的数据块由缓冲中移走。 我们要做到不但会写SQL,还要做到写出性能优良的SQL语句。
(1)选择最有效率的表名顺序(只在基于规则的优化器中有效):
Oracle的解析器按照从右到左的顺序处理from子句中的表名,from子句中写在最后的表(基础表 driving
table)将被最先处理,在from子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询,
那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表。
(2)WHERE子句中的连接顺序:
Oracle采用自下而上的顺序解析WHERE子句,根据这个原理,表之间的连接必须写在其他WHERE条件之前,
那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。 中.国.站长站
(3)SELECT子句中避免使用‘*’:
Oracle在解析的过程中, 会将‘*’依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间。
(4)减少访问数据库的次数:
Oracle在内部执行了许多工作: 解析SQL语句, 估算索引的利用率, 绑定变量 , 读数据块等。
(5)在SQL*Plus , SQL*Forms和Pro*C中重新设置ARRAYSIZE参数, 可以增加每次数据库访问的检索数据量
,建议值为200。
(6)使用DECODE函数来减少处理时间:
使用DECODE函数可以避免重复扫描相同记录或重复连接相同的表。
(7)整合简单,无关联的数据库访问:
如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系)。
(8)删除重复记录:
最高效的删除重复记录方法 ( 因为使用了ROWID)例子:
DELETE from EMP E WHERE E.ROWID > (SELECT MIN(X.ROWID) from EMP X
WHERE X.EMP_NO = E.EMP_NO);
(9)用TRUNCATE替代DELETE:
当删除表中的记录时,在通常情况下, 回滚段(rollback segments ) 用来存放可以被恢复的信息.
如果你没有COMMIT事务,ORACLE会将数据恢复到删除之前的状态(准确地说是恢复到执行删除命令之前的状况) 而当运用TRUNCATE时,
回滚段不再存放任何可被恢复的信息。当命令运行后,数据不能被恢复.因此很少的资源被调用,执行时间也会很短。(TRUNCATE只在删除全表适
用,TRUNCATE是DDL不是DML)。 Chinaz_com
(10)尽量多使用COMMIT:
只要有可能,在程序中尽量多使用COMMIT, 这样程序的性能得到提高,需求也会因为COMMIT所释放的资源而减少,COMMIT所释放的资源:
a. 回滚段上用于恢复数据的信息。
b. 被程序语句获得的 ......
接确保Oracle数据库sql语句高效执行的优化总结一2410053和10046事件24110053事件我们在查看一条SQL的执行…
Oracle数据库SQL基础用法与优化总结前言2基础用法2一SELECT语句2二三四五六七八九十多表关联2子查询3级联查询Hier…
Oracle数据库中SQL语句优化研究中国电信股份有限公司石嘴山分公司任凤摘要简要介绍数据库中SQL语句优化技术并结合具体的事例探…
oraclesql语句优化1选择最有效率的表名顺序只在基于规则的优化器中有效ORACLE的解析器按照从右到左的顺序处理FROM子句…
操作符优化IN操作符用IN写出来的SQL的优点是比较容易写及清晰易懂这比较适合现代软件开发的风格但是用IN的SQL性能总是比较低的…
接确保Oracle数据库sql语句高效执行的优化总结一2410053和10046事件24110053事件我们在查看一条SQL的执行…
Oracle数据库SQL基础用法与优化总结前言2基础用法2一SELECT语句2二三四五六七八九十多表关联2子查询3级联查询Hier…
Oracle数据库中SQL语句优化研究中国电信股份有限公司石嘴山分公司任凤摘要简要介绍数据库中SQL语句优化技术并结合具体的事例探…
oraclesql语句优化1选择最有效率的表名顺序只在基于规则的优化器中有效ORACLE的解析器按照从右到左的顺序处理FROM子句…
操作符优化IN操作符用IN写出来的SQL的优点是比较容易写及清晰易懂这比较适合现代软件开发的风格但是用IN的SQL性能总是比较低的…