关于SQLServer的若干注意事项

2008-04-02 10:39:31来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

关于SQL Server的若干注意事项www.想自杀chinai tp ow er.comhZ04f

假如您正在负责一个基于SQL Server的项目,或您刚刚接触SQL Server,您都有可能要面临一些数据库性能的问题,这篇文章会为您提供一些有用的指导(其中大多数也能够用于其他的DBMS)。www.想自杀chinai tp ow er.comhZ04f

在这里,我不打算介绍使用SQL Server的窍门,也不能提供一个包治百病的方案,我所做的是总结一些经验----关于如何形成一个好的设计。这些经验来自我过去几年中经受的教训,一直来,我看到许多同样的设计错误被一次又一次的重复。www.想自杀chinai tp ow er.comhZ04f

您了解您的工具吗?www.想自杀chinai tp ow er.comhZ04f

不要轻视这一点,这是我在这篇文章中讲述的最关键的一条。也许您也看到有很多的SQL Server程式员没有掌控全部的T-SQL命令和SQL Server提供的那些有用的工具。www.想自杀chinai tp ow er.comhZ04f

“什么?我要浪费一个的时间来学习那些我永远也不会用到的SQL命令???”,您也许会这样说。对的,您无需这样做。但是您应该用一个周末浏览任何的T-SQL命令。在这里,您的任务是了解,将来,当您设计一个查询时,您会记起来:“对了,这里有一个命令能够完全实现我需要的功能”,于是,到MSDN查看这个命令的确切语法。www.想自杀chinai tp ow er.comhZ04f

不要使用游标www.想自杀chinai tp ow er.comhZ04f

让我再重复一遍:不要使用游标。假如您想破坏整个系统的性能的话,他们倒是您最有效的最好选择办法。大多数的初学者都使用游标,而没有意识到他们对性能造成的影响。他们占用内存,还用他们那些不可思议的方式锁定表,另外,他们简直就像蜗牛。而最糟糕的是,他们能够使您的DBA所能做的一切性能优化等于没做。不知您是否知道每执行一次FETCH就等于执行一次SELECT命令?这意味着假如您的游标有10000条记录,他将执行10000次SELECT!假如您使用一组SELECT、UPDATE或DELETE来完成相应的工作,那将有效率的多。www.想自杀chinai tp ow er.comhZ04f

初学者一般认为使用游标是一种比较熟悉和舒适的编程方式,可很不幸,这会导致糟糕的性能。显然,SQL的总体目的是您要实现什么,而不是怎样实现。www.想自杀chinai tp ow er.comhZ04f

我曾用T-SQL重写了一个基于游标的存储过程,那个表只有100,000条记录,原来的存储过程用了40分钟才执行完毕,而新的存储过程只用了10秒钟。在这里,我想您应该能够看到一个不称职的程式员究竟在干了什么!!!www.想自杀chinai tp ow er.comhZ04f

我们能够写一个小程式来取得和处理数据并且更新数据库,这样做有时会更有效。记住:对于循环,T-SQL无能为力。www.想自杀chinai tp ow er.comhZ04f

我再重新提醒一下:使用游标没有好处。除了DBA的工作外,我从来没有看到过使用游标能够有效的完成任何工作。www.想自杀chinai tp ow er.comhZ04f

规范化您的数据表www.想自杀chinai tp ow er.comhZ04f

为什么不规范化数据库?大概有两个借口:出于性能的考虑和纯粹因为懒惰。至于第二点,您迟早得为此付出代价。而关于性能的问题,您无需优化根本就不慢的东西。我经常看到一些程式员“反规范化”数据库,他们的理由是“原来的设计太慢了”,可结果却常常是他们让系统更慢了。DBMS被设计用来处理规范数据库的,因此,记住:按照规范化的需要设计数据库。www.想自杀chinai tp ow er.comhZ04f

不要使用SELECT *www.想自杀chinai tp ow er.comhZ04f

这点不太容易做到,我太了解了,因为我自己就经常这样干。可是,假如在SELECT中指定您所需要的列,那将会带来以下的好处:www.想自杀chinai tp ow er.comhZ04f

1 减少内存耗费和网络的带宽www.想自杀chinai tp ow er.comhZ04f

2 您能够得到更安全的设计www.想自杀chinai tp ow er.comhZ04f

3 给查询优化器机会从索引读取任何需要的列www.想自杀chinai tp ow er.comhZ04f

了解您将要对数据进行的操作www.想自杀chinai tp ow er.comhZ04f

为您的数据库创建一个健壮的索引,那可是功德一件。可要做到这一点简直就是一门艺术。每当您为一个表添加一个索引,SELECT会更快了,可INSERT和DELETE却大大的变慢了,因为创建了维护索引需要许多额外的工作。显然,这里问题的关键是:您要对这张表进行什么样的操作。这个问题不太好把握,特别是涉及DELETE和UPDATE时,因为这些语句经常在WHERE部分包含SELECT命令。www.想自杀chinai tp ow er.comhZ04f

不要给“性别”列创建索引www.想自杀chinai tp ow er.comhZ04f

首先,我们必须了解索引是如何加速对表的访问的。您能够将索引理解为基于一定的标准上对表进行划分的一种方式。假如您给类似于“性别”这样的列创建了一个索引,您仅仅是将表划分为两部分:男和女。您在处理一个有1,000,000条记录的表,这样的划分有什么意义?记住:维护索引是比较费时的。当您设计索引时,请遵循这样的规则:根据列可能包含不同内容的数目从多到少排列,比如:姓名 省份 性别。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 小写转大写金额[SQLSERVER]

下一篇: 日志已很大的时候用