数据库优化

数据库优化
数据库优化

关于开发过程中数据库访问的一些事情

目录

1. 前言 (1)

2. 关于性能 (1)

2.1. 关于冗余 (2)

2.2. 视图 (3)

2.3. 关于like的优化 (3)

2.4. 减少数据库访问次数 (4)

2.5. 关于索引 (6)

2.6. 慎用lob (7)

2.7. 把逻辑放到查询中 (8)

2.8. 自定义函数 (9)

2.9. 使用PreparedStatement (10)

3. 一些开发中的建议 (12)

3.1. 使用jdbcTemplate代替原生JDBC (12)

3.2. 使用Oracle dblink和同义词 (12)

3.3. 使用Oracle即时客户端 (14)

1.前言

本文用来说明一些在开发过程中经常碰到的数据库访问方面的问题,提供一些解决问题的思路和经验。同时,期望能够引起大家的重视,避免重犯类似的错误或者少走一些弯路。

如果本文能为大家的开发工作起到一些帮助,那是最好。但如果能启发大家对问题的思考,并因此而找出更好的解决办法,或者通过实践验证了文中的方法的错误和不足,那才是真正起到了抛砖引玉的作用,才让本文体现出了最大价值。

限于本人水平有限,如文中存在一些错误,恳请大家指证出来。毕竟,通过此文引起共鸣或者有助于研发部门内讨论沟通风气的形成,才是举办这种交流的最终目的。

2.关于性能

我们这种业务系统,是典型的OLTP(On-Line Transaction Processing联机事务处理)系统。系统本身是基于关系型数据库开发的,绝大部分业务需求的实现都离不开数据库的“增、删、改、查”操作,那么在开发过程中,难免就会碰到这样或那样的问题,也许你注意到了,也许你没注意到;也许问题的后果不严重,也许问题的后果很严重,客户很生气。总之,避免问题的发生和如何解决问题是我们需要去认真考虑的,下面就从数据访问的性能方面来做一些讨论。

多数人认为只有当用户感觉性能差时才需要进行调整,此时即使使用最有效的策略,往往也太迟了。如果你不愿意重新设计应用或者你无法承受修改所带来的代价,那也只能通过数据库优化这一条路可行了。但是,为什么在最初我们不

去关注这个问题呢?

其实,性能调整应该是跨越整个应用系统的开发生命周期的,我们作为应用程序开发人员,从进行设计到实际编码,都需要考虑性能问题。下面就从一些典型的问题来讨论一下。

2.1.关于冗余

关系数据库设计是对数据进行组织化和结构化的过程,核心问题是关系模型的设计。对于数据库规模较小的情况,我们可以比较轻松的处理数据库中的表结构。然而,随着项目规模的不断增长,相应的数据库也变得更加复杂,关系模型表结构更为庞杂,这时我们往往会发现我们写出来的SQL语句的是很笨拙并且效率低下的。更糟糕的是,由于表结构定义的不合理,会导致在更新数据时造成数据的不完整。因此,就有必要学习和掌握数据库的规范化流程,以指导我们更好的设计数据库的表结构,减少冗余的数据,借此可以提高数据库的存储效率,数据完整性和可扩展性。

大家都知道在进行数据库设计时要以三个基本范式作为基础,但是严格遵守范式,往往不是最好的设计。为了提高数据访问的效率,常常需要降低范式标准,适当增加冗余,达到以空间换时间的目的。

这里要注意的是,主键与外键在多表中重复出现,并非是冗余数据,非键字段的重复出现,才是数据冗余!

如,商品具有“单价、数量和总价”三个字段,总价是由单价乘以数量得来的,一般来说,这种派生冗余就值得尝试,在一些业务场景下,可能会大大提升效率。

我们要尽量避免的是所谓的重复性冗余,说白了就是某个字段在几个数据表中都存在且面临着不同的修改入口,这样的设计就会容易导致数据的不一致性出现。

2.2.视图

与基本表、代码表、中间表不同,视图是一种虚表,它依赖数据源的实表而存在。视图是供程序员使用数据库的一个窗口,是基表数据综合的一种形式,是数据处理的一种方法,是用户数据保密的一种手段。为了进行复杂处理、提高运算速度和节省存储空间,视图的定义深度一般不得超过三层。若三层视图仍不够用,则应在视图上定义临时表,在临时表上再定义视图。这样反复交迭定义,视图的深度就不受限制了。

2.3.关于like的优化

在SQL中,like关键字提供了模糊匹配的功能,但是使用like时要避免因为图省事而导致SQL性能差的问题。

简单的说,可尝试这样的优化:

尽量不使用“like ‘%……%’”的形式,因为这种形式很难优化,会导全表扫描(当然如果是在可预见的时期内数据量很少的表,则

无所谓)。如果必须要用,考虑使用数据库方言中的字符串函数,如

Oracle中的instr,最终的SQL写法可能如下:

select count(*) from table t where instr(t。column,'xx')>

DB2中可以考虑用Locate函数。

如果是“like ‘xx%’”的形式,可以用到索引(前提是列上有索引)。

如果是“like ‘%xyz’”的形式,麻烦一些,可考虑尝试使用数据库方言中的reverse函数和反转键索引。最终的SQL写法可能如下:

select * from table where reverse(column_name) like ‘zyx%’

2.4.减少数据库访问次数

要从一个表中提取多段信息时,采用多次数据库访问的做法非常糟糕,即使多段信息看似“无关”(但事实上往往并非如此)。例如,如果需要多个字段的数据,千万不要逐个字段地提取,而应一次操作全部完成。

稍微引申一下,在某个业务实现中,中间件服务器对数据库服务器访问的次数越多,性能越差。所以我们应尽可能根据业务特点,减少数据库访问次数,从而提升性能。

例1,如果我们要将100个文件实现“组卷”这个需求,最暴力的方法就是先insert一条案卷记录,再使用循环,每一条文件记录执行一次update。先不说其他的逻辑处理,光把文件和案卷关联起来就需要100次数据库访问……

例2,如果我们需要将一批数据插入到一个表中,最暴力的方式就是执行N 次的insert……

这样的例子很多,但是大家应该想想有没有更优的方案去实现。

针对例1,为什么不能用一条Update为文件和案卷建立关联关系?为什么不能借助rownum来为文件生成序号?

针对例2,为什么不能用insert into …… select 的语法去执行?

我们在实现业务逻辑的时候,应该先想好这个业务逻辑要做什么?需要哪些数据,这些所需数据是作为参数传递进来的呢还是需要从数据库获取到的。如果是需要从数据库获取到的,那么能不能通过1次数据库访问就获取到全部的参数?写完一个方法之后,统计一下你一共访问了多少次数据库,看看能不能减少?我想多数情况下,我们的实现里还是有很大的优化余地的。

如果你在自己的业务逻辑实现里发现了在循环体中访问数据库的代码,那么这很可能就是导致性能差的原因之一。以我个人的经验来看,绝大多数这样的代码都是开发人员没有认真分析设计导致的,并且都可以通过一定的技巧来避免这种实现。

少部分极为特殊的情况下,可能无法避免在循环体中进行数据库访问,那么好,能不能考虑一下批量操作?以数据迁移为例,从A库批量读取N条数据,再批量向B库插入M条,性能远远好过“读一条、写一条”的方式。

2.5.关于索引

简单的说,索引不是万能的,但是没有索引是万万不能的。

建立合适的索引不一定简单,但可以遵循一些简单的普适性原则:

