前言

  我1998年第一次接触SQL Server 6.5 for Windows NT 4.0,当时的感觉就认为SQL Server只是一个功能强大的Excel文件。现在回想起来,当年抱着这样一种态度,我开发的那些应用程序应该是非常幼稚的,其性能可想而知。记得那时候随便查询一笔记录就要花费十几秒,已是司空见惯。当时作为程序员(“码农”)兼DBA,我似乎只会抱怨这个数据库系统的“低级”、“质量差”,或者向boss提议升级服务器的硬件。由于一切都靠自学,我就没有反省过自身的数据库技术水平。

  2003年“非典”期间,我冒着生命危险去参加MCDBA2000的培训课程。XF Kong老师通过系统讲解,使我对SQL Server 2000的了解和掌握不再停留在肤浅的表面。随着逐步深入走向SQL Server底层技术,我对数据库的应用访问和日常运维终于摆脱了低级阶段。之后,各种性能问题的表症和对策也就逐清晰起来。

  最近几年看过Microsoft两位数据库“大拿”Howard Yin、Max Shen的文章,借助两位专家的研究成果,并参考一些技术书籍,借51CTO的这块风水宝地,我陆续会将SQL Server 性能优化的一系列心得与体会整理并发布出来。

一、概述

  《一、数据库设计与性能优化--概述》,即本文。http://jimshu.blog.51cto.com/3171847/1250066

  根据我的理解,OLTP的性能优化主要在于2个方面:

(1)系统架构和设计优化

  要在SQL Server方案中实现最优的性能,最关键的是要有一个很好的数据库设计方案。在实际工作中,许多SQL Server方案往往是由于数据库设计得不好导致性能很差。

  系统架构的设计对系统的性能有着直接的影响,如果设计不当,甚至将面临推倒重来的严重局面。一些大型软件企业或正规的软件开发团队一般都有专职的数据库架构专家参与设计系统架构,而且这个过程可能非常漫长。而“码农”们兼职在设计时往往忽略一些重要问题,或者因为开发周期太短而根本时间没有考虑这些因素,例如,没有考虑到未来3~5年的数据增长量,没有考虑到访问压力,等等。

  在设计数据库、表、索引、视图等对象时,不仅要熟悉这些对象的逻辑工作原理,更要了解这些对象可能存在的瓶颈,争取在设计阶段就实现优化。

  在数据库系统的维护阶段,需要通过一些工具对性能进行监视。

(2)查询优化

   SQL Server数据库查询速度慢的原因有很多,除了系统架构设计方面的问题,查询效率也值得重视。

  我首先将重点放在系统架构和设计优化方面,以下分别从软件生命周期的角度、从理解瓶颈的角度进行详细论述。

二、从软件生命周期的角度

  根据软件工程瀑布模型(Waterfall Model),软件的生命周期由多个部分组成。数据库的优化应当从设计阶段就开始,并贯穿整个软件生命周期。

075711413.jpg

1、设计

  建议由专职的数据库架构专家参与设计。

  需求分析时要具有前瞻性,至少要规划未来3~5年数据增长量。

  《二、服务器优化(1)实现负载平衡》 http://jimshu.blog.51cto.com/3171847/1250070

  《二、服务器优化(2)性能评测与负载预估》 http://jimshu.blog.51cto.com/3171847/1251142

  《二、服务器优化(3)服务器端优化措施》 http://jimshu.blog.51cto.com/3171847/1251545

  《二、服务器优化(4)资源调控器管理工作负荷》 http://jimshu.blog.51cto.com/blog/3171847/1251546

  《二、服务器优化(5)数据库版本的选型》 http://jimshu.blog.51cto.com/3171847/1251547

  《二、服务器优化(6)WSRM管理多个实例》 http://jimshu.blog.51cto.com/3171847/1252417

2、开发

  查询优化,索引优化

  《三、索引优化(1)堆上的非聚集索引》http://jimshu.blog.51cto.com/3171847/1252419

  《三、索引优化(2)聚集索引》 http://jimshu.blog.51cto.com/3171847/1252420

  《三、索引优化(3)聚集索引上的非聚集索引》 http://jimshu.blog.51cto.com/3171847/1252421

  《三、索引优化(4)索引碎片》 http://jimshu.blog.51cto.com/3171847/1254954

  《三、索引优化(5)索引设计指南》 http://jimshu.blog.51cto.com/3171847/1254956

  《三、索引优化(6)筛选索引》 http://jimshu.blog.51cto.com/3171847/1254965

  《查询优化(1)。。。》 、《查询优化(n)。。。》 将列入下一个专题。

