SQL Server 2008性能优化研究

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:r54321
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:后台数据库系统的性能优劣决定了软件系统的整体运行效率。为了提高系统的运行效率,需要对数据库系统进行必要的调整和优化。分析了和比较了不同方案对数据库性能的影响。提出了数据库优化的一般性的准则,并结合实际项目的测试数据证明之。
  关键词:数据库设计;性能优化;T-SQL优化
  中图分类号:TP311文献标识码:A 文章编号:1009-3044(2009)34-9837-02
  Research of Optimizing Performance of SQL Server 2008
  CHEN Su-rong, ZHU Xiao-hui
  (College of Computer Science and Technology, Nantong University, Nantong 226019, China)
  Abstract: The efficiency of the software depend on the performance of database. In order to improve the system performance, we should adjust and optimize the database. The article analyze the impact of different features for the database performance optimizing and propose general rules of performance optimizing for database and make several test on it.
  Key words: database design; performance optimizing; T-SQL optimizing
  对管理信息系统而言,对后台数据库数据的存取速度往往决定了整个系统的运行效率[1],尤其是对一个要处理上百万、上千万数据的大型数据库系统而言更是如此。本文从数据库设计、T-SQL编写、应用程序优化,及硬件配置等方面,分析了SQL Server 2008数据库性能优化问题,并给出优化的一般性准则。
  1 数据库设计
  数据库设计包括逻辑设计和物理设计两个部分[2]。数据库逻辑设计又包含业务需求和数据建模。优秀的数据库逻辑设计方案可以有效去除冗余数据、提高系统数据吞吐率、保证数据完整性,并能清楚地表达数据元素间的关系。数据库物理设计包括将逻辑设计映射到物理媒体,利用可用的硬件和软件功能来提高系统对数据库的访问速度。
  1.1 逻辑设计
  数据库设计过程包括:现实世界→需求分析→概念设计→逻辑设计→物理设计[5]。
  概念设计是利用数据模型进行概念数据库的模式设计,一般用E-R图来进行描述。逻辑设计是把概念设计得到的概念数据库模式变为逻辑数据模式,常用到函数依赖、范式、关系分解等多种技术。好的逻辑设计可以为优化数据库性能打下良好的基础。在SQL Server 2008中进行逻辑设计时一般应遵循如下几个原则:
  1) 所有逻辑表结构应尽量满足第一、第二、第三范式[5],从而有效减少数据冗余,提高查询性能并减少因数据冗余导致的数据不一致性错误。
  2) 特殊情况下可以突破前三范式的规范化要求,采用空间换取时间的办法,利用适当的冗余数据来提高数据库的查询速度[6]。例如笔者在开发一个销售系统时,销售表中已有“销售单价”、“返利单价”、“销售数量”三个字段,通过这三个字段可以自动计算出“销售总额”及“返利总额”两个信息,但在进行逻辑设计时特意增加了“销售总额”、“返利总额”两个冗余字段,以方便进行高效率的汇总统计以及提升按销售总额或返利总额的排序效率。同时采用SQL2008中的触发器技术来根据前面三个字段的数据自动生成这“销售总额”和“返利总额”两个数据,保证了数据的一致性和完整性。
  3) 充分利用SQL2008数据库的现有的规则功能来自动维护数据库的一致性和完整性。避免未满足完整性规则的“脏数据”进入数据库。常用的技术有:
  a) 多使用Check约束,确保数据的有效性;b) 给字段设置Default和Not Null 约束,保证字段值的确定性;c) 建立Foreign Key约束,确保外键参照完整性[7];d) 建Primary Key约束,确保纪录唯一性。
  4) 建立合理的索引,索引是数据库中重要的数据结构,对需要排序和查找的列上建立适当的索引,可以大大减少数据库对表进行物理读取的次数,提高运行效率。从另一方面来说,尽管索引可以快速获取数据,但它们也同时减慢数据的update和delete操作并需要更多的额外空间来存放索引表,因此,必须设计出合适的索引。一般来说建立索引应注意以下几点:
  a) 对于查询中很少涉及的列或重复值比较多的列,不要建立索引;b) 数据量较小的表一般无需建立索引;c) 在经常进行连接,但没有指定为外键的列上建立索引;d) 经常出现在where子句、order by子句或group by子句后面的字段上建立索引。
  对同时出现在where子句、order by子句或group by子句的多个字段上创建复合索引,并且复合索引的次序相同于子句中这些字段的排列次序。
  1.2 物理设计
  1) 把数据库事务日志文件和主文件存放到不同的物理磁盘,提高数据存取时I/O并发性[13]。
  2) 当某些表中数据量特别大,而且访问非常频繁时,可以考虑采用将这些表放置在不同的物理磁盘上以提高读写时的磁盘的并发性。
  3) 对数据库进行索引优化,利用索引可以避免表扫描,并减少因查询而造成的I/O开销,从而提高系统性能.可以用SQL Server2008中查询分析器来对索引进行优化和调整。
  2 T-SQL编写
  经过优化的T-SQL语句可以极大提高数据的存取效率,以下是常用的优化技巧。
  1) 对于SELECT语句必须显式定义所有需要返回的列,避免使用星号。通过明确指定需要返回的数据列可以大大减少数据库返回的数据量,减少对磁盘的I/O操作,提高性能。
  2) 在WHERE子句中避免使用导致表扫描的语句,比如: OR, <>, != , ! ,<, >, IS NULL, NOT,NOT IN, NOT LIKE 和LIKE等,因为这些操作很难利用已有索引[11]。
  3) 避免使用NOT IN,可以采用IN,EXISTS,NOT EXISTS和LEFT JOIN 加空值判断。
  4) 如果WHERE条件语句有多个AND条件,请确保至少有一个列有索引,如果没有,可以建立多列复合索引。
  5) 尽可能避免在WHERE条件语句中使用函数计算。
  对一些复杂的多个SQL语句,优先考虑使用存储过程,并避免在事务中进行赋值和复杂计算。存储过程是被预先编译好并被放在数据库内的,因此可以有效减少编译语句所花的时间。 同时,编译好的存储过程会进入缓存,所以对于经常执行的存储过程,除了第一次执行外,后续执行的速度会有明显提高。存储过程也可以更好的利用服务器内存,尤其对处理中间数据量不大的情况,存储过程中可以利用存放在内存的表变量来保存临时数据集。
  3 应用程序优化
  1) 应用程序应尽量避免在循环语句中编写对数据库存取的代码,应改用WHERE条件子句一次性从数据库中获取所有纪录的方式来替换。在分布式应用环境中,前台系统与后台数据库系统间一般采用断开式的连接请求的形式,即前台系统向数据库发出连接请求→数据库响应请求→前台系统发送SQL语句→后台数据库执行SQL语句→断开数据库连接→执行结束。因此,在循环中进行数据库存取将导致数据库频繁的进行建立连接、断开连接的操作而影响整个系统的性能。
  2) 尽可能在应用程序中完成各种计算,从而减少在数据库级别的运行和操作。
  3) 在应用程序中把需要进行多个SQL语句进行联合查询,并且中间会产生较大数据量的操作整合到存储过程中,这样可以大大减少网络的数据流量,提高系统运行效率[14]。
  4 硬件配置
  对于大型的数据库系统,数据库服务器的硬件配置对数据库系统的运行效率有着巨大的影响,硬件配置的升级往往能带来运行效率的大幅提升。
  1) 选用高I/O性能的磁盘驱动器。数据库中的数据存放在物理磁盘上,数据库系统需要频繁对物理磁盘进行读取并向用户返回数据,因此磁盘的I/O性能对数据库的效率具有很大影响,尤其是在大量并发访问的情况下,影响尤其明显[6]。
  2) 优先考虑使用多CPU或多核CPU的服务器系统。多个CPU或多核CPU可以并发执行多个数据库操作线程,因此可以大大提高数据库的并发能力。
  3) 增加服务器内存,大容量的内存可以把整个数据库全部加载到内存中,从而大大减少对物理磁盘的I/O请求,因此可以大大加快对数据库的查询速度。笔者做过一个测试,在一台双核2.2GHz的CPU、1GB内存、7200转/分磁盘的机器上有一个产品数据库。共有50万个产品,执行一个分页存储过程获取最后20条产品纪录的时间是7秒。给机器增加了1G内存后,获取最后20条纪录的时间只有1秒。主要原因就是系统把整个产品表都缓存到了内存,查询速度大大加快。
  5 结束语
  总之,数据库性能的优化是一个整体工程,应考虑到方方面面。每一个小的调整,都可能会对系统性能产生很大影响。另外,影响关系数据库性能的因素错综复杂,因此优化策略必须根据实际情况进行不断调整和测试。以上列举了影响数据库系统性能的一些共性问题。在实际应用中,必须根据实际情况进行适当的折衷和平衡。
  参考文献:
  [1] 车争,夏巨谌,胡国安. 基于SQL Server 的数据库与应用程序的优化[J]. 计算机辅助工程,2002,(4):14-18.
  [2] 刘云生. 现代数据库技术[M].北京:国防工业出版社,2001.
  [3] Molina H G, Salem K. Main Memory Database Systems: An Overview[J]. IEEE Transactions on Knowledge and Data Engineering,1992, 4(6): 509-516.
  [4] 李春葆,曾平. 数据库原理与应用[M]. 北京:清华大学出版社,2005.
  [5] 萨师煊,王珊.数据库系统概论[M].3版.北京:高等教育出版社,2000.
  [6] 钱文波,谢金宝.SQLSerVer数据库性能优化技术[J].微型机与应用,1999,18(3):7-9,22.
  [7] 赵颖,沈金龙.基于SQLSerVer的应用程序优化[J].电子工程师,20(X),26(5):7-9.
  [8] Scott W. Ambler ,Mapping Objects To Relational Databases[M] . AmbySoft2 Inc. ,Februrayr 1999.
  [9] 尹大成,周津,朱明.电信网管数据模型三种数据库实现性能测试报告[P].中兴通讯技术报告.20031041.
  [10] Johnny Olsson ,WM2data ,Allan R. Lassen ,Ramb ll. Experiences from Ob2ject2relational Programming in Oracle8,http:∥www.cit.dk/COT/reports/reports/Case4/062v1.4/cot2420621.4.pdf.
  [11] 尹萍,SQL Server 数据库性能优化[J].计算机应用与软件,2005,(3):52-54.
  [12] ROB P, CORONEL C. DataBase System Design, Realization and Management[M]. 北京:清华大学出版社,2005.
  [13] 王宏志, 李建中, 骆吉洲, 等. 海量关系数据库的压缩存储与查询策略[EB/OL]. http://dev.csdn.net/develop/article/82/82593.shtm,2005.
  [14] 车争,夏巨谌. 基于SQL Server 的数据库与应用程序的优化[J].计算机辅助工程, 2002,(4):14-18.