对出现在select和条件子句中的列建立索引,一般情况下,要根据谓词的选择读来排列索引中各列的位置,选择度大的谓词所使用的列放在索引的前面,把那些只存在于select语句中的列放在索引的最后。

基数较大的列很适合用来作索引。

尽量避免在索引中使用多于5个的列。

对于多列索引,将查询中引用最多的列放在定义的前面。

避免添加与已有索引相似的索引。

不要创建冗余的索引,如“INX1=(A,B), and INX2=(A,B,C)”就是冗余索引,INX1是不必要的

对某字段使用函数时,则该字段上的索引并不能起作用。当然,你可以建立函数索引,这意味着要对函数的结果加索引,而不是为字段加索引。

2.6.慎用lob

这应该是个见仁见智的问题。

如果你的初衷只是想保存一段文本(例如xml或者其他数据),并且这段文本本身在可预见的范围内不会无限制的扩大,其本身大小有限,那真的不适合用lob字段去存储。但假如你要存储二进制文件,可能无法避免的要使用lob(不过说实在的,企业级应用里直接使用数据库的lob来存储音视频、图像的恐怕也不多了,当然也许是我见得太少)。

文本数据为什么不首先考虑用varchar?(其实这里还隐含着一个问题,真的有必要使用xml来承载数据么?为什么不用更轻量级的JSON?),把一个varchar文本转换为xml对象应该比直接使用lob要简单不少吧?

如果你实践过了,证明VARCHAR真的不适合(还有JSON)承载数据,那么也许就只有xml更合适(这点我也持保留意见,即所谓的用XML来适应扩展性),但是必须使用lob来存储么?

在我们的系统里,有相当一些数据就是采用的XML结构形式来存储在lob 字段里的。

存储、查询和更新诸如非结构化 LOB 的数据,或者将数据“分解”到关系表中,然后再将其重新组合。该方法导致编程的复杂且低效,因为这些访问机制是不成熟的。

Oracle从9i开始(DB2从v8开始),都已经具备支持XML数据的特性,提供了用于在数据库中存储、检索和操作XML数据的新功能,并随着版本的升级,

极大的扩展了这些功能。我们可以直接使用XQuery来查询到所需要的数据,而不是从lob里把整个文件内容读出来再使用XML访问特性去获取所需的那一点数据。

所以,如果真的不能以JSON格式代替XML,那么请考虑使用数据库的XML 特性,而不是lob。

2.7.把逻辑放到查询中

在数据库应用程序中实现过程逻辑的方法有几种。 SQL语句内部可实现某种程度上的过程逻辑(尽管 SQL 语句应该说明做什么,而不是怎么做)。即便内嵌式 SQL的宿主语言非常完善,依然推荐尽量将上述过程逻辑放在SQL语句当中,而不是宿主语言当中,因为前一种做法效率更高。过程性语言的特点在于拥有执行迭代(循环)和条件( if。。。then。。。else结构)逻辑的能力。 SQL 不需要循环能力,因为它本质上是在操作集合, SQL只需要执行条件逻辑的能力。

条件逻辑包含两部分—— IF和ELSE。要实现 IF的效果相当容易——where子句可以胜任,困难的是实现ELSE逻辑。例如,要取出一些记录,然后对其分组,每组进行不同的转换。 case表达式(Oracle早已在 decode() (注1 )中提供了功能等效的操作符)可以容易地模拟 ELSE逻辑:根据每条记录值的不同,返回具有不同值的结果集。下面用伪代码表达case结构的使用:

CASE

WHEN condition THEN

WHEN condition THEN

。。。

WHEN condition THEN

ELSE

数值或日期的比较则简单明了。操作字符串可以用 Oracle的greatest()或 least(),或者 MySQL的strcmp() 。有时,可以为 insert 语句增加过程逻辑,具体办法是多重 insert 及条件 insert,并借助merge语句。如果DBMS 提供了这样语句,毫不犹豫地使用它。也就是说,有许多逻辑可以放入SQL语句中;虽然仅执行多条语句中的一条这种逻辑价值不大,但如果设法利用case 、merge或类似功能将多条语句合并成一条,价值可就大了。

总结:只要有可能,应尽量把条件逻辑放到SQL 语句中,而不是 SQL的宿主语言中。

2.8.自定义函数

如果某些处理在应用层实现效果很差,那么可以考虑一下使用自定义函数,例如文号字段的形式可能如下图所示:

如果客户要求根据文号字段中的年度和发文号进行排序,那么就需要使用函数对文号值进行处理,Oracle提供了正则功能,可以与字符串函数结合方便的提取字段值中的“年度”

与“发文号”。但如果数据库没提供有合适的函数,你也可以自己写一个自定义函数来实现类似功能(当然,处理方案不只这一种,也许你可以考虑用视图和连接)。

这里的建议是,函数中最好不要包含查询等逻辑,而只是包含一些简单的针对所给值的处理。

还有要注意的是,如果在列上用了函数,那么该列上的索引是使用不上的。

2.9.使用PreparedStatement

很多面试题里也出现过,PreparedStatement和statement的区别?哪个性能更好一些?你能准确的回答出来么?

当一个数据库接收到一条语句的时候,数据库引擎首先解析这条语句,查看语法错误。一旦语句解析了,数据库需要找出最有效的方法来执行这条语句。这个计算起来代价很大。数据库检查什么索引(如果有的话)能有所帮助,或者它是否能全部读出一张表中所有的记录。数据库根据这些关于数据库所存数据的统计数字来找出最好的办法。一旦制订出查询方案,就可以由数据库引擎来执行。需要CPU 来产生访问方案。理想的情况,如果我们把相同的语句给数据库发送两次,我们期望数据库重用第一条记录的访问方案。这会比第二次重新产生方案要使用较少的CPU。语句缓冲数据库可以进行调节来做语句缓冲。通常包含一些类型的语句缓冲。缓冲使用语句本身作为关键字,访问方案和相应的语句存储在缓冲区中。这样就允许数据库引擎对以前执行过的语句所使用的访问方案进行重用。举个例子来说,如果我们向数据库发送这样一条语句"select a,b from t where c = 2",计算好的访问方案就放入缓冲区了。如果我们以后再使用同样的语句,数据库就能重用以前的访问方案,这样就能节省CPU。但是要注意,整条语句是一个关键字。例如,如果我们后来发送的语句是"select a,b from t where c = 3",那么就不会找出以前的访问方案。因为"c=3"和"c=2" 是不一样的。

为了解决这类问题,我们就需要使用参数化SQL,写成“select a,b from t where c = ?”的形式。在"c=?" 部分带有不同的参数。这样就允许数据库重用语句的访问方案,使程序在数据库内部运行得更高效。这基本上能使你的程序运行得更快,或者使数据库用户能更多地使用CPU。

