免费智能真题库 > 历年试卷 > 信息系统运行管理员 > 2020年下半年 信息系统运行管理员 上午试卷 综合知识
  第34题      
  知识点:   数据库性能优化   数据库   数据库性能   性能优化
  章/节:   信息系统数据资源例行管理       

 
数据库性能优化的方案不包括(34)。
 
 
  A.  表的重构
 
  B.  数据集中存储
 
  C.  索引重建
 
  D.  空间释放
 
 
 

   知识点讲解    
   · 数据库性能优化    · 数据库    · 数据库性能    · 性能优化
 
       数据库性能优化
        数据库维护人员根据用户需求和监测结果对数据库性能进行调整和优化,如执行空间释放、表的重构、索引重建、数据分片等操作。
               空间释放
               事务日志文件记录着用户的各种数据库操作,对于用户操作频繁的数据库,其事务日志空间膨胀速度非常快,数据库维护人员需定期检查事务日志的大小,减少磁盘空间的耗用。以SQL Server2008数据库管理系统为例,压缩数据库。一般步骤如下。
               在SQL2008中清除日志就必须在简单模式下进行,等清除动作完毕再调回到完全模式。
               方案一:完全命令模式
               
               方案二:部分命令模式+任务-收缩-文件(单个数据库)
               
               右键-任务-收缩-文件-确定,数据库的日志只保留了1MB,如下图所示。
               
               数据库收缩日志
               
               优点:清除日志所运行消耗的时间短,90GB的日志在几分钟左右即可清除完毕,做完之后做个完全备份在几分钟内即可完成。
               缺点:此动作最好不要经常使用,因为它的运行会带来系统碎片。普通状态下LOG和DIFF的备份即可截断日志。
               此语句使用的恰当环境:当系统的日志文件异常增大或者备份LOG时间太长可能影响生产的情况下使用。
               表的重构
               对数据库中不断被更新的表,在经过一段事件的处理之后便出现以下问题:表中存在记录的转移,表的数据页中存在未回收的空间,表中的扩充不连续等;同时,数据字典中有关表的统计信息已不能准确反映表中数据的真实情况,优化器使用这些不准确的统计信息,就不能为相关SQL语句生成合理的执行计划。
               对不断被更新的表,数据库管理员应当定期地或者在大批量的数据处理之后重新收集表的统计信息,检查表中数据及磁盘空间使用。如果发现大量记录的转移、未回收的空间,就需要重新构建表。在重构表时,首先需要导出表中数据,在删除并重建表后再装入数据。
               索引重建
               索引是提高数据查询最有效的方法,正确的索引可能使效率提高很多,而无效的索引可能是浪费了数据库空间,甚至大大降低查询性能。针对有频繁的插入/更新/删除操作的表,表和索引将产生较多的碎片,索引将变得非聚簇,性能也将下降,严重的时候会产生索引阻塞等问题,为此需要进行索引重建。索引重建的方法一般有两类:一种是删除并重建索引,如采用DROP INDEX和CREATE INDEX或ALTER TABLE来删除并重建索引;另一种是在现有索引的基础上进行重新整理,如采用DBCC INDEXDEFRAG按照索引键的逻辑顺序,通过重新整理索引里的页来减少外部碎片,通过压缩索引页里的行并删除那些由此产生的不需要的页来减少内部碎片。
               数据分片
               数据分片是将海量数据根据一定的规则分布在多个存储设备上,这样每个存储设备的数据量相对就会小很多,由此实现并行的读/写操作,满足读/写量大的系统的性能需求。系统分片的策略有很多,如按记录编号的特征、按数据的时间范围、基于检索表等。这些数据分片策略之中没有哪个有绝对的优势,选择哪种策略完全是根据系统的业务或数据特征来确定的。值得强调的是:数据分片在对系统的性能和伸缩性带来一定好处的同时,也会大大增加系统开发和维护的复杂度。因此,数据分片只在特殊需要的时候才做,它带来的维护复杂度会比集中存储的方式高出很多。
 
       数据库
        数据库(DataBase,DB)是指长期存储在计算机内的、有组织的、可共享的数据集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。
        系统使用的所有数据存储在一个或几个数据库中。
 
       数据库性能
        数据库性能的调整是数据库管理员的日常工作之一。性能调整工作可以从逻辑上和物理上两个方面进行。
               SQL的性能优化
               SQL(Structured Query Language,结构化查询语言)语句是用户访问关系数据库中数据的唯一方法,通常在一个关系数据库上,服务器的SQL进程会使用该服务器60%~90%的资源,大部分数据库效率的问题都是由于SQL语句编写不善引起的,所以SQL语句的性能优化十分重要。
               为了编写出高效的SQL语句,首先应按照一定的具体规范来编写SQL语句,我们建议每一个DBA都应该收集和整理一份SQL编码规范。其次是在真实数据库上对这些SQL语句进行性能测试和跟踪并不断调整,达到最优后才正式上线运行。最后需要强调的是,随着数据量的变化和数据库版本升级后,往往会有部分SQL性能下降,所以对SQL的跟踪优化是DBA的一项持续不断的工作。
               数据库的性能优化
               DBS是一组程序作用在数据文件上对外提供服务,所以其本身的性能优化也十分重要,对其的优化工作主要是相应的参数调整,步骤一般如下:
               (1)通过监视DBS的内存对象,获得系统性能指标,发现系统的性能缺陷及原因。
               (2)针对导致系统性能缺陷的原因,进行相应的参数调整(如增加数据缓冲区的大小)。
               (3)跟踪参数调整后系统的各项性能指标,看是否达到预期要求,否则继续调整。
               以上3步反复循环迭代,持续进行,保证数据库本身运行状态的最优。
               例如,Oracle通常利用定时执行statspacke.snap包收集数据库的运行状态,然后利用程序spreport.sql对两个采集点之间的数据产生报表,以分析这段时间数据库的各种运行指标。Sybase数据库用sp_sysmon、sp_monitor、sp_configure命令来采集和分析一定时间段内数据库的各种运行指标。
               查询优化
               可以通过如下方法来优化查询:
               (1)把数据、日志、索引放到不同的I/O设备上,增加读取速度。数据量(尺寸)越大,提高I/O越重要。
               (2)纵向、横向分割表,减少表的尺寸。
               (3)根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好,不要对有限的几个值的列建单一索引。
               (4)用OR的子句可以分解成多个查询,并且通过UNION连接多个查询。它们的速度只与是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高。
               (5)在查询SELECT语句中用WHERE子句限制返回的行数,避免表扫描。如果返回不必要的数据,浪费了服务器的I/O资源,加重了网络的负担,降低了性能。如果表很大,在表扫描的期间将表锁住,禁止其他的联接访问表,后果严重。
               (6)注意使用DISTINCT,在没有必要时不要用,它同UNION一样会使查询变慢。
               (7)在IN后面值的列表中,将出现最频繁的值放在最前面,出现得最少的放在最后面,减少判断的次数。
               (8)一般在GROUP BY和HAVING子句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。
               (9)尽量将数据的处理工作放在服务器上,减少网络的开销,如使用存储过程。存储过程是编译好、优化过、并且被组织到一个执行规划里、且存储在数据库中的SQL语句(存储过程是数据库服务器端的一段程序),是控制流语言的集合,速度当然快。存储过程有两种类型。一种类似于SELECT查询,用于检索数据,检索到的数据能够以数据集的形式返回给客户。另一种类似于INSERT或DELETE查询,它不返回数据,只是执行一个动作。有的服务器允许同一个存储过程既可以返回数据又可以执行动作。
               (10)不要在一句话里再三地使用相同的函数,浪费资源,将结果放在变量里再调用更快。
               另外,还可以针对大量只读查询操作进行优化,常见的方法有:
               (1)数据量小的数据,可以考虑不存储在数据库中,而是通过程序常量的方式解决。
               (2)需要存储在数据库中的数据,可以考虑采用物化视图(索引视图)。当DBA在视图上创建索引时,这个视图就被物化(执行)了,并且结果集被永久地保存在唯一聚簇索引中,保存方式与一个有聚簇索引的表的保存方式相同。物化视图减除了为引用视图的查询动态建立结果集的管理开销,优化人员可以在查询中使用视图索引,而不需要在FROM子句中直接指定视图。
               (3)数据存储时可以考虑适当的数据冗余,以减少数据库表之间的连接操作,提高查询效率。
               (4)针对数据的特点,采取特定的索引类型。例如位图索引等。
 
       性能优化
        由于嵌入式系统对实时性的要求较高,因此一般要求对代码的性能进行优化,使代码的执行速度越快越好。以算术运算为例,在编写代码时,需要仔细地选择和使用算术运算符。一般来说,整数的算术运算最快,其次是带有硬件支持的浮点运算,而用软件来实现的浮点运算是非常慢的。因此,在编码时要遵守以下准则:
        .尽量使用整数(char、short、int和long)的加法和减法。
        .如果没有硬件支持,尽量避免使用乘法。
        .尽量避免使用除法。
        .如果没有硬件支持,尽量避免使用浮点数。
        下图是一个例子,其中两段代码的功能完全一样,都是对一个结构体数组的各个元素进行初始化,但采用两种不同的方法来实现。下图(a)采用数组下标的方法,在定位第i个数组元素时,需要将i乘以结构体元素的大小,再加上数组的起始地址。下图(b)采用的是指针访问的方法,先把指针fp初始化为数组的起始地址,然后每访问完一个数组元素,就把fp加1,指向下一个元素。在一个奔腾4的PC上,将这两段代码分别重复10 700次,右边这段代码需要1ms,而左边这段代码需要2.13ms。
        
        算术运算性能优化的例子
   题号导航      2020年下半年 信息系统运行管理员 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第34题    在手机中做本题