DB2数据库使用系统性能优化深入讨论

 

  DB2是一种高性能的年夜型关连数据库治理系统,普及的使用在客户/效力器系统布局中。评价系统性能优化的尺度有:吞吐量、相应工夫、并行才能等。

  筹划数据库

  1. 了解业务系统

  对业务系统的了解程度对整个数据库系统的性能有很年夜影响,一个对业务不了解的筹划职员,只管有丰硕的数据库常识,也很难筹划出性能最佳的数据库使用系统。

  2. 尺度化与非尺度化

  数据库被尺度化后,添加了数据冗余,数据质变小,数据行变窄。多么DB2的每一页可以包罗更多行,那么每一区里的数据量更多,从而加快表的扫描,改进了单个表的查询性能。但是,当查询触及多个表的工夫,需求用很多毗邻操作把信息从各个表中组合在一路,招致更高的CPU和I/O花销。那么,有很多工夫需求在尺度化和非尺度化之间坚持平衡,用恰当的冗余信息来添加系统开支,用空间代价来换取工夫代价。有订单信息表OrderDetail,它外貌记实了送达员信息,收款员信息,物品信息,代价计谋,客户信息…..这些信息分离在送达员信息表、收款员信息表、物品信息表、代价计谋表、客户信息表中存放。假如依据尺度化的要求,OrderDetail查询时就必必要与这么多个表停止毗邻或许嵌套查询。假如OrderDetail表中的数据量是在百万级的,那么一次查询所需求的工夫或许会到达好几个小时。现实结果上,只需在筹划时包管数据的逻辑有效性,很多信息都可以间接冗余在OrderDetail表中,这些冗余的数据可以或许极年夜的提高查询的遵从,从而添加CPU和I/O操作。

  3. 数据条带化

  假如一个表的记实条数赶过必然的局限,那么最基础的查询操作也会遭到影响,需求将该表依据日期水中分离,把最近、最经常用的数据和历史的、不经常用的数据分离开来,或是依据天文职位、部门等等停止分离。另有一种分离要领――垂直分离,即把一个属性列很多的表支解成好几个小表,好比把经常用到的属性放在一个表里,不经常用到的属性放在另一个表里,多么可以加快表的扫描,提高遵从。

  4. 选择数据范例

  对每一属性选择什么样的数据范例很年夜程度上依据表的要求,但是在不违犯表要求的前提下,选择恰当的数据范例可以提高系统性能。好比有text列存放一本书的信息,用BLOB而不是character(1024),BLOB存放的是指针或许文件参照变量,真正的文本信息可以放在数据库之外,从而添加数据库存储空间,使得顺序运转的速率提高。DB2供给了UDT(User Defined Datatypes)遵从,用户可以依据自己的需求界说自己的数据范例。

  5. 选择索引

  索引是数据库中主要的数据布局,它的基础目的便是为了提高查询遵从。现在年夜少数的数据库产物都接纳IBM入手下手提出的ISAM索引布局。运用索引可以快速、间接、有序的存取数据。索引的树立固然加快了查询,另一方面却将低了数据更新的速率,由于新数据不但需添加到表中,也要添加到索引中。此外,索引还需求非凡的磁盘空间和维护开支。因而,要公道运用索引:

  在经常停止毗邻,但是没有指定为外键的属性列上树立索引。
  在频繁停止排序或分组(即停止group by或order by操作)的列上树立索引。按索引来排序或分组,可以提高遵从。
  在前提表达式中经常用到的不同值较多的列上树立检索,在不同值少的列上不要树立索引。
  假如待排序的列有多个,可以在这些列上树立复合索引(compound index),即索引由多个字段复合而成。
  查询优化

  现在的数据库产物在系统查询优化方面曾经做得越来越好,但由于用户提交的SQL语句是系统优化的基础,很难想象一个正本蹩脚的查询筹划颠末系统的优化之后会变得高效,因而用户所写语句的利害至关主要。下面重点阐明改进用户查询筹划的治理方案。

  1.排序

  在很多工夫,应当简化或阻止对年夜型表停止重复的排序。当可以或许利用索引自动以恰当的序次发生输出时,可以阻止排序的步骤,当以下的状况发生时,排序就不克不及省略:

  索引中不包罗一个或几个待排序的列;
  group by或order by子句中列的序次与索引的序次不一样;
  排序的列来自差此外表。
  为了阻止不用要的排序,就要正确地增建索引,公道地兼并数据库表,只管偶然或许影响表的尺度化,但相干于遵从的提高是值得的。假如排序不可阻止,那么应当试图简化它,如减少排序列的局限等。

  2.主键

  主键用整型会极年夜的提高查询遵从,而字符型的相比开支要比整型的相比开支年夜很多,用字符型数据作主键会使数据拔出、更新与查询的遵从低落。数据量小的工夫这点低落或许不会被细致,但是当数据量年夜的工夫,小的改进也可以或许提高系统的相应速率。

  3.嵌套查询

  在SQL言语中,一个查询块可以作为另一个查询块中谓词的一个操作数。因而,SQL查询可以层层嵌套。比方在一个年夜型漫衍式数据库系统中,有订单表Order、订单信息表OrderDetail,假如需求两表联系关系查询:

  SELECT CreateUser
  FROM Order
  WHERE OrderNo IN
  ( SELECT OrderNo
  FROM OrderDetail
  WHERE Price=0.5)

  在这个查询中,找出报纸单价为0.5元的收订员名单。下层查询前往一组值给下层查询,然后由下层查询块再依据下层块供给的值继承查询。在这种嵌套查询中,对下层查询的每一个值OrderNo,下层查询都要对表OrderDetail停止全部扫描,实行遵从显然不会高。在该查询中,有2层嵌套,假如每层都查询1000行,那么这个查询就要查询100万行数据。在系统开支中,对表Order的扫描占82%,对表OrderDetail的搜索占16%。假如我们用毗邻来庖代,即:

  SELECT CreateUser
  FROM Order,OrderDetail
  WHERE Order.OrderNo=OrderDetail.OrderNo AND Praice=0.5

  那么对表Order的扫描占74%,对表OrderDetail的搜索占14%。

  而且,一个列的标签同时在主查询和where子句中的查询中泛起,那么很或许当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套条理越多,遵从越低,因而应当尽量阻止子查询。假如子查询不可阻止,那么要在子查询中过滤掉落尽或很多的行。

  4.通配符

 

  在SQL语句中,LIKE枢纽字支撑通配符立室,但这种立室非凡花消工夫。比方:SELECT * FROM Order WHERE CreateUser LIKE ‘M_ _ _’ 。即使在CreateUser字段上树立了索引,在这种状况下也还是接纳顺序扫描的要领,Order表中有1000条记实,就需求相比1000次。假如把语句改为SELECT * FROM Order WHERE CreateUser >’M’ AND CreateUser <’N’,在实行查询时就会利用索引来查询,显然会年夜年夜提高速率。

  5.distinct

  运用distinct是为了包管在结果齐集不泛起重复值,但是distinct会发生一张使命表,并停止排序来删除重复记实,这会年夜年夜添加查询和I/O的操作次数。因而应当阻止运用distinct枢纽字。

  6.负逻辑

  负逻辑如!=、<>、not in等,城市招致DB2用表扫描来完成查询。当表较年夜时,会紧张影响系统性能,可以用此外操作来庖代。

  7.姑且表

  运用姑且表时数据库会在磁盘中树立相应的数据布局,由于内存的拜访速率远远大于外部存储器的拜访速率,在复杂查询中运用姑且表时,两头结果会被导入到姑且表中,这种磁盘操作会年夜年夜低落查询遵从。此外,在漫衍式系统中,姑且表的运用还会带来多个查询进程之间的同步功效。以是,在停止复杂查询时最好不要运用姑且表。

  8.存储过程

  DB2中的Stored Procedure Builder可以发生存储过程,运转并测试存储过程。存储过程可以包括复杂而复杂的查询或SQL操作,颠末编译后存储在DB2数据库中。用户在屡次运用异常的SQL操作时,可以先把这些SQL操作做成存储过程,在需求用到的中心间接引用其名字停止调用。存储过程在第一次实行时树立优化的查询方案,DB2将查询方案保管在高速缓存里,以后调用运转时可以间接从高速缓存实行,省去了优化和编译的阶段,节省了实行工夫,从而提高遵从和系统利用率。

  最优的查询方案依据某些尺度选择每每不可行,要依据理论的要乞降具体状况,颠末相比停止选择。DB2供给的Query Patroller可以对差此外查询方案的查询代价停止相比,颠末追踪查询语句,前往查询不同阶段的系统开支,从而作出最佳选择。DB2供给的Performance Monitor也对整个数据库系统的性能停止监控,包罗I/O工夫、查询次数、排序工夫、同步读写工夫等等。

  数据库系统的并发控制也能影响系统性能。多个用户的同时操作或许招致数据的不不同性,DB2为了避免同时修正构成数据丢掉和拜访未被提交的数据,以及数据的护卫读,接纳Lock机制来完成控制。

  DB2中可以对表空间、表、表列和索引加锁。锁的粒度越年夜,锁越复杂,开支小,并发度低;粒度小,锁机制复杂,开支年夜,并发度高。年夜型系统在并发处理中假如碰着所要分拨的成本处于锁定外形,系统会把进程挂起等候。假如一个很耗时的查询操作使命于一个经常运用的表上,此时运用表一级锁,意味着整个系统都要等候你的查询完毕以后才可以继承运转。以是在复杂查询中,尽量阻止运用表一级锁。假若有这一类的需求该怎样办呢?可以利用视图来治理这一类功效。视图阻止了对表的间接操作,同时有可以或许包管数据库的高效运转。

 

来自: 新客网(www.xker.com) 详文参考:http://www.xker.com/page/e2007/1012/35912.html


版权声明: 原创作品,许可转载,转载时请务必以超链接要领标明文章 原始原因 、作者信息和本声明。否则将清查功令责任。

原文地址:https://www.cnblogs.com/zgqjymx/p/1975376.html