当我们使用J2EE 服务器的时候,事情会变得更加复杂。通常情况下,一个预先准备好的语句(prepared statement) 是和一个单独的数据库连接相关联的。当连接关闭时,语句就被丢弃了。一般来说,一个胖客户端应用程序在得到一个数据库连接后会一直保持到程序结束。一个J2EE 应用程序只在一个请求的生存时间中保持一个连接。这意味着在他处理每一个请求时都会重新创建语句,就不象胖客户端只创建一次,而不是每个请求都创建那样有效,当J2EE 服务器给你的程序一个连接时,并不是一个真正的连接,而是一个经过包装的。你可以通过查看那个连接的类的名字来检验一下。它不是一个数据库的JDBC 连接,是你的服务器创建的一个类。通常,如果你调用一个连接的close 方法,那么jdbc 驱动程序会关闭这个连接。我们希望的是当J2EE 应用程序调用close 的时候,连接会返回到连接池中。通常会通过设计一个代理的jdbc 连接类来做这些,但看起来就象是实际的连接。当我们调用这个连接的任何方法时,代理类就会把请求前递给实际的连接。但是,当我们调用类似close 的方法时,并不调用实际连接的close 方法,只是简单地把连接返回给连接池,然后把代理连接标记为无效,这样当它被应用程序重新使用时,我们会得到异常。包装是非常有用的,因为它帮助J2EE 应用程序服务器实现者比较聪明地加上预先准备语句的支持。当程序调用Connection。prepareStatement 时,由驱动程序返回一个PreparedStatement 对象。当应用程序得到它时,保存这个句柄,并且在请求完成时,关闭请求之前关闭这个句柄。但是,在连接返回到连接池之后,以后被同样或者另一个应用程序重用时,那么,我们就理论上希望同样的PreparedStatement 返回给应用程序。J2EE PreparedStatement 缓冲J2EE PreparedStatement 缓冲由J2EE 服务器内部的连接池管理器使用一个缓冲区来实现。J2EE 服务器在连接池中保存一个所有数据库的预先准备语句的一个列表。当一个程序调用一个连接的prepareStatement 方法时,服务器先检查这个语句是否已经有了,如果是,相应的PreparedStatement 就在缓冲区内,就返回给应用程序,如果不是,请求就会传递给jdbc 驱动程序,请求/预先准备语句对象就会加入到缓冲区里。对于每一个连接我们需要一个缓冲区,因为这是jdbc 驱动程序的工作要求。任何返回的preparedStatement 都是针对这个连

接的。

如果我们要利用缓冲区的优势,要使用和前面相同的规则我们需要使用参数话的查询,这样它们就会和已经在缓冲区的某一个匹配。大多数应用程序服务器都允许你调整缓冲区的大小。

3.一些开发中的建议

这部分是一些开发过程中的建议,因为我们用得最多的是Oracle,所以内容也只针对Oracle,但不代表其他数据库不具备那些特性。

3.1.使用jdbcTemplate代替原生JDBC

我们使用JDBC来实现DAO层,没有使用其他的O/R解决方案比如hibernate,也没有使用诸如myBatis、JPA、EJB之类的解决方案。这合理么?也许不。但这里要讨论的不是这个问题。

我们在系统中使用了Spring作为基础框架,她同样提供了对JDBC操作的友好的封装,这里建议在所有使用到JDBC的地方,都使用spring提供的jdbcTemplate及其相关组件。在我的项目里,除了遗留代码之外,都要求使用Spring的jdbcTemplate来处理数据库访问。具体的用法请大家参考Spring的手册和API doc,这里不做赘述。

3.2.使用Oracle dblink和同义词

这方法主要是针对两台不同的数据库服务器,从一台数据库服务器的一个用户读取另一台数据库服务器下的某个用户的数据,这个时候可以使用dblink(当然前提是客户方面的

DBA允许我们建立dblink)。

一个最典型的业务场景就是历史数据的迁移,此时我们就不需要配置两个数据源来回的切换了。

同义词是数据库对象的别名,这个对象可以是表,视图,序列,过程,函数,程序包等。通过使用同义词,用户可以访问其它用户的数据库对象而无需指定用户前缀。如用户CQDL 要访问CQDL0001的表D_FILE1_0001,必须使用CQDL0001.D_FILE1_0001来引用,如果为CQDL 创建一个D_FILE1_0001的同义词代表CQDL0001.D_FILE1_0001,那么CQDL就可以用该同义词像访问自己的表一样引用CQDL0001.D_FILE1_0001了。

同义词用途:

简化SQL语句

隐藏对象的名称和所有者

为分布式数据库的远程对象提供了位置透明性

提供对对象的公共访问

显而易见的,大家可以考虑考虑采用同义词简化我们的“辅库”的访问方式(干掉分布式事物?)。当然,配置同义词也需要客户那里的DBA的认可。

采用DBLINK和同义词的好处显而易见,但如果你只使用了一个连接池,那么也许你要考虑是否对连接数进行放大。

3.3.使用Oracle即时客户端

通常在客户那里我们需要在服务器上安装PL/SQL或者Toad来访问远程Oracle数据库,也许你不介意在硬盘里保存一份几百兆的Oracle安装包,但实际上你可以使用Oracle instant client来解决这个问题,相比之下她很小巧,只有几十兆,可以近似等同于绿色软件。而且Oracle提供了windows、linux和AIX等不同的版本。试试吧,的确挺方便。

最后,祝大家春节快乐。

数据库的查询优化方法分析-2019年精选文档

数据库的查询优化方法分析 i=r 随着计算机应用的深入 ,计算机技术的成熟 , 各种应用软件 的普及,应用数据也随着日常工作而迅速增长 , 作为数据仓库的 数据库的重要性也日益显著。 数据库系统作为管理信息系统的核心 , 各种基于数据库的联 机事务处理以及联机分析处理正慢慢的转变成为计算机应用的 最为重要的部分 ,根据以往大量的应用实例来看 , 在数据库的各 种操作中 ,查询操作所占的比重最大 , 而在查询操作中基于 SELECT 吾句在SQL 语句中又是代价最大的语句。如果在使用中 采用了优秀的查询策略 ,往往可以降低查询的时间 , 提高查询的 效率,由此可见查询优化在数据库中的重要性。本文就数据库查 询优化中的策略进行介绍及探索。 1 基于索引的优化 数据库的优化方法多种多样 , 不同的方法对提高数据库查询 效率也不相同。 索引作为数据库中的重要数据结构 , 它的根本目的就是为 了提高查询的效率。而优化查询的重要方法就是建立索引 因为查询而造成的输入输出开销 , 有效提高数据库数据的查 询速 度, 优化了数据库性能。然而在创建索引时也增加了系统时间和 空间的开销。所以创建索引时应该与实际查询需求相结合 , 这样 才能实现真正的优化查询。 1.1 判断并建立必要的索引 对所要创建的索引进行正确的 判断 ,使所创建的索引对数据库的工作效率提高有所帮助。为了 实现这一点 , 我们应做到以下要求 : 在熟记数据库程序中的相关 适合关系数据库系统的索引 , 这样就可以避免表扫描 , 并减少了 , 建立

SQL语句的前提下,统计出常用且对性能有影响的语句;判断数据库系统中哪些表的哪些字段要建立索引。其次 , 对数据库中操作频繁的表 , 数据流量较大的表 , 经常需要与其他表进行连接的表等,要进行重点关注。这些表上的索引将对 SQL语句的性能产生重要的影响。 1.2对索引使用的一些规则索引的使用在一些大型数据库系统中会经常使用到 , 这样可以有效的提高数据库性能 , 使数据库的访问速度得到提高。但索引的使用要恰倒好处 , 所以我们在使用索引时应遵守使用原则 : 建立索引可以提高数据库的查询速度, 但索引过多 ,不但不能实现优化查询 ,反而会影响到数据库的整体性能。索引作为数据库中实际存在的对象 , 每个索引都要占用一定的物理空间。所以对于索引的建立要考虑到物理空间容量以及所建立索引的必要性和实用性。 1.3合理的索引对SQL语句的意义索引建立之后,还要确保其得到了真正的使用 , 发挥了其应有的作用。首先 , 可以通过 SQL语句查询来确定所建立的索引是否得到了使用,找出没有使用到的索引。分析索引建立但没有使用的原因 , 使其真正发挥作

