摘 要:本文试在设计中对数据库进行优化的方法进行了分析,分别从逻辑数据库设计和物理数据库设计两个大方面进行了SQL Server 数据库性能优化的方法研究。
关键词:SQL ;Server; 数据库;性能优化
SQL Server作为一种重要的关系型数据库,具有和强大的管理功能和安全性能,被广泛应用于后台数据库,在数据库应用系统中,数据库的性能对整个软件的性能起着重要的决定作用,因此,如何提高数据库的性能,是目前研究的重点。
数据库的生命周期分为设计、开发和成品三个阶段,因此,对数据库性能的优化要贯穿于数据库系统的整个过程,由于在设计和开发阶段进行的成本最低,数据库设计关系到系统的效率和质量,因此,在数据库的设计阶段对数据库性能进行优化,是最高效、实用的措施。
数据库设计包括逻辑设计和物理设计两部分。逻辑设计主要是用数据库组件为业务需求和数据建模,但不需要考虑数据的存储方式和位置;物理设计包括将逻辑设计映射到物理媒体上,尽可能快的使用可用的软硬件对数据库进行物理访问和维护;还包括索引的生成。
1.逻辑数据库设计的性能优化
1.1数据库设计规范化和非规范化的互补。
关系数据库的主要存在形式是表格,对关系数据库金属优化,就是要合理的处理数据库中表与表的关系。科学合理的逻辑数据库设计能够在表与表的关系中进行科学的设计,为关系数据库的优化和应用程序打下良好的基础。标准化的逻辑数据库采用大量有关系的窄表来代替很多列的宽表,使数据库的排序和索引的建立更为迅速,促进了多簇索引的使用使INSERT和DELETE等语句的执行速度更快,使索引更窄、更紧凑,由此形成的空值和多余值的减少也增加了数据库的紧凑性。
由此可知,数据库的规范化处理使数据行趋向变窄,减少了数据的冗余,增加了SQL Server数据库每页的字符含量,对表的扫描和返回多行的速度与单个表的查询功能进行了改进。但在涉及到多个表的使用时,可能要对信息进行复杂的合并处理才能达到要求,这一过程会引起大量的数据处理处理,在一定程度上降低了系统的性能。要解决这一问题,可以采用数据库的非规范化进行处理,非规范化就是违反规范化的规则进行的一些数据库的设计。非规范化可以根据不同的情况采用不同的方式对系统的性能进行一定程度的改善,提高数据库的整体性能。
(1)当规范化设计产生了很多路的合并关系时,在数据表中加入重复的列的方式会使数据库的操作产生困难。在这种情况下,可以采用把实体(表)分割成两个表(把所有的属性分割成两组),把每个表中的首要关键字进行复制的方式进行非规范化处理。就可以把频繁访问的数据和较少访问的数据分开,这样的设计会产生较少的表,还有利于并行处理。
(2)对一些系统的最大值、总计等常用计算字段,可以采取将字段存储到数据库实体中的方式进行处理;在表的记录量很大时,用户可以把这些在查询和报表经常用到的资料的计划总数作为一个独立的字段加入到表中,用触发器与客户端保持数据的一致。
这种做法也加大了表的处理难度,可以采用把一个表分为两个表的方式进行非规范化处理,这样的方式一般应用于含量较大的表中,在使用中需要保持历史记录的,可以把频繁访问的数据和较少使用的数据分开进行处理,就可以减少单个表的操作难度。如果数据行是作为销售分区和地理分区等自身的逻辑工作组进行防伪时,表的分开处理也具有一定的好处。
关于规范化和非规范化的处理原则,一般是以规范化的设计为出发点,在根据特定的情况有选择的对某些表进行非规划设计处理,用规范化和非规范化向结合的策略进行数据库设计。但无论是规范化设计还是非规范化设计,都可以利用SQL Server的以下功能对数据库的完整性进行自动的维护。
(1)利用CHECK约束和PRIMARY KEY 和UNIOUE 约束来保证字段的有效性和唯一性。
(2)利用DEFAULT 和N0T NULL 约束来保证输出必要字段值,对字段的有效性进行保护。
(3)利用F0REIGN KEY 约束来保证记录的参照完整性。
(4)使用IDENTITY 字段,高效生成惟一行的标始符。
(5)利用TIMESTAMP 字段确保在多用户更新间进行高效并发检查,保证用户定义的数据与数据库内的保持一致。
SQL Server的这些强制规则有助于避免因应用程序本身为完全强制完整性规则而引起的数据库错误,尽量保证强制保证数据库的完整性和有效性。
物理数据库设计
2. 磁盘硬件的选择。
一般选择由多个磁盘驱动器组成的RAID(独立磁盘冗余阵列)磁盘系统设备。硬件RAID采用将Windows和应用程序的所有数据进行切片,散分在所有参与RAID阵列的磁盘中的方法来减轻单个磁盘的工作负荷。也按照类似的方法在物理驱动器之间拆分数据,将所有参与RAID阵列的物理磁盘的工作负荷进行平分。因此可以使作为整体参与RAID阵列的磁盘保持同等的繁忙程度,不仅可以提高磁盘I/O的性能,还避免了因某些磁盘I/O请求分配的不平均而成为瓶颈的情况发生。RAID还用奇偶信息和镜像等方法预防磁盘故障的出现和数据的丢失。因此,RAID磁盘系统具有很高的可靠性、存储容量,整体性能很高,而且所需的成本很低。
SQL Server在具体的使用中,一般采用RAID等级0、1和5.
RAID 0是最基本的RAID级别,是传统的磁盘镜像,阵列中的每一个磁盘都有一个或者是多个磁盘的拷贝,能够提供最高的可靠性。由此可见,RAID 0的写操作得以成倍的增加,但对读操作却没有影响,可以进行多个读操作的并行处理,提高了读操作的性能。
RAID 1是最基本的容错RAID级别,称为磁盘镜像或者是磁盘双工。主要是保证事务日志的冗余性。
RAID 5 是使用奇偶校验对数据引入冗余的RAID容错级别。将数据信息和校验信息分散到阵列的所有磁盘中,当数据分割为条时,对附加的奇偶校验位进行计算并将其存储在一个磁盘的条中,解决了单个校验盘的瓶颈和单点失效问题。因此,RAID 5阵列失去一个磁盘驱动器不会对系统造成太大的影响。此外,RAID 5也增加了写操作,可以并行处理一个读操作,成倍的提高了读操作的性能。
通常情况下,在RAID 0驱动器上配置数据库,将事务日志放置在驱动器RAID 1的方法,通过镜像事务日志,为数据库获取最佳的磁盘I/O性能并对数据库的可恢复性进行维护。若考虑到数据的快速恢复,可以将数据库和镜像事务日志放置在RAID 5磁盘上。
综上可知,RAID
5提供的性能比RAID 0或RAID 1要低,但可靠性和恢复能力比它们要高。而且虽然RAID 5的写操作比RAID 0的增加要少,但在实际的应用中,用户的读操作要比写操作多很多,而且写操作的执行操作速度很快,因此,读者对写操作时间的节省很难感觉到。因此,在实际的应用中,一般选用RAID 5来作为硬件磁盘使用。
2.1 索引的选择。
索引的建立是快速获得所需信息的有效方法,索引的访问与 全表扫描相比,查询时间明显的缩短。SQL Server提供了聚集索引和非聚集索引两种索引。虽然索引都可以提高检索和更新数据库的速度,但不同的索引由于功能的不同对于特定的任务可能会有更高的效率,因此,在设计时,要根据实际情况进行选择。
非聚集索引的索引顺序和其表行的物理排序不同,但其叶层包含指向数据页上的表行指针。SQL Server可以通过搜索非聚集索引中的表行指针对数据库中的数据位置进行直接的查找,从而能得以快速的读取数据。
聚集索引按照字典排序对表中数据的进行物理排序,SQL Server按行的形式排列表行,使得它们具有相同的物理顺序和逻辑顺序。由于聚集索引决定了表中数据的物理顺序,因此,每张表只能建立一个聚集索引。
由此可以看出,聚集索引对数据进行物理排序,查询的速度相对较快,但一个表只能建立一个聚集索引。非聚集索引只对数据进行逻辑排序,速度相对较慢,但一个表可以建立多个索引。另外,由于新数据不仅要增加到表中,还要在索引中进行更新,所以,非聚集索引的建立虽然加快了查询的速度,但降低了更新的速度。加上索引的使用还需要额外的磁盘空间和维护开销,因此,在实际的设计选择中,要尽量选择有用的索引和索引形式,以便最好的发挥其作用。
3. 查询语句的选择。
数据库的查询效率是衡量数据库性能的一个重要的指标,但SQL Server的查询会消耗大量资源,在保证查询效率的同时也产生了一些负面的影响,下面就如何优化查询和提高查询性能提出几点建议。
(1)在SQL Server的使用过程中,系统数据库tempdb会根据需要而自动扩展,利用了大量的临时空间。在执行查询进行时,可以利用WHERE语句来对必须处理的行数进行限制,以免对所有的记录行进行非必要的无限制读取和处理。
(2)添加更多的内存。
(3)将一个大的查询拆开,分成多步进行执行。
(4)多个处理器可以使SQL Server进行并行查询,因此,可以在有多个处理器的计算机行运行SQL Server。
(5)如果查询需要游标,则要对使游标类型或游标查询的功能就行进行确认,以标准游标的使用效率。
(6)在确实需要程序使用循环时,则可以考虑在查询内放入循环。
(7)避免对同一查询内的单个表使用多个别名,以免增加查询的难度。
(8)利用guery governor 配置选项来对长时间运行的查询进行阻止,以免系统资源的消耗。
(9)对有关当前查询的统计信息进行记录。在开始优化查询之前要对提供了可以测量优化修订后成功与否的测试标准的Showpian 和I/O 统计信息进行记录。
(10)从基础入手,检查是否存在着可用的索引,检查运行查询时是否有其他的触发器在同时运行,查询是否运用了视图、是否使用了非查找变量符。
4. 存储过程的优化。
存储过程是分析和编译后的SOL 程序,包含大量复杂的查询或者是SQL操作,通过编译的程序存储在SQL数据库中,客户可以利用应用程序对其名称进行查询的方式加以调用。
存储过程在第一次执行时建立优化的查询方案,第一次执行后SQL Server 产生的优化后的查询计划就会被保留在内存中,再次使用时不需要再次编译、优化就可以直接执行查询计划,从而改善了系统的性能,节省了查询的时间。
存储过程通过本地存储、代码预编译及缓存技术能够实现高效的数据操作,合理的使用存储过程不仅优化了程序员的程序设计,还可以极大的提高SQL语言的使用效率;将其使用在服务器上,也有助于减少向客户端传输的数据量,提高传输和处理数据的效率。
最优查询方案的选择,往往要根据实际要求和具体情况进行比较。SQL Server提供的Showpian能够对不同查询结构的性能包括查询计划、索引选择、I/O次数和响应时间等进行比较。在设计开发中,可以对这一工具加以。
5. 对客户/服务器体系结构进行利用
(1)保持客户、服务器工作负载的平衡。一般情况下,服务器最适合处理基于集合的数据检索和维修操作;而客户工作站在显示复杂的用户界面、处理数据格式化和特殊行或列的数据有效验证效率最高,在设计开发时,要充分考虑到两者的特点。发挥各自的优势,努力实现达到均衡负载。
(2)减少网络负载。网络是客户/ 服务器工作的基础,但网络宽带的有限性也常使它成为一个主要的瓶颈。减少网络负载,可以对系统的响应时间进行改善。使用存储过程有效地减少网络流量。这样,客户不需要发送大量的SQL语句,仅仅传递一些参数就可以对存储过程进行调用。
6. 结语
综上所述,在SQL Server 数据库的设计开发阶段进行性能的优化,可以从多个方面进行,具有很大的优势和效益,因此,要把性能优化贯穿于数据库系统的整个周期进行。
参考文献:
计算机与数字工程, 2004,32(1)