加入收藏 | 设为首页 | 会员中心 | 我要投稿 济南站长网 (https://www.0531zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL SERVER调优常用方法

发布时间:2016-08-14 10:55:58 所属栏目:MsSql教程 来源:站长网
导读:说起SQL SERVER的调优,我想大伙也很想知道这方面的知识。本人也正在探索的路上,大家有什么好 的意见,欢迎一起探讨、研究。博取众人之长,才能扬长避短。 本
说起SQL SERVER的调优,我想大伙也很想知道这方面的知识。本人也正在探索的路上,大家有什么好 的意见,欢迎一起探讨、研究。博取众人之长,才能扬长避短。

本文中的内容主要是摘自《程序员的 SQL金典》,如若大家想拜读,可在网上下载拜读(当然最好的方式还是购买作者的书)。

关于调优 的方案,有涉及硬件方面的知识,也有涉及软件方面的知识。但本人只是个软件方面的IT男,所以只是 记录软件方面的内容。

其实关于SQL SERVER或者是其它数据库来讲,有些优化手段都是一致的。比如 常规的方式有如下几种方式:

创建必要的索引

大学读书时就听说过数据库里面的索引,一直没去深究过,也在无知无畏中进行了四年多的开发生涯 ,想来惭愧的很,今天有幸了解,顿感人生之阔然开朗一般。索引,不单是数据库里面才有,像我们写 代码不也碰到数组也有索引嘛。索引就是已经按照某一种固定好的方式排序好内容,然后我们再去通过 索引位置来定位到它。说到SQL SERVER的索引,有必要讲讲两个概念。分别是聚簇索引和非聚簇索引。

1、聚簇索引:就是索引存储的方式跟内容物理存储的方式一致

2、非聚簇索引:就是索引存储的 方式跟内容物理存储的顺序不一致

下面简单说明两者的区别。最简单的例子就是汉语词典的方式,对 于一本汉语词典来说,它的物理存储顺序是已经固定好了的,是通过拼音的顺序排列好的,这也就是说 ,汉语词典的物理存储方式就是通过拼音的方式来存储。比如以拼音来建立的索引,就是聚簇索引。WHY ?因为索引的存储跟汉语词典的物理存储是一致的,也就是上面概念所说的分类。那么非聚簇索引是什 么情况,比如像汉语词典里面偏旁部首是一种索引的话,那么偏旁部首的索引就会是非聚簇索引了。WHY ?因为它跟汉语词典原有的物理存储方式不一致。当创建聚簇索引时需要每一张表只能有一个聚簇索引 ,因为表中数据的物理顺序只能有一个,而非聚集索引则可以创建多个。

注:由于索引需要占据一定的存储空间,而且索引也会降低数据插入、更新和删除的速度,所以应该 只创建必要的索引,一般是在检索的字段创建索引。 对于删除来说,索引会造成碎片的问题。因为当我 们删除一条记录的时候,对应的索引并不会删除。造成创建的索引被闲置,一旦闲置的索引碎片多了, 就会影响查询的效率。系统的垃圾碎片也是一样的道理,需要定期清除。对于索引来说,发现使用索引 搜索的速度慢了,就需要定期去重建索引,重建索引将会先删除之前创建的索引,然后再新建新的索引 ,主流数据库管理系统都提供了重建索引的功能。

使用预编译查询

很多人会使用存储过程把SQL语句预先编译起来,以此来达到优化的目的。有的项目是根据用户的输 入来动态执行SQL语句,不管何种方式,都使用参数化的方式来执行,这样不仅可以避免SQL注入漏洞攻 击,最重要数据库会对这些参数化SQL执行预编译,这样第一次执行的时候DBMS会为这个SQL语句进行查 询优化并且执行预编译,这样以后再执行这个SQL 的时候就直接使用预编译的结果,这样可以大大提高 执行的速度。

调整WHERE 子句中的连接顺序(这个不是很懂?)

DBMS 一般采用自下而上的顺序解析WHERE 子句,根据这个原理,表连接最好写在其他WHERE条件之前 ,那些可以过滤掉最大数量记录。

比如下面的SQL语句性能较差:

SELECT *
FROM T_Person
WHERE FSalary > 50000
AND FPosition= ‘MANAGER’
AND 25 < (SELECT COUNT(*) FROM T_Manager
WHERE FManagerId=2);

我们将子查询的条件放到最前面,下面的SQL语句性能比较好:

SELECT *
FROM T_Person
WHERE
< (SELECT COUNT(*) FROM T_Manager
WHERE FManagerId=2)
AND FSalary > 50000
AND FPosition= ‘MANAGER’ ;

SELECT语句中避免使用'*'

对于SELECT * FROM TABLE这种方式,我想很多人都会这么去查询。WHY?一方面是因为系统的数据量 级别还比较低,二来也图方便。但是随着项目的数据量疯长,系统的性能急速下降之后,优化的每一种 方式都需要引起我们的重视。像查询这种方式来讲,如果不用检索出所有列的情况,尽量指定查询的列 。这能有效减轻网络的负载和服务器资源的消耗。即使确实需要检索所有列,也不要使用SELECT *,因 为这是一个非常低效的方法,DBMS在解析的过程中,会将*依次转换成所有的列名,这意味着将耗费更多 的时间。在SQL Server Management Studio工具里面查询图省事,数据量不大我觉得还是可以的:),但 至少在代码里面是不建议这么处理。

多条SQL语句压缩到一句SQL中去执行

对于SQL语句的执行,每次都要建立网络连接、进行权限校验、进行SQL语句的查询优化、发送执行结 果,这个过程是非常耗时的,因此应该尽量避免过多的执行SQL语句,能够压缩到一句SQL执行的语句就 不要用多条来执行。

用Where子句替换HAVING 子句

避免使用HAVING 子句,因为HAVING 只会在检索出所有记录之后才对结果集进行过滤。如果能通过 WHERE 子句限制记录的数目,那就能减少这方面的开销。HAVING 中的条件一般用于聚合函数的过滤,除 此而外,应该将条件写在WHERE 子句中。

(编辑:济南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读