大型ORACLE数据库优化设计方案

大型ORACLE数据库优化设计方案 本文主要从大型数据库ORACLE环境四个不同级别的调整分析入手,分析ORACLE的系统结构和工作机理,从九个不同方面较全面地总结了ORACLE数据库的优化调整方案。 对于ORACLE数据库的数据存取,主要有四个不同的调整级别,第一级调整是操作系统级 包括硬件平台,第二级调整是ORACLE RDBMS级的调整,第三级是数据库设计级的调整,最后一个调整级是SQL级。通常依此四级调整级别对数据库进行调整、优化,数据库的整体性能会得到很大的改善。下面从九个不 同方面介绍ORACLE数据库优化设计方案。 一.数据库优化自由结构OFA(Optimal flexible Architecture) 数据库的逻辑配置对数据库性能有很大的影响,为此,ORACLE公司对表空间设计提出了一种优化结构OFA。使用这种结构进行设计会大大简化物理设计中的数据管理。优化自由结构OFA,简单地讲就是在数据库中可以高效自由地分布逻辑数据对象,因此首先要对数据库中的逻辑对象根据他们的使用方式和物理结构对数据库的影响来进行分类,这种分类包括将系统数据和用户数据分开、一般数据和索引数据分开、低活动表和高活动表分开等等。数据库逻辑设计的结果应当符合下面的准则:(1)把以同样方式使用的段类型存储在一起; (2)按照标准使用来设计系统;(3)存在用于例外的分离区域;(4)最小化表空间冲突;(5)将数 据字典分离。 二、充分利用系统全局区域SGA(SYSTEM GLOBAL AREA) SGA是oracle数据库的心脏。用户的进程对这个内存区发送事务,并且以这里作为高速缓存读取命中的数据,以实现加速的目的。正确的SGA大小对数据库的性能至关重要。SGA 包括以下几个部分: 1、数据块缓冲区(data block buffer cache)是SGA中的一块高速缓存,占整个数据库大小 的1%-2%,用来存储从数据库重读取的数据块(表、索引、簇等),因此采用least recently used (LRU,最近最少使用)的方法进行空间管理。 2、字典缓冲区。该缓冲区内的信息包括用户账号数据、数据文件名、段名、盘区位置、表 说明和权限,它也采用LRU方式管理。 3、重做日志缓冲区。该缓冲区保存为数据库恢复过程中用于前滚操作。 4、SQL共享池。保存执行计划和运行数据库的SQL语句的语法分析树。也采用LRU算法 管理。如果设置过小,语句将被连续不断地再装入到库缓存,影响系统性能。 另外,SGA还包括大池、JAVA池、多缓冲池。但是主要是由上面4种缓冲区构成。对这

数据库查询优化实验报告_SQLServer2008

SQL Server 2008数据查询的优化方法研究摘要 随着数据存储需求的日益增长,对关系数据的管理和访问就成为数据库技术必须解决的问题。本文主要论述关系数据库查询优化技术,并从它的优化技术进行深入探讨,对系统实现做了一定的论述,并进行了部分的程序实现。 关键词:数据库查询系统优化 引言 SQLServer是是由微软公司开发的基于Windows操作系统的关系型数据库管理系统,它是一个全面的、集成的、端到端的数据解决方案,为企业中的用户提供了一个安全、可靠和高效的平台用于企业数据管理和商业智能应用。目前,许多中小型企业的数据库应用系统都是用SQLServer作为后台数据库管理系统设计开发的。设计一个应用系统并不难,但是要想使系统达到最优化的性能并不是一件容易的事。根据多年的实践,由于初期的数据库中表的记录数比较少,性能不会有太大问题,但数据积累到一定程度,达到数百万甚至上千万条,全面扫描一次往往需要数十分钟,甚至数小时。20%的代码用去了80%的时间,这是程序设计中的一个著名定律,在数据库应用程序中也同样如此。如果用比全表扫描更好的查询策略,往往可以使查询时间降为几分钟。而且我们知道,目前数据库系统应用中,查询操作占了绝大多数,查询优化成为数据库性能优化最为重要的手段之一。 影响查询效率的因素 SQLServer处理查询计划的过程是这样的:在做完查询语句的词法、语法检查之后,将语句提交给SQLServer的查询优化器,查询优化器通过检查索引的存在性、有效性和基于列的统计数据来决定如何处理扫描、检索和连接,并生成若干执行计划,然后通过分析执行开销来评估每个执行计划,从中选出开销最小的执行计划,由预编译模块对语句进行处理并生成查询规划,然后在合适的时间提交给系统处理执行,最后将执行结果返回给用户。所以,SQLServer中影响查询效率的因素主要有以下几种: 1.没有索引或者没有用到索引。索引是数据库中重要的数据结构,使用索引的目的是避免全表扫描,减少磁盘I/O,以加快查询速度。 2.没有创建计算列导致查询不优化。 3.查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)。 4.返回了不必要的行和列。 5.查询语句不好,没有优化。其中包括:查询条件中操作符使用是否得当;查询条件中的数据类型是否兼容;对多个表查询时,数据表的次序是否合理;多个选择条件查询时,选择条件的次序是否合理;是否合理安排联接选择运算等。 SQLServer数据查询优化方法 1、避免使用不兼容的数据类型。例如float和int、char和varchar、binary和varbinary 是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如: select name from employee where salary >60000

数据库优化配置

[client] port=3306 [mysql] no-beep default-character-set=utf8 [mysqld] datadir=D:/Data port=3306 server-id=1 log-output=FILE general-log=0 general_log_file="ADMIN-PC.log" slow-query-log=1 slow_query_log_file="ADMIN-PC-slow.log" long_query_time=10 lower_case_table_names=1 log-error="ADMIN-PC.err" secure-file-priv="c:/ProgramData/MySQL/MySQL Server 5.7/Uploads" user=mysql innodb_buffer_pool_size=2G innodb_log_file_size=1G innodb_log_buffer_size=8M innodb_flush_log_at_trx_commit=2 innodb_file_per_table=1 innodb_io_capacity=2000 innodb_io_capacity_max=6000 innodb_lru_scan_depth=2000 innodb_thread_concurrency=0 innodb_autoinc_lock_mode=2 ################################################## # Binary log/replication(这里主要是复制功能,也就是主从,提前配置好,后面讲主从配置) #二进制日志 log-bin #为了在最大程序上保证复制的InnoDB事务持久性和一致性 sync_binlog=1 sync_relay_log=1 #启用此两项,可用于实现在崩溃时保证二进制及从服务器安全的功能 relay-log-info-repository=TABLE master-info-repository=TABLE

数据库及SQL代码优化方案

