没有合适的资源?快使用搜索试试~ 我知道了~
SQL Server 是一款广泛使用的数据库管理系统,对于任何数据库系统而言,性能优化都是至关重要的。本文将按照十步法,深入探讨如何优化SQL Server的数据访问,提高系统效率。
**第一步:应用正确的索引**
索引是数据库性能的关键因素。每个表都应该有主键,主键索引能确保数据的唯一性和完整性,同时提升查询速度。主键通常定义为非空且唯一的字段,创建时会自动创建索引。除此之外,根据查询模式和性能需求,应适当地添加其他辅助索引,例如唯一索引或非唯一索引,以加速特定查询。
**第二步:创建适当的覆盖索引**
覆盖索引是指包含查询所需所有列的索引,这样查询可以直接从索引中获取数据,而无需回表。使用数据库调整顾问(Database Engine Tuning Advisor, DTA)可以帮助识别和创建这样的索引,以提高查询性能。
**第三步:整理索引碎片**
索引碎片可能导致查询性能下降。索引碎片分为逻辑碎片(页内部排序不连续)和物理碎片(页在磁盘上的分布不连续)。通过监视索引统计信息,可以判断是否存在碎片问题。整理碎片主要有两种方式:索引重组(ALTER INDEX REORGANIZE)用于轻度碎片,可以在线进行,不影响查询;索引重建(ALTER INDEX REBUILD)则用于重度碎片,可能需要锁定表,但能彻底清理碎片。
**第四步:将TSQL代码从应用程序迁移到数据库中**
将业务逻辑移至存储过程或函数中,可以减少网络通信,提高执行效率。此外,数据库引擎在处理TSQL时有更优的优化策略。
**第五步:识别并重构低效TSQL**
1. 避免使用"SELECT *",应明确指定需要的列,减少无谓的数据传输。
2. 避免在连接条件中包含不必要的表,减少数据扫描量。
3. 在子查询中避免使用COUNT()等聚合函数,可以改用 EXISTS 进行存在性检查,降低计算复杂度。
4. 尽量避免不同类型列之间的连接,可能导致隐式类型转换,影响索引利用。
5. 避免死锁,合理设置事务隔离级别和资源锁定顺序。
6. 使用基于规则的TSQL编写,而非程序化的,有助于优化器理解并优化代码。
7. 避免使用COUNT(*)获取全表记录数,可以使用 sys.dm_db_partition_stats 视图获取更高效的信息。
8. 动态SQL虽然灵活,但可能导致执行计划复用问题,谨慎使用。
9. 临时表在多线程环境中可能导致额外的资源消耗,考虑使用变量或表变量替代。
10. 对于文本搜索,利用全文索引代替LIKE操作,提高模糊搜索性能。
通过以上十步,可以显著提升SQL Server的性能。不过,优化是一个持续的过程,需要定期评估和调整。同时,应结合实际工作负载、硬件资源以及数据库设计进行综合考虑,才能实现最佳的性能优化效果。

十步优化 SQL Server 中的数据访问........................................................................................3
第一步:应用正确的索引...........................................................................................3
确保每个表都有主键...............................................................................................5
第二步:创建适当的覆盖索引...................................................................................6
创建覆盖索引时使用数据库调整顾问...................................................................7
第三步:整理索引碎片...............................................................................................8
什么是索引碎片?.....................................................................................................8
如何知道是否发生了索引碎片?.............................................................................8
如何整理索引碎片?.................................................................................................9
什么时候用重组,什么时候用重建呢?...............................................................10
第四步:将 TSQL 代码从应用程序迁移到数据库中................................................10
第五步:识别低效 TSQL,采用最佳实践重构和应用 TSQL....................................11
1、在查询中不要使用“select *”............................................................................11
2、在 select 清单中避免不必要的列,在连接条件中避免不必要的表.............12
3、不要在子查询中使用 count()求和执行存在性检查.......................................12
4、避免使用两个不同类型的列进行表的连接...................................................12
5、避免死锁..........................................................................................................13
6、使用“基于规则的方法”而不是使用“程序化方法”编写 TSQL..........................13
7、避免使用 count(*)获得表的记录数.................................................................13
8、避免使用动态 SQL............................................................................................13
9、避免使用临时表...............................................................................................14
10、使用全文搜索搜索文本数据,取代 like 搜索..............................................14
11、使用 union 实现 or 操作.................................................................................14
12、为大对象使用延迟加载策略.........................................................................14
13、使用 VARCHAR(MAX),VARBINARY(MAX) 和 NVARCHAR(MAX)...................14
14、在用户定义函数中使用下列最佳实践.........................................................15
15、在存储过程中使用下列最佳实践.................................................................15
16、在触发器中使用下列最佳实践.....................................................................15
17、在视图中使用下列最佳实践.........................................................................16
18、在事务中使用下列最佳实践.........................................................................16

