数据库

位置:IT落伍者 >> 数据库 >> 浏览文章

从外到内提高SQL Server数据库性能


发布日期:2019年03月14日
 
从外到内提高SQL Server数据库性能

如何提高SQL Server数据库的性能该从哪里入手呢?笔者认为该遵循从外到内的顺序来改善数据库的运行性能如下图

第一层网络环境

到企业碰到数据库反映速度比较慢时首先想到的是是否是网络环境所造成的而不是一开始就想着如何去提高数据库的性能这是很多数据库管理员的一个误区因为当网络环境比较恶劣时你就算再怎么去改善数据库性能也是枉然

如以前有个客户向笔者反映数据库响应时间比较长让笔者给他们一个提高数据库性能的解决方案那时笔者感到很奇怪因为据笔者所知这家客户数据库的记录量并不是很大而且他们配置的数据库服务器硬件很不错笔者为此还特意跑到他们企业去查看问题的原因一看原来是网络环境所造成的这家企业的客户机有多台而且都是利用集线器进行连接这就导致企业内部网络广播泛滥网络拥塞而且由于没有部署企业级的杀毒软件网络内部客户机存在病毒掠夺了一定的带宽不仅数据库系统响应速度比较慢而且其他应用软件如邮箱系统速度也不理想

在这种情况下即使再花十倍百倍力气去提升SQL Server数据库的性能也是竹篮子打水一场空因为现在数据库服务器的性能瓶颈根本不在于数据库本身而在于企业的网络环境若网络环境没有得到有效改善则SQL Server数据库性能是提高不上去的

为此笔者建议这家企业想跟他们的网络管理员谈谈看看如何改善企业的网络环境减少广播包和网络沖突;并且有效清除局域网内的病毒木马等等三个月后我再去回访这家客户的时候他们反映数据库性能有了很大的提高而且其他应用软件性能也有所改善

所以当企业遇到数据库性能突然降低的时候第一个反应就是查看网络环境看看其实否有恶化只有如此才可以少走冤枉路

第二层服务器配置

这里指的服务器配置主要是讲数据库服务器的硬件配置以及周边配套虽然说提高数据库的硬件配置需要企业付出一定的代价但是这往往是一个比较简便的方法比起优化SQL语句来说其要简单的多

如企业可以通过增加硬盘的数量来改善数据库的性能在实际工作中硬盘输入输出瓶颈经常被数据库管理员所忽视其实到并发访问比较多的时候硬盘输入输出往往是数据库性能的一个主要瓶颈之一此时若数据库管理员可以增加几个硬盘通过磁盘阵列来分散磁盘的压力无疑是提高数据库性能的一个捷径

如增加服务器的内存或者CPU当数据库管理员发现数据库性能的不理想是由内存或者CPU所造成的此时任何的改善数据库服务器本身的措施都将一物用处所以有些数据库管理专家把改善服务器配置当作数据库性能调整的一个先决条件

如解决部署在同一个数据库服务器上的资源争用问题虽然我们多次强调要为数据库专门部署一个服务器但是不少企业为了降低信息化的成本往往把数据库服务器跟应用服务器放在同一个服务器中这就会导致不同服务器之间的资源争用问题如把文件服务器跟数据服务器部署在同一个服务器中当对文件服务器进行备份时数据库性能就会有明显的下降所以在数据库性能发现周期性的变化时就要考虑是否因为服务器上不同应用对资源的争夺所造成的

笔者建议改善数据库性能时第二个需要考虑的层面就是要看看能否通过改善服务器的配置来实现

第三层数据库服务器

当通过改善网络环境或者提高服务器配置都无法达到改善数据库性能的目的时接下去就需要考察数据库服务器本身了首先就需要考虑数据库服务器的配置

一方面要考虑数据库服务器的连接模式SQL Server数据库提供了很多的数据库模式不同的数据库连接模式对应不同的应用若数据库管理员能够熟悉企业自身的应用并且选择合适的连接模式这往往能够达到改善数据库性能的目的

其次合理配置数据库服务器的相关作业如出于安全的需要数据库管理员往往需要对数据库进行备份那么备份的作业放在什么时候合适呢?当然放在夜晚夜深人静的时候对数据库进行备份最好另外对于大型数据库每天都进行完全备份将会是一件相当累人的事情虽然累得不是我们可是数据库服务器也会吃不消差异备份跟完全备份结合将是改善数据库性能的一个不错的策略

第四层数据库对象

若以上三个层面后数据库性能还不能够得到大幅度改善的话则就需要考虑是否能够调整数据库对象来完成我们的目的虽然调整数据库对象往往可以提到不错的效果但是往往会对数据库产生比较大的影响所以笔者一般不建议用户一开始就通过调整数据库对象来达到改善数据库性能的目的

数据库对象有表视图索引关键字等等我们也可以通过对这些对象进行调整以实现改善数据库性能的目标

如在视图设计时尽量把其显示的内容缩小宁可多增加视图如出货明细表销售人员可能希望看到产品编号产品中英文描述产品名字出货日期客户编号客户名字等等但是对于财务来说可能就不需要这么全的信息他们只需要产品编号客户编号出货日期等等少量的信息即可所以能可浪费一点代码的空间设计两张视图对应不同部门的需求如此财务部门在查询数据时不会为不必要的数据浪费宝贵的资源

如可以通过合理设置索引来提高数据库的性能索引对于提高数据的查询效率有着非常好的效果对一些需要重复查询的数据或者数据修改不怎么多的表设置索引无疑是一个不错的选择

另外要慎用存储过程虽然说存储过程可以帮助大家实现很多需求但是在万不得已的情况下不要使用存储过程而利用前台的应用程序来实现需求这主要是因为在通常情况下前台应用程序的执行效率往往比后台数据库存储过程要高的多

第五层SQL 语句

若以上各个层面你都努力过但是还不满足由此带来的效果的话则还有最后一招通过对SQL语句进行优化也可以达到改善数据库性能的目的

虽然说SQL Server服务器自身就带有一个SQL语句优化器他会对用户的SQL语句进行调整优化以达到一个比较好的执行效果但是据笔者的了解这个最多只能够优化一些粗略的层面或者说%的优化仍然需要数据库管理员的配合要数据库管理员跟SQL优化器进行配合才能够起到非常明显的作用

不过SQL语句的调整对于普通数据库管理员来说可能有一定的难度除非受过专业的训练一般很难对SQL语句进行优化还好笔者受过这方面的专业训练对这方面有比较深的认识如在SQL语句中避免使用直接量任何一个包含有直接量的SQL语句都不太可能被再次使用我们数据库管理员要学会利用主机变量来代替直接量不然这些不可再用的查询语句将使得程序缓存被不可再用的SQL语句填满这都是平时工作中的一些小习惯

总之笔者认为在数据库性能调优的时候若能够遵循如上的顺序必定可以让我们少走冤枉路不花无用功其实数据库调优并没有我们想象的这么难只要我们能够掌握其中的诀窍数据库调优将可以手到擒来

上一篇:SQL Server 2008数据挖掘查询任务

下一篇:SQL Server视图管理中的四个限制条件