1.1、数据库及SQL代码优化方案 (1)每周检查统计信息是否及时更新。 (2)每周检查各索引是否有效。 (3)每周检查分区是否正确。 (4)每周检查执行计划是否正确。 (5)每天检查RAC和ASM是否正常运行。 (6)每天检查相关日志是否正常备份。 (7)每天检查相关文件系统和表空间的占用率是否在国家税务总局规定的阀值以下。 (8)在每月申报高峰等业务繁忙期采样并找出消耗I/O资源和CPU资源较多的SQL语句。 (9)分析上述SQL语句,与软件服务商充分沟通后,提出优化建议。 (10)在每月申报高峰期每隔15分钟检查一次数据库连接数,发现异常及时处理。 1.1.1、系统数据库索引、表分区和对象优化方案 数据库对象的优化主要包括:表、索引和sequence等对象,通过优化对象参数、调整对象属性(例如分区表、分区索引、反转索引等等)等方法来实现对数据库对象的优化改造。 1.1.1.1表和索引并行参数优化 数据库的表和索引的并行参数值的设置对相关的sql语句的执行计划会造成影响,表和索引的degree值大于1,执行计划就偏向于使用全表和全索引扫描,另外如果并行参数值过大,短时间内也会对主机和数据库的资源造成很大的压力,因此在oltp的数据库下建议将表和索引的degree值设为1。 1.1.1.2热点大表的分区改造 对访问量很大、表的记录数很多、存在热块争用的表,可以考虑对表和索引进行适当的分区改造,分散访问压力,提高数据访问的性能。 对以下表的记录数超过1000万并且记录数持续增长的大表,建议进行分区

改造(地区+时间): 1.1.1.3分区索引的清理 对最近30天数据库分区索引访问情况进行统计,对访问次数为0的分区索引和应用部门进行确认,若确认为多余的索引,建议进行删除清理。 1.1.1.4Sequence序列优化 加大sequence 的 cache,并使用noorder选项。在RAC中经常会遇到SQ 锁等待,这是因为在RAC环境下,sequence也成为全局性的了,不同节点要生成序列号,就会产生对sequence资源的争用。而目前大多数系统中,sequence 大多数被作为主键发生器来使用,使用的频率十分高,在RAC环境中,需要设置较大的 sequence cache,否则会造成较为严重的争用,从而影响业务。 1.1.2、SQL硬解析优化方案 1.1. 2.1相关知识点介绍 1.1. 2.1.1Oracle的硬解析和软解析 Oracle对sql的处理过程:当发出一条sql语句交付Oracle,在执行和获取结果前,Oracle对此sql将进行几个步骤的处理过程: 1、语法检查(syntax check) 检查此sql的拼写是否语法。 2、语义检查(semantic check) 诸如检查sql语句中的访问对象是否存在及该用户是否具备相应的权限。 3、对sql语句进行解析(prase) 利用内部算法对sql进行解析,生成解析树(parse tree)及执行计划(execution plan)。 4、执行sql,返回结果(execute and return) 其中,软、硬解析就发生在第三个过程里。 Oracle利用内部的hash算法来取得该sql的hash值,然后在library cache

分布式数据库查询优化技术

分布式数据库查询优化技术 摘要在分布式数据库中,由于高可靠性和高速度性是其重要特点,所以对查询执行的要求也就更高。而查询执行中查询优化是执行的关键环节,查询优化在很大程度上决定查询的效率或快慢。本文讨论的重点是对分布式查询执行的全局处理策略进行优化,尽可能避免通信代价的开销,并着眼于查询执行的实际代价,从分布式系统中选出一个最优的执行节点。从查询执行的效果出发,通过统计的方式,不断从最近的查询执行代价学习纠正最近查询执行的统计代价,为查询的全局处理提供参考,以达到优化执行、提高执行效率和速度的目的。 1 分布式数据库概述 1.1 分布式数据库的定义 所谓分布式数据库系统就是由分布于多个计算机结点上的若干个数据库组成, 每个子数据库系统都是一个独立的数据库系统,它们都拥有各自的数据库、中央处理机、终端,以及各自的局部数据库管理系统,分布式数据库在使用上可视为一个完整的数据库,而实际上它是分布在地理分散的各个结点上。当然,分布在各个结点上的子数据库在逻辑上是相关的。简单的说,分布式数据库系统是一系列集中式数据库系统的联合。它们在逻辑上属于同一系统,但在物理结构上是分布式的[1]。 1.2 分布式数据库系统的组成 如图1-1所示,分布式数据库系统由以下述成分组成: (1)多台计算机设备,并由计算机网络连接。 (2)计算机网络设备,网络通讯的一组软件。 (3)分布式数据库管理系统,它包括GDBMS、LDBMS、CM,除了具有全局用户接口由GDBMS连接外,还可以具有自治场地用户接口,由场地DBMS,并持有独立的场地目录。 (4)分布式数据库管理者(DDB),包括全局数据库(GDB)和局部数据库(LDB)以及自制场地的自治场地数据库。 (5)分布式数据库管理者(DDBA),它可分为二级,一级为全局数据库管理者(GDBA),另一级问局部或自治场地数据库管理者,统称为局部数据库管理者(LDBA)。 (6)分布式数据库系统软件文档,这是一组与软件相匹配的软件文档及系统各种使用说明和文件。 图1-1 分布式数据库系统的结构 1.3 分布式数据库系统的功能 通常的集中式数据库管理系统应具备以下几个基本的功能[2]: (1)数据库定义功能; (2)数据存取功能; (3)数据库运行管理; (4)数据库的建立和维护功能。 分布式数据库除了须具备以上集中式数据库的功能外,一般还须具有以下几个方面的功能: (1)分布在网络中的各节点的数据库,其物理位置对用户透明; 在用户眼里见到的只是整个系统中有哪些数据库,无论是本地还是远程数据库,用户操纵某一数据库就像操纵本地数据库一样。 (2)处于网络中的各数据库共享的数据应保证一致性:

大数据库优化(SQLServer)

SQL SERVER性能优化综述 近期因工作需要,希望比较全面的总结下SQL SERVER数据库性能优化相关的注意事项,在 网上搜索了一下,发现很多文章,有的都列出了上百条,但是仔细看发现,有很多似是而非或 者过时(可能对SQL SERVER6.5以前的版本或者ORACLE是适用的)的信息,只好自己根据以 前的经验和测试结果进行总结了。 我始终认为,一个系统的性能的提高,不单单是试运行或者维护阶段的性能调优的任务,也不单单是开发阶段的事情,而是在整个软件生命周期都需要注意,进行有效工作才能达到的。所以我希望按照软件生命周期的不同阶段来总结数据库性能优化相关的注意事项。 一、分析阶段 一般来说,在系统分析阶段往往有太多需要关注的地方,系统各种功能性、可用性、可靠性、安全性需求往往吸引了我们大部分的注意力,但是,我们必须注意,性能是很重要的非功能 性需求,必须根据系统的特点确定其实时性需求、响应时间的需求、硬件的配置等。最好能 有各种需求的量化的指标。 另一方面,在分析阶段应该根据各种需求区分出系统的类型,大的方面,区分是OLTP(联机事务处理系统)和OLAP(联机分析处理系统)。 二、设计阶段 设计阶段可以说是以后系统性能的关键阶段,在这个阶段,有一个关系到以后几乎所有性能 调优的过程—数据库设计。 在数据库设计完成后,可以进行初步的索引设计,好的索引设计可以指导编码阶段写出高效 率的代码,为整个系统的性能打下良好的基础。 以下是性能要求设计阶段需要注意的: 1、数据库逻辑设计的规范化 数据库逻辑设计的规范化就是我们一般所说的范式,我们可以这样来简单理解范式: 第1规范:没有重复的组或多值的列,这是数据库设计的最低要求。 第2规范: 每个非关键字段必须依赖于主关键字,不能依赖于一个组合式主关键字的某些组 成部分。消除部分依赖,大部分情况下,数据库设计都应该达到第二范式。 第3规范: 一个非关键字段不能依赖于另一个非关键字段。消除传递依赖,达到第三范式应该是系统中大部分表的要求,除非一些特殊作用的表。 更高的范式要求这里就不再作介绍了,个人认为,如果全部达到第二范式,大部分达到第三