3、测试、部署

  数据库物理优化,例如,数据库存储位置的设计。系统资源的优化。

  《四、物理优化(1)范式化》 http://jimshu.blog.51cto.com/3171847/1257298

  《四、物理优化(2)索引视图》http://jimshu.blog.51cto.com/3171847/1257306

  《四、物理优化(3)计算列及其索引》 http://jimshu.blog.51cto.com/3171847/1257310

  《四、物理优化(4)分区视图》 http://jimshu.blog.51cto.com/3171847/1258453

  《四、物理优化(5)表和索引分区》 http://jimshu.blog.51cto.com/3171847/1258459

  《四、物理优化(6)数据库引擎优化顾问》 http://jimshu.blog.51cto.com/3171847/1258469

  《四、物理优化(7)查看索引使用情况》 http://jimshu.blog.51cto.com/blog/3171847/1258817

4、日常运维

  数据库性能监测,资源优化。

  《五、性能监视(1)事件探查器》 http://jimshu.blog.51cto.com/3171847/1259089

  《五、性能监视(2)Windows性能日志》 http://jimshu.blog.51cto.com/3171847/1259091

  《五、性能监视(3)SQL 跟踪》 http://jimshu.blog.51cto.com/3171847/1259093

  《五、性能监视(4)扩展事件》 http://jimshu.blog.51cto.com/blog/3171847/1259321

  《五、性能监视(5)管理数据仓库》 http://jimshu.blog.51cto.com/3171847/1259322

  《五、性能监视(6)数据库审核》 http://jimshu.blog.51cto.com/3171847/1259323

  《五、性能监视(7)SQLDIAG》 http://jimshu.blog.51cto.com/3171847/1262406

三、从理解瓶颈的角度

  从数据库原理和实践经验来看,影响SQL Server有主要瓶颈有以下3项:

164230647.png

1、CPU

  《六、CPU优化(1)CPU技术分类》 http://jimshu.blog.51cto.com/3171847/1265166

  《六、CPU优化(2)超线程》 http://jimshu.blog.51cto.com/3171847/1265237

  《六、CPU优化(3)处理器组》 http://jimshu.blog.51cto.com/3171847/1265438

  《六、CPU优化(4)NUMA架构》http://jimshu.blog.51cto.com/3171847/1266977

  《六、CPU优化(5)最大并行度》 http://jimshu.blog.51cto.com/3171847/1266978

  《六、CPU优化(6)DMV与计数器》 http://jimshu.blog.51cto.com/3171847/1269174

2、内存

  《七、内存优化(1)启用AWE》 http://jimshu.blog.51cto.com/3171847/1269942

  《七、内存优化(2)动态内存分配》 http://jimshu.blog.51cto.com/3171847/1270005

  《七、内存优化(3)使用DMV》 http://jimshu.blog.51cto.com/3171847/1270018

  《七、内存优化(4)内存计数器》 http://jimshu.blog.51cto.com/3171847/1271576

  《七、内存优化(5)内存压力分析》

  《七、内存优化(6)SQL Server 2012内存管理的革新》

3、磁盘I/O

  《八、IO优化(1)磁盘簇》 http://jimshu.blog.51cto.com/3171847/1298514

  《八、IO优化(2)SQLIO工具》 http://jimshu.blog.51cto.com/3171847/1298515

  《八、IO优化(3)稀疏列》 http://jimshu.blog.51cto.com/3171847/1298558

  《八、IO优化(4)数据压缩》 http://jimshu.blog.51cto.com/3171847/1299047

  《八、IO优化(5)文件组》 http://jimshu.blog.51cto.com/3171847/1299170

  《八、IO优化(6)tempdb》 http://jimshu.blog.51cto.com/3171847/1299175

  《八、IO优化(7)减少IO竞争》 http://jimshu.blog.51cto.com/3171847/1299191

四、结语

  《九、OLTP 性能调整与优化--结语》 http://jimshu.blog.51cto.com/3171847/1300717