SQL SERVER数据库性能优化探讨

时间:2022-10-04 10:12:28

SQL SERVER数据库性能优化探讨

摘 要:本文从SQL SERVER 数据库的范式优化、查询优化、索引优化等方面出发,对数据库的性能优化方法进行探讨,总结了数据库优化应遵循的方法,力图提高SQL语句的执行效率。

数据库技术的应用已由传统数据处理发展至图像处理、商业决策管理等更多的新兴领域,而这些新兴领域对信息系统的高效、安全、稳定的性能要求更高。如何有效组织及处理数据库中的海量数据, 保证系统吞吐量, 成为数据库优化的首要任务。本文针对数据库优化技术探索合适的方法,从范式优化、查询优化、索引优化等多个方面进行探讨,希望可以通过这些优化使信息系统更适用于人们的需求。

1 合理使用范式

关系模式规范化的目的是为了消除存储异常、减少数据冗余,解决数据插入异常、删除异常,保证数据完整性(即正确性和一致性)和存储效率。但是把数据库分解得越多,就会造成查询时的时间浪费。通常认为当一个关系模式可以达到3NF(第三范式)或BCNF时,就具有了合理的结构及良好的性能。当关系规范化达到BCNF时, 虽然可以消除数据冗余太异常, 但却可能会破坏了数据语义。所以,我们在设计时要先尽可能设计为BCNF,如果这时BCNF不到保持函数依赖的要求,破坏了数据语义,就应该则降低为3NF。在这里,3NF是指所有的非主属性都完全依赖主属性且不传递于主属性。一般情况下当数据库符合3NF后,通常就能很好的达到关系模式规范化的目的,它可以从根本上消除了数据冗余和数据不一致的问题。当然,使用了第三范式设计数据库后,还需要对表或者相关数据的结构及性能进行全面调整和优化。

2 采用视图方式

在一些数据量较大的表中,可能只有小部分数据会被访问,而且是被频繁的访问。这时,我们就可以采用视图方式,把这部分数据建立为视图。有时,又会有一些数据需要针对不同角色有不同权限的开放,那么这些数据也可以做成视图,并给视图赋予不同的权限,这就可以从一定程度上保证了数据的安全性。

3 建立存储过程

SQL Server 中存储过程是SQL 语句和流程控制语句的集合。工作中,当某些操作需要使用大量重复的计算时,我们就可以合理使用存储过程储存这些操作,完成软件复用,实现高性能的数据操作。同时,我们在使用存储过程后,还能能过隔离和加密的方法提高数据库的安全性。

4 使用索引优化数据库

应用数据库中会存储海量的数据表,人们对其做查询操作时,若进行全表扫描,会占用相当长的时间。索引与字典的目录类似,是数据库中重要的数据结构,它可以通过关键值指向表中的数据行。通过合理地创建并使用索引,可以避免上述全表扫描,提高数据查询的效率,可以减少由于连接造成的资源浪费,优化数据库性能。我们可以在表或视图的一列或是多列上建索引,也可以在两列或多列上建立复合索引。但是,索引在数据库中会占用存储空间,会牺牲系统性能,会在时间和空间方面带来负面影响,因为表越大,索引也就越大。当一个含有索引的表中数据行被更新时,索引也同样需要更新,需要及时反映数据的变化。在含有索引的表中进行插入、更新和删除的操作时,速度可能会被影响。所以,在创建索引时必须考虑实际数据库的查询需求,以实现基于索引的数据库优化。

在建立索引时,应该找到平衡点,注意以下问题:

(1)如果处理的关系表比较小, 就不需要建立索引。因为直接遍历整个表用的时间并不多, 建立索引反而加重了系统负担。

(2)若表里的数据常会频繁更新, 那么维护索引也将非常频繁, 如果这些工作量超出了索引带给我们的查询优势, 则还不如不使用索引。

(3)索引分为聚集索引和非聚集索引。聚集索引的物理存储按照索引排序。非聚集索引的物理存储不按照索引排序。聚集索引在插入数据的时候,所花费在“物理存储的排序” 时间上较长,但查询数据的速度会比查询非聚集数据的速度快。在建立时应考虑:

(4)不在 where 子句中进行表达式运算操作(如加减乘除)及函数操作。因为上述操作会使查询放弃使用索引。

(5)创建及使用触发器和存储过程时,开始处进行“SET NOCOUNT ON” 的设置,结束时进行“SET NOCOUNT OFF” 设置,以减少服务器向客户机发送信息造成的空间上和时间上的浪费。

(6)尽量分解大事务为小事务,提高系统的并发能力。

(7)小范围内进行查询时,子查询会比连接查询效率高。子查询是指在WHERE或HAVING子句中又包含了一个SELECT语句。

例如,SELECT * FROM 课程表 WHERE 报名人数>(SELECT AVG(报名人数) FROM 课程表)

语句在执行时由内到外逐层执行,小范围内效率较高。但如果大范围内使用了嵌套,且查询嵌套层次越多, 效率越低, 子查询会比连接查询效率低。

(8)如果IN能用BETWEEN代替就用BETWEEN。因为BETWEEN会使用索引,但IN不会用索引。

(9)FROM子句中选择合适的表序

SQL语句FROM子句中的表名有时会是多张表, SQL Server在对表名进行解析时,会按照自右至左的顺序处理,也就是写在最后的表将被最先处理。所以,若FROM子句中包含多表则应该选择记录行最少的表要写在FROM子句的最后。

6 结论

优化数据库可以明显提高计算机系统效率,具有非常深远的意义。在数据库设计阶段对逻辑结构进行合理化优化,可获得系统的较小开销,从根本上提高系统的整体性能。

上一篇:城市房地产系统 下一篇:基于单片机的温度控制系统设计研究