大型数据库的优化方法及实例

大型数据库的优化方法及实例 尹德明杨富玉杨莹时鹏泉 中国金融电子化公司 E_mail: dm_mis@https://www.360docs.net/doc/c15115544.html, 1.引言 随着银行业数据集中,作为整个系统核心的数据库,其存放、管理的数据越来越庞大,已经超越GB而到达TB数据量层次,数据库的性能成为整个系统性能的关键。 国库会计核算系统是国库部门用以进行国库业务的会计核算,并通过支付系统、国库内部往来、同城票据交换系统进行资金清算的计算机网络系统。国家金库会计核算系统每天处理的税票数据多达10万笔,税收高峰可能会到100万笔,这样一年累计下来其中历史登记簿中的数据达到2000万条以上,给检索和数据处理带来非常大的困难。 如何对于一个已经上线运行的重要业务系统,通过对数据库的优化和简单的系统流程调整,实现系统性能的大幅提升具有现实、迫切、重要的意义。 2.优化策略 根据Sybase的数据存储机制,在进行一段时期的数据删除、插入和更新等操作后,数据库往往会产生大量的碎片。大量碎片的存在,会严重影响数据库的I/O性能,如果在使用数据库一段时间后,整理碎片,可以提高数据库的性能。由于国家金库会计核算系统在预处理、日间报解、日初始化等步骤,会大批量进行数据删除、插入和更新等操作,因此会产生大量的数据碎片。碎片整理对于国家金库会计核算系统性能优化将会有重要效果。 Sybase Adaptive Server对于按顺序存储和访问的页,在单个I/O中最多读取八个数据页。由于大部分I/O时间都花在磁盘上的物理定位和搜寻上,因此大I/O可极大地减少磁盘访问时间。在大多数情况下,希望在缺省数据高速缓存中配置一个16K缓冲池。为事务日志创建4K缓冲池可极大地减少数据库系统日志写操作的数量。 好的性能同优良的数据库设计及优秀的程序写法关系极大,可以这样说,如果一个数据库没有好的设计及对程序未进行优化的话即使对参数进行调整也不可能有好的性能。 3.数据库碎片整理 由于Sybase是通过OAM页、分配单元和扩展页来管理数据的,所以对OLTP应用的Database Server会十分频繁地进行数据删除、插入和更新等操作,时间一长就会出现以下几种情况: (1)页碎片 即本来可以存放在一个页上的数据却分散地存储在多个页上。如果这些页存储在不同的扩展单元上,Database Server就要访问多个扩展单元,因此降低了系统性能。 (2)扩展单元碎片 在堆表中,当删除数据链中间的记录行时,会出现空页。随着空页的累积,扩展单元的利用率也会下降,从而出现扩展单元碎片。带cluster index的table也有可能出现扩展单元碎片。当有扩展单元碎片存在,会出现以下问题: 对表进行处理时,常常出现死锁;利用较大的I/O操作或增加I/O缓冲区的大小也无法改变较慢的I/O速度;行操作的争用。 (3)扩展单元遍历 带有cluster index的table会由于插入记录而导致页分裂,但当删除记录后,页会获得释放,从而形成跨几个扩展单元和分配单元的数据,而要访问该数据就必须遍历几个扩展单元和分配单元。这将导致访问/查询记录的时间大大延长,开始时数据库的性能虽然较高,

数据库优化服务(外文翻译)

吉林化工学院理学院 毕业论文外文翻译 阿德里恩.甘卡,伊莫.盖格尔罗马尼亚布加勒斯特迪杜奥列斯库大学德国派尔博登施泰特威廉学校 数据库优化服务Database Optimizing Services 学生学号:******** 学生姓名:*** 专业班级:信息与计算科学0801 指导教师:*** 职称:教授 起止日期:2012.2.27~2012.3.14 吉林化工学院 Jilin Institute of Chemical Technology

数据库优化服务 摘要 几乎每一个组织都存在它的中心数据库。数据库为不同的活动提供支持,无论是生产,销售和市场营销或内部运作。为了获得战略决策的帮助,一个数据库每天都在被访问。要满足这种需求,因此需要与高品质的安全性和可用性。 为实现一些需求所使用的DBMS(数据库管理系统),事实上,是一个数据库软件。从技术上讲,它是软件,它采用了标准的编目,恢复和运行不同的数据查询方法。DBMS 管理输入数据,组织安排这些数据,并提供它的用户或其他程序修改或提取数据的方法。数据库管理就是一种需要定期更新,优化和监测的操作。 关键词 数据库,数据库管理系统(DBMS),索引,优化,成本,优化数据库。

1 引言 该文件的目的是介绍有关数据库的基本优化代表的观念,在不同类型的查询中使用数学估计成本,可以达到性能水平的审查,以及分析在特定查询的例子中不同的物理访问结构的影响。目标群体应该熟悉SQL在关系数据库的基本概念。 通过这种方式,可以执行复杂的查询策略,允许以较低的成本获得信息的使用知识。一个数据库经过一系列转换,直到其最终用途,以数据建模,数据库设计和开发为开始,以维护和优化为结束。 2 数据库建模 2.1 数据建模 数据模型更侧重于数据是必要的,而做出数据的方式应该是一种有组织的和少操作的方式。数据建模阶段涉及结构的完整性,操作和查询。这有多个这方面的事项,如:1。数据定义方式应该是有组织的(分层网络,关系和重点对象)。这需要提供一个规则,来约束实例的定义结构的允许/限制。 2。提供了数据更新协议。 3。提供了数据查询的方法。 一个结构简单的数据通信,能够使得最终用户很容易的理解,是数据建模想要的的实际结果。 2.2 自定义数据库/数据库发展 数据库的开发和自定义答复了顾客的需求。自定义数据库的重要性主要体现在通过它,使向目标客户直接提供服务的产品的商业化成为可能。一个数据库的质量通过定期更新来维护。 2.3 数据库设计 如果数据库有以下任何问题,如故障,不安全或不准确的数据或数据库退化,失去了其灵活性,那么是时候换新数据库了。因此,必须定义具体的数据类型和存储机制以便通过规则和正确地运用操作机制,确保数据的完整性。所有数据库应构建一个客户方面的规范,包括它的用户界面和功能。通过这些可以使运用数据进入一个网站成为可能。

SQL Server数据库优化方案汇总

SQL Server数据库优化方案汇总 50种方法优化SQL Server 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络速度慢 6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。 9、返回了不必要的行和列 10、查询语句不好,没有优化 可以通过如下方法来优化查询 : 1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要. 2、纵向、横向分割表,减少表的尺寸(sp_spaceuse) 3、升级硬件 4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使 用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段 5、提高网速; 6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行 配置。运行 Microsoft SQL Server? 2000 时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的 1.5 倍。如果另外安装了全文检索功能,并打算 运行 Microsoft 搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的 3 倍。将 SQL Server max server memory 服务器配置选项配置为物理内存的 1.5 倍(虚拟内存大小设置的一半)。 7、增加服务器 CPU个数;但是必须明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成 多个任务,就可以在处理器上运行。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并 行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作Update,Insert, Delete还不能并行处理。 8、如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。 like 'a%' 使用索引 like '%a' 不使用索引用 like '%a%' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。 9、DB Server 和APPLication Server 分离;OLTP和OLAP分离