如何分析和识别你的 TSQL 中改进的范围?..........................................................16
理解查询执行计划.................................................................................................16
查看执行计划时,我们应该获得什么信息.........................................................18
TSQL 重构真实的故事............................................................................................19
分析索引................................................................................................................21
分析查询执行计划.................................................................................................21
小结........................................................................................................................23
第六步:应用高级索引.............................................................................................23
实施计算列并在这些列上创建索引.....................................................................23
创建索引视图.........................................................................................................24
为什么要使用视图?...............................................................................................24
如何创建索引视图?...............................................................................................25
为用户定义函数(UDF)创建索引............................................................................25
在 XML 列上创建索引............................................................................................27
主 XML 索引............................................................................................................27
次要 XML 索引........................................................................................................28
第七步:应用反范式化,使用历史表和预计算列..................................................28
反范式化................................................................................................................28
历史表....................................................................................................................29
小结........................................................................................................................30
第八步:使用 SQL 事件探查器和性能监控工具有效地诊断性能问题..................31
SQL 事件探查器的基本用法..................................................................................31
有效利用 SQL 事件探查器排除与性能相关的问题..............................................34
使用性能监视工具(PerfMon)诊断性能问题.........................................................39
关联性能计数器日志和 SQL 事件探查器跟踪信息进行深入的分析..................46
小结........................................................................................................................47
第九步:合理组织数据库文件组和文件.................................................................48
第十步:在大表上应用分区.....................................................................................49
第十一步:使用 TSQL 模板更好地管理 DBMS 对象(额外的一步)..........................51
小结........................................................................................................................52

十步优化 SQL Server 中的数据访问
年 月 日 网站原创 作者:开心果 译 编辑:晓熊 评论:
17 条
本文 : 数据库优化 管理
【IT168 技术文档】故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,
刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变
慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调
查访问变慢的原因。
经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问更新数据时,数据
库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表甚至有上
千万行数据,测试团队开始在生产数据库上测试,发现订单提交过程需要花 分钟时间,
但在网站上线前的测试中,提交一次订单只需要 ! 秒。
类似这种故事在世界各个角落每天都会上演,几乎每个开发人员在其开发生涯中都会
遇到这种事情,我也曾多次遇到这种情况,因此我希望将我解决这种问题的经验和大家分
享。
如果你正身处这种项目,逃避不是办法,只有勇敢地去面对现实。首先,我认为你的
应用程序中一定没有写数据访问程序,我将在这个系列的文章中介绍如何编写最佳的数据
访问程序,以及如何优化现有的数据访问程序。
范围
在正式开始之前,有必要澄清一下本系列文章的写作边界,我想谈的是“事务性
"#$% 数据库中的数据访问性能优化”,但文中介绍的这些技巧也可以用于其
它数据库平台。
同时,我介绍的这些技巧主要是面向程序开发人员的,虽然 &'( 也是优化数据库的一
支主要力量,但 &'( 使用的优化方法不在我的讨论范围之内。
当一个基于数据库的应用程序运行起来很慢时,)的可能都是由于数据访问程序的
问题,要么是没有优化,要么是没有按最佳方法编写代码,因此你需要审查和优化你的数
据访问处理程序。
我将会谈到 个步骤来优化数据访问程序,先从最基本的索引说起吧*
第一步:应用正确的索引
我之所以先从索引谈起是因为采用正确的索引会使生产系统的性能得到质的提升,另
一个原因是创建或修改索引是在数据库上进行的,不会涉及到修改程序,并可以立即见到
成效。
我们还是温习一下索引的基础知识吧,我相信你已经知道什么是索引了,但我见到很
多人都还不是很明白,我先给大家将一个故事吧。