其他文献
由于PLC强大的逻辑功能和高可靠性以及PC机的软硬件资源,PLC在大型机房智能管理系统中的应用越来越广泛,PLC显著提高了计算机机房的管理水平,在高等院校机房、图书馆、电子阅
二叉树的遍历操作和其它操作的算法实现,都必须先创建二叉树。分析常规创建二叉树方法的特点和不足,给出利用中序遍历和后序遍历结果还原二叉树的算法,利用这一方法,给出由前
分析了Adhoc网络的多跳性对其TCP性能的影响,提出了一种改进的超时重传机制。NS2仿真实验结果表明提出的方案能有效地改善Ad hoc网络的TCP性能。
“用而不疑”,语出汉王逸撰《楚辞章句&#183;离骚经章句》,原指殷商武丁的用人政策。后亦日“用人不疑”。五代、宋以后有了完整的“疑人不用,用人不疑”之说。历代帝王能用此策
从广西大学罗氏沼虾苗池采样分离到的红假单胞菌,经测定,其干菌体粗蛋白的含量为54.3%,氨基酸总含量为42.35%,八种必需氨基酸齐全,氨基酸比值达45%,而且B族维生素的含量也非常丰富,
8月中旬,在阿坝的九环线上,我们沿着杂谷脑河谷一路上行。蓬勃的阳光,从湛蓝湛蓝的天上,从高高雪峰的顶端降临,降临在蓊郁的森林和冷气袭人的峡谷。一丛丛叫不出名字来的浓绿的、浅红的、淡紫的树叶,在河谷两岸的空蒙山色中高高下下、隐隐约约地跳跃。亘古不变的玻璃般透明的水声,伴随着幽深的河谷起起落落,仿佛当年马帮留下的悠远绵长的铃声。  一些羌女在路边摆着背篼兜售苹果,或者是那些晒干的野生菌,甚至有茂汶花椒
在日粮中添加150~250毫克/千克的铜,对猪有明显的促生长作用并改善饲料转化率。它对兔子的功效前人也有一些研究,但结论尚不一致。本课题通过探讨日粮中不同硫酸铜的添加水平对新西兰仔
兔伪结核病是由伪结核耶尔森氏杆菌引起的慢性、消耗性疾病.2001年4月份,我市某獭兔饲养户饲养獭兔230只,其中10余只母兔陆续发生以食欲不振、慢性下痢、消瘦为特征的疾病,曾