Creator三维模型数据库优化技术(最新)

2010年4月第6卷第2期 系统仿真技术 Syste m S i m u l ation Tec hno l ogy A pr.,2010 V o.l6,N o.2 中图分类号:TP39 文献标识码:A Creator三维模型数据库优化技术 张 建 (91404部队93分队,河北秦皇岛 066001) 摘 要:从提高视景仿真系统的运行效率角度出发,首先简要介绍了著名的三维建模软件M ulti G en Creator,然后针对用于视景仿真系统的三维模型数据库的特点,详细阐述了Creator模型数据库的优化技术。通过对模型数据库进行减少多边形数量、优化层次结构、使用布告板等方法,能显著提高视景仿真系统的运行效率。 关键词:可视化仿真;三维模型;数据库;优化 Optim i zati on Technique of Cr eat or Thr ee dimensi onalModel Database Z HANG J ian (Th e93Un it of91404PLA,Q i nhuangdao066001,Ch i na) Abstract:Taking i m prove the r un efficiency o f v isua l si m ulation syste m as purpo se,the author i n troduce t h e M ulti G en C reato r,then,base on the characteristics o f t h ree di m ensi o nal m ode l da taba se,ill u m i n a te t h e opti m ization techn i q ue o f C reato r three d i m ensiona l m o de l database.The run effic i e ncy o f v isua l si m u l a ti o n sy ste m can be i m prov e through reduce the nu m bers o f po lygon,opti m ize arrange m ent structure and B ill b oard,etc. Key words:scene si m u lation;t h ree di m ensi o nalm ode;l database;opti m izati o n 1 引 言 视景仿真技术(V isual S i m u lation Technology)是计算机技术、图形处理与图像生成技术、立体影像和音响技术、信息合成技术、显示技术等高新技术的综合运用。它分为仿真环境制作和仿真运行驱动2个环节,仿真环境制作主要包括:模型设计、场景构造、纹理设计制作、特效设计等,它要求构造出逼真的三维模型和制作逼真的纹理与特效。仿真驱动主要包括:场景驱动、模型调动处理、分布交互等,它要求高速逼真的再现仿真环境,实时响应交互操作等。 随着三维场景数据量的日益增大以及专为图形渲染设计的图形处理器(graph ic processing un i,t GPU)的普及,在不明显降低图形质量和复杂程度的前提下,解决大数据量仿真场景在速度、质量及场景复杂度之间越来越突出的矛盾,成为一个值得研究的问题。对于可视化仿真系统而言,重要的是仿真系统运行时的速度和流畅性,要在保证系统运行速度的前提下适当提高模型逼真度,在模型逼真度和运行速度之间找到1个平衡点。 2 M ulti G en Creator简介 著名的三维图形建模软件,如M aya,3DMAX, 3Dstud i o等,都以视觉效果为第一建模目标,能生成逼真的三维模型。但是这些软件不考虑模型的

SQL数据库优化方法

SQL数据库优化方法