很久以前,在一个古城的的大图书馆中珍藏有成千上万本书籍,但书架上的书没有按
任何顺序摆放,因此每当有人询问某本书时,图书管理员只有挨个寻找,每一次都要花费
大量的时间。
+这就好比数据表没有主键一样,搜索表中的数据时,数据库引擎必须进行全表扫描,
效率极其低下。,
更糟的是图书馆的图书越来越多,图书管理员的工作变得异常痛苦,有一天来了一个
聪明的小伙子,他看到图书管理员的痛苦工作后,想出了一个办法,他建议将每本书都编
上号,然后按编号放到书架上,如果有人指定了图书编号,那么图书管理员很快就可以找
到它的位置了。
+给图书编号就象给表创建主键一样,创建主键时,会创建聚集索引树,表中的所有行
会在文件系统上根据主键值进行物理排序,当查询表中任一行时,数据库首先使用聚集索
引树找到对应的数据页"就象首先找到书架一样%,然后在数据页中根据主键键值找到目标
行"就象找到书架上的书一样%。,
于是图书管理员开始给图书编号,然后根据编号将书放到书架上,为此他花了整整一
天时间,但最后经过测试,他发现找书的效率大大提高了。
+在一个表上只能创建一个聚集索引,就象书只能按一种规则摆放一样。,
但问题并未完全解决,因为很多人记不住书的编号,只记得书的名字,图书管理员无
赖又只有扫描所有的图书编号挨个寻找,但这次他只花了 分钟,以前未给图书编号时
要花 -! 小时,但与根据图书编号查找图书相比,时间还是太长了,因此他向那个聪明的
小伙子求助。
+这就好像你给 $./ 表增加了主键 $./&,但除此之外没有建立其它索引,
当使用 $./0 进行检索时,数据库引擎又只要进行全表扫描,逐个寻找了。,
聪明的小伙告诉图书管理员,之前已经创建好了图书编号,现在只需要再创建一个索
引或目录,将图书名称和对应的编号一起存储起来,但这一次是按图书名称进行排序,如
果有人想找“&12344526一书,你只需要跳到“&6开头的目录,然
后按照编号就可以找到图书了。
于是图书管理员兴奋地花了几个小时创建了一个“图书名称”目录,经过测试,现在找
一本书的时间缩短到 分钟了"其中 ! 秒用于从“图书名称”目录中查找编号,另外根据编
号查找图书用了 ! 秒%。
图书管理员开始了新的思考,读者可能还会根据图书的其它属性来找书,如作者,于
是他用同样的办法为作者也创建了目录,现在可以根据图书编号,书名和作者在 分钟内
查找任何图书了,图书管理员的工作变得轻松了,故事也到此结束。
到此,我相信你已经完全理解了索引的真正含义。假设我们有一个 $./2 表,创
建了一个聚集索引"根据表的主键自动创建的%,我们还需要在 $./0 列上创建一
个非聚集索引,创建非聚集索引时,数据库引擎会为非聚集索引自动创建一个索引树"就象
故事中的“图书名称”目录一样%,产品名称会存储在索引页中,每个索引页包括一定范围的
产品名称和它们对应的主键键值,当使用产品名称进行检索时,数据库引擎首先会根据产
品名称查找非聚集索引树查出主键键值,然后使用主键键值查找聚集索引树找到最终的产
品。
下图显示了一个索引树的结构

图 索引树结构
它叫做 '7树"或平衡树%,中间节点包含值的范围,指引 引擎应该在哪里去查找
特定的索引值,叶子节点包含真正的索引值,如果这是一个聚集索引树,叶子节点就是物
理数据页,如果这是一个非聚集索引树,叶子节点包含索引值和聚集索引键"数据库引擎使
用它在聚集索引树中查找对应的行%。
通常,在索引树中查找目标值,然后跳到真实的行,这个过程是花不了什么时间的,
因此索引一般会提高数据检索速度。下面的步骤将有助于你正确应用索引。
确保每个表都有主键
这样可以确保每个表都有聚集索引"表在磁盘上的物理存储是按照主键顺序排列的%,
使用主键检索表中的数据,或在主键字段上进行排序,或在 子句中指定任意范围的
主键键值时,其速度都是非常快的。
在下面这些列上创建非聚集索引:
%搜索时经常使用到的8
%用于连接其它表的8
!%用于外键字段的8
9%高选中性的8
%#:&;:'< 子句使用到的8
%=3 类型。
下面是一个创建索引的例子:
>:;(;0&;=
0>=?#.&2?$./�
.1#.&2"$./&%
也可以使用 管理工作台在表上创建索引,如图 所示。
剩余51页未读,继续阅读
资源推荐
资源评论
129 浏览量
2010-04-23 上传
2020-03-03 上传
2019-08-20 上传

192 浏览量
2022-02-09 上传
2024-10-02 上传
2011-03-18 上传
139 浏览量
171 浏览量

131 浏览量
2012-08-30 上传
105 浏览量
2013-07-29 上传
1634 浏览量
点击了解资源详情
资源评论


xxgjenny92
- 粉丝: 3
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 项目部交通安全事故现场处置方案.doc
- 补偿贸易购销合同.doc
- 小区景观-道路-排水系统工程招标文件.doc
- 数据分析通用圆环图Excel模板.xlsx
- 智能家居灯光解决实施方案书.doc
- b2b网络推广活动方案.docx
- 泵站工程质量检验评定表.docx
- 新工贸行业安全生产标准化目录.doc
- 031213安全教育记录.doc
- 《中层管理人员考核办法》.doc
- 璀璨星空IOS风PPT模板.pptx
- 合同管理与索赔案例49(综合案例).doc
- 部分有关通信网简介2022优秀文档.ppt
- 公司工作环境的安全及健康问题.doc
- [河北]剪力墙结构高层住宅工程雨季施工方案.doc
- 建设工程项目管理试题4.doc
安全验证
文档复制为VIP权益,开通VIP直接复制