目录 1 系统优化介绍 (1) 2 外围优化 (1) 3 SQL优化 (2) 3.1 注释使用 (2) 3.2 对于事务的使用 (2) 3.3 对于与数据库的交互 (2) 3.4 对于SELECT *这样的语句, (2) 3.5 尽量避免使用游标 (2) 3.6 尽量使用count(1) (3) 3.7 IN和EXISTS (3) 3.8 注意表之间连接的数据类型 (3) 3.9 尽量少用视图 (3) 3.10 没有必要时不要用DISTINCT和ORDER BY (3) 3.11 避免相关子查询 (3) 3.12 代码离数据越近越好 (3) 3.13 插入大的二进制值到Image列 (4) 3.14 Between在某些时候比IN 速度更快 (4) 3.15 对Where条件字段修饰字段移到右边 (4) 3.16 在海量查询时尽量少用格式转换。 (4) 3.17 IS NULL 与IS NOT NULL (4) 3.18 建立临时表, (4) 3.19 Where中索引的使用 (5) 3.20 外键关联的列应该建立索引 (5) 3.21 注意UNion和`UNion all 的区别 (5) 3.22 Insert (5) 3.23 order by语句 (5) 3.24 技巧用例 (6) 3.24.1 Sql语句执行时间测试 (6)

1系统优化介绍 在我们的项目中,由于客户的使用时间较长或客户的数据量大,造成系统运行速度慢,系统性能下降就容易造成数据库阻塞。这是个非常痛苦的事情,用户的查询、新增、修改等需要花很多时间,甚至造成系统死机的现象。速度慢的原因主要是来自于资源不足。 数据库的优化通常可以通过对网络、硬件、操作系统、数据库参数和应用程序的优化来进行。最常见的优化手段就是对硬件的升级。根据统计,对网络、硬件、操作系统、数据库参数进行优化所获得的性能提升,全部加起来最多只占数据库系统性能提升的40%左右(我将此暂时称之为外围优化);其余大部分系统性能提升来自对应用程序的优化,对于应用程序的优化可以分为对源代码的优化及数据库SQL语句的优化。在本文档只介绍外围优化及SQL语句的优化,对于源代码的优化需要相关方面的专家,形成统一的规范。 一个数据库系统的生命周期可以分成:设计、开发和成品三个阶段。在设计阶段进行数据库性能优化的成本最低,收益最大。在成品阶段进行数据库性能优化的成本最高,收益最小。规范的代码和高性能的语句,功在平时,利在千秋。 2外围优化 1、将操作系统与SQL数据库的补丁打到最高版本,WIN2003最高补丁是SP4, SQL SERVER2000最高补丁是SP4(版本号:2039)。 2、在服务器上不要安装与VA程序任何无相关的软件,甚至一些与VA运行 无关的服务都可以停掉。一般只安装SQL数据库、VA服务端服务及杀毒 软件。 3、杀毒软件避免对大文件进行扫描,特别是数据库(MDF和LDF)文件,一 定要从杀毒软件的范围内排除掉。 4、在进行服务器分区时,分区不要太多,两三个分区就可以了。分区最好 都使用NTFS格式。

数据库优化设计方案

数据库优化方案设计 XX信息管理平台从大型数据库环境四个不同级别的调整分析入手,分析数据库平台的系统结构和工作机理,从九个不同方面设计数据库的优化方案。 对于数据库的数据优化,主要有四个不同的调整级别,第一级调整是操作系统级包括硬件平台,第二级调整是RDBMS级的调整,第三级是数据库设计级的调整,最后一个调整级是SQL级。通常依此四级调整级别对数据库进行调整、优化,数据库的整体性能会得到很大的改善。下面从九个不同方面介绍数据库优化设计方案。 一、数据库优化自由结构 数据库的逻辑配置对数据库性能有很大的影响。为此,数据库平台一般对表空间设计提出有相应的优化结构,如ORACLE公司的OFA(Optimal flexible Architecture),使用这种结构进行设计会大大简化物理设计中的数据管理。优化自由结构,简单地讲就是在数据库中可以高效自由地分布逻辑数据对象,因此首先要对数据库中的逻辑对象根据他们的使用方式和物理结构对数据库的影响来进行分类,这种分类包括将系统数据和用户数据分开、一般数据和索引数据分开、低活动表和高活动表分开等等。 数据库逻辑设计的结果应当符合下面的准则: (1)把以同样方式使用的段类型存储在一起; (2)按照标准使用来设计系统; (3)存在用于例外的分离区域; (4)最小化表空间冲突; (5)将数据字典分离。 二、充分利用系统全局区域 系统全局区域是数据库平台的心脏,如Oracle数据库的SGA(SYSTEM GLOBAL AREA) 。用户的进程对这个内存区发送事务,并且以这里作为高速缓存读取命中的数据,以实现加速的目的。正确的SGA大小对数据库的性能至关重要。SGA包括以下几个部分: 1、数据块缓冲区(data block buffer cache)是SGA中的一块高速缓存,占整个数据库大小的1%-2%,用来存储从数据库重读取的数据块(表、索引、簇等),因此采用least recently used (LRU,最近最少使用)的方法进行空间管理。 2、字典缓冲区。该缓冲区内的信息包括用户账号数据、数据文件名、段名、盘区位置、表说明和权限,它也采用LRU方式管理。 3、重做日志缓冲区。该缓冲区保存为数据库恢复过程中用于前滚操作。 4、SQL共享池。保存执行计划和运行数据库的SQL语句的语法分析树。也采用LRU 算法管理。如果设置过小,语句将被连续不断地再装入到库缓存,影响系统性能。 另外,SGA还包括大池、JAVA池、多缓冲池。但是主要是由上面4种缓冲区构成。对这些内存缓冲区的合理设置,可以大大加快数据查询速度,一个足够大的内存区可以把绝大多数数据存储在内存中,只有那些不怎么频繁使用的数据,才从磁盘读取,这样就可以大大提高内存区的命中率。 三、规范与反规范设计数据库

MySQL数据库查询优化技术

MySQL数据库查询优化技术 MySQL是高效能高稳定的开源数据库产品,由于其超低成本和操作简易便利,在互联网等行业被广泛使用,几乎99%以上的网站都乐于采用mysql作为后台数据库,自从被Oracle收购后,Mysql更是从站长们的宠儿一举成为企业级应用的红人。在当今灸手可热的BAT,Mysql被大量使用。对于想进入互联网行业发展的数据库工程师和DBA们,熟练的Mysql技术无疑是一块很好的敲门砖。炼数成金在过去已经成功举办多种数据库课程,覆盖Oracle,DB2和多种NoSQL数据库,现在再推出MySQL系列,更加丰富了课程线路,也希望可以为大家带来更多学习知识提升价值的机会。 公益性培训课程: 《MySQL数据库查询优化技术》课程概述: 该课程通过15次课程,系统地讲解MySQL数据库的查询优化技术 课程语言:SQL 课程大纲: 第1课数据库与关系代数 综述数据库、关系代数、查询优化技术 综述数据库调优技术 预计时间1小时 第2课数据库查询优化技术总揽 综述查询优化技术范围,包括查询重用、查询重写规则、查询算法优化、并行查询优化等 综述逻辑查询优化,包括子查询的优化、视图重写、等价谓词重写、条件化简、连接消除、非SPJ的优化等 综述逻辑物理优化,包括单表扫描算法、两表连接算法、多表连接算法、基于代价的算法等 初步理解MySQL的查询执行计划。 预计时间1小时

第3课查询优化技术理论与MySQL实践(一)------子查询的优化(一) 第4课查询优化技术理论与MySQL实践(二)------子查询的优化(二) 从理论看,子查询包括的内容和范围,建立清晰的概念 从实践看,MySQL的子查询优化技术的内容和范围,明确掌握子查询优化手段预计时间2小时,每小时一个课程段(子查询是SQL查询优化的重点内容,务必掌握好) 第5课查询优化技术理论与MySQL实践(三)------视图重写与等价谓词重写什么是视图重写?哪些类型的视图可以被优化?MySQL是怎么优化视图的?从而明白在MySQL中怎么写与视图相关的查询语句才能有好的效果? 什么是等价谓词重写?MySQL中怎么写WHERE子句有利于提高查询效率? 预计时间1小时 第6课查询优化技术理论与MySQL实践(四)------条件化简 什么是条件化简?MySQL中对什么样的条件自动进行优化?如何写出可利用索引的条件语句? 预计时间1小时 第7课查询优化技术理论与MySQL实践(五)------外连接消除、嵌套连接消除与连接消除 连接方式有些什么类型?不同类型的连接又是怎么优化的?外连接优化的条件是什么?MySQL中怎么写出可优化的连接语句?MySQL是否支持嵌套连接消除?MySQL是否支持连接消除?MySQL中书写SQL连接查询语句时的优化技巧。 预计时间1小时 第8课查询优化技术理论与MySQL实践(六)------数据库的约束规则与语义优化 数据库的参照完整性(CHECK t NULL等)。什么是语义优化?MySQL是否支持语义优化?怎么利用语义优化的思路人工进行SQL语句的优化? 预计时间1小时 第9课查询优化技术理论与MySQL实践(七)------非SPJ的优化

SQLserver数据库优化

SQLserver数据库优化 在使用索引字段作为条件时,如果该索引是联合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用。iv. 如果临时表的数据量较大,需要建立索引,那么应该将创建 查询速度慢的原因很多,常见如下几种: 1、没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷) 2、I/O吞吐量小,形成了瓶颈效应。 3、没有创建计算列导致查询不优化。 4、内存不足 5、网络速度慢 6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量) 7、锁或者死锁(这也是查询慢最常见的问题,是程序设计的缺陷) 8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。 9、返回了不必要的行和列 10、查询语句不好,没有优化 可以通过如下方法来优化查询: 1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb 应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要. 2、纵向、横向分割表,减少表的尺寸(sp_spaceuse) 3、升级硬件 4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段 5、提高网速; 6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。配置虚拟

内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。运行Microsoft SQL Server? 2000 时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的1.5 倍。如果另外安装了全文检索功能,并打算运行Microsoft 搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的 3 倍。将SQL Server max server memory 服务器配置选项配置为物理内存的1.5 倍(虚拟内存大小设置的一半)。 7、增加服务器CPU个数;但是必须明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作Update,Insert,Delete还不能并行处理。 8、如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。like 'a%' 使用索引like '%a' 不使用索引用like '%a%' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是V ARCHAR。对于字段的值很长的建全文索引。 9、DB Server 和APPLication Server 分离;OLTP和OLAP分离 10、分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器,以支持大型的多层Web 站点的处理需要。有关更多信息,参见设计联合数据库服务器。(参照SQL帮助文件'分区视图') a、在实现分区视图之前,必须先水平分区表 b、在创建成员表后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样,引用分布式分区视图名的查询可以在任何一个成员服务器上运行。系统操作如同每个成员服务器上都有一个原始表的复本一样,但其实每个服务器上只有一个成员表和一个分布式分区视图。数据的位置对应用程序是透明的。 11、重建索引DBCC REINDEX ,DBCC INDEXDEFRAG,收缩数据和日志DBCC SHRINKDB,DBCC SHRINKFILE. 设置自动收缩日志.对于大的数据库不要设置数据库自动增长,它会降低服务器的性能。在T-sql的写法上有很大的讲究,下面列出常见的要点:首先,DBMS处理查询计划的过程是这样的: 1、查询语句的词法、语法检查 2、将语句提交给DBMS的查询优化器 3、优化器做代数优化和存取路径的优化 4、由预编译模块生成查询规划 5、然后在合适的时间提交给系统处理执行

相关文档
最新文档