SQL Server数据访问优化
SQL Server数据访问优化
优化你的SQL Server数据库中的数据访问

   故事开篇:你和你的团队经过不懈努力,终于使网站成功上线,刚开始时,注册用户较少,网站性能表现不错,但随着注册用户的增多,访问速度开始变慢,一些用户开始发来邮件表示抗议,事情变得越来越糟,为了留住用户,你开始着手调查访问变慢的原因。

  经过紧张的调查,你发现问题出在数据库上,当应用程序尝试访问/更新数据时,数据库执行得相当慢,再次深入调查数据库后,你发现数据库表增长得很大,有些表甚至有上千万行数据,测试团队开始在生产数据库上测试,发现订单提交过程需要花5分钟时间,但在网站上线前的测试中,提交一次订单只需要2/3秒。

  类似这种故事在世界各个角落每天都会上演,几乎每个开发人员在其开发生涯中都会遇到这种事情,我也曾多次遇到这种情况,因此我希望将我解决这种问题的经验和大家分享。
  如果你正身处这种项目,逃避不是办法,只有勇敢地去面对现实。首先,我认为你的应用程序中一定没有写数据访问程序,我将在这个系列的文章中介绍如何编写最佳的数据访问程序,以及如何优化现有的数据访问程序。

十步优化SQLServer数据库的数据访问

范围

  在正式开始之前,有必要澄清一下本系列文章的写作边界,我想谈的是“事务性(OLTP)SQL Server数据库中的数据访问性能优化”,但文中介绍的这些技巧也可以用于其它数据库平台。

  同时,我介绍的这些技巧主要是面向程序开发人员的,虽然DBA也是优化数据库的一支主要力量,但DBA使用的优化方法不在我的讨论范围之内。当一个基于数据库的应用程序运行起来很慢时,90%的可能都是由于数据访问程序的问题,要么是没有优化,要么是没有按最佳方法编写代码,因此你需要审查和优化你的数据访问/处理程序。

  我将会谈到10个步骤来优化数据访问程序,先从最基本的索引说起吧!

第一步到第三步 关于索引的使用

第一步:应用正确的索引
  之所以先从索引谈起是因为采用正确的索引会使生产系统的性能得到质的提升,另一个原因是创建或修改索引是在数据库上进行的,不会涉及到修改程序,并可以立即见到成效。我们还是温习一下索引的基础知识,我相信你已经知道什么是索引了,但我见到很多人都还不是很明白,我先给大家将一个故事吧。   详细>>>
第二步:创建适当的覆盖索引
      假设你在Sales表(SelesID,...,ProductID,...)的外键列(ProductID)上创建了一个索引,假设ProductID列是一个高选中性列,那么任何在where子句中使用索引列(ProductID)的select查询都会更快,如果在外键上没有创建索引,将会发生全部扫描,但还有办法可以进一步提升查询性能    详细>>>
第三步:整理索引碎片
  你可能已经创建好了索引,并且所有索引都在工作,但性能却仍然不好,那很可能是产生了索引碎片,你需要进行索引碎片整理。由于表上有过度地插入、修改和删除操作,索引页被分成多块就形成了索引碎片,如果索引碎片严重,那扫描索引的时间就会变长,甚至索引不可用,因此数据检索操作就慢下来了   详细>>>

第四步到第六步 TSQL代码的使用优化

第四步:将TSQL代码从应用程序迁移到数据库中
  也许你不喜欢我的这个建议,你或你的团队可能已经有一个默认的潜规则,那就是使用ORM(即对象关系映射)生成所有SQL,并将SQL放在应用程序中,但如果你要优化数据访问性能,或需要调试应用程序性能问题,我建议你将SQL代码移植到数据库上(使用存储过程,视图,函数和触发器.       详细>>>
第五步:识别低效TSQL,最佳实践重构和应用
  由于每个程序员的能力和习惯都不一样,他们编写的TSQL可能风格各异,部分代码可能不是最佳实现,对于水平一般的程序员可能首先想到的是编写TSQL实现需求,至于性能问题日后再说。
        TSQL 最佳实践:避免使用count(*)  
        存储过程及触发器最佳实践
        理解查询执行计划  分析索引        
 
第六步:应用高级索引
  经过索引优化,重构TSQL后你的数据库还存在性能问题吗?完全有可能,这时必须得找另外的方法才行。SQL Server在索引方面还提供了某些高级特性,可能你还从未使用过,利用高级索引会显著地改善系统性能,本文将从高级索引技术谈起,另外还将介绍反范式化技术。       详细>>>

第七步:应用反范式化,使用历史表和预计算列

第七步:应用反范式化,使用历史表和预计算列
  如果你正在为一个OLTA(在线事务分析)系统设计数据库,主要指为只读查询优化过的数据仓库,你可以(和应该)在你的数据库中应用反范式化和索引,也就是说,某些数据可以跨多个表存储,但报告和数据分析查询在这种数据库上可能会更快。     详细>>>
有关范式与反范式的讨论
  我个人很喜欢反范式这种应用,每次数据库设计用到时心里都有点欣喜,或许是因为它之间夹杂着那么点美感吧。时而提醒我计算机不仅仅是一门科学,也是一门艺术。         详细>>>
相关文章
 
 
 
 

第八步:使用SQL事件探查器和性能监控工具有效地诊断性能问题

第八步:使用SQL事件探查器和性能监控工具
  SQL事件探查器是一个跟踪和监控SQL Server实例的图形化工具,主要用于分析和衡量在数据库服务器上执行的TSQL性能,你可以捕捉服务器实例上的每个事件,将其保存到文件或表中供以后分析。    详细>>>
SQL事件探查器的基本用法
  SQL事件探查器是一个跟踪和监控SQL Server实例的图形化工具,主要用于分析和衡量在数据库服务器上执行的TSQL性能。   详细>>>
有效利用SQL事件探查器排除与性能相关的问题
       SQL事件探查器还可以利用它许多强大的功能诊断和解决其它不同类型的问题。    详细>>>
 
使用性能监视工具(PerfMon)诊断性能问题
  当你的数据库遇到性能问题时,大多数时候使用SQL事件探查器就能够诊断和找出引起性能问题的背后原因了,但有时并不是万能的。    详细>>>
关联性能计数器日志和SQL事件探查器跟踪信息
       性能监视工具可以提供独立组件的性能统计数据(即上下文信息),它们正好互补。     详细>>>
 

第九步:合理组织数据库文件组和文件

第九步:合理组织数据库文件组和文件
  创建SQL Server数据库时,数据库服务器会自动在文件系统上创建一系列的文件,之后创建的每一个数据库对象实际上都是存储在这些文件中的。   详细>>>

确定SQL Server据库文件的可用空间

  数据库管理员的一个职能就是留意数据库和数据库文件内的空闲空间。自动增长功能作为最后一种手段是很好的,但是主动管理数据库文件是一种更好的方法。   详细>>>
相关文章
 
 
 
 
 

第十步:在大表上应用分区

第十步:在大表上应用分区
  当你的数据库中有一个大表(假设有上百万行记录),如果其它优化技巧都用上了,但查询速度仍然非常慢时,你就应该考虑对这个表进行分区了。  详细>>>
SQL Server 2005分区表提高网站性能
  表分区功能,相当于把一张表大数据无限极细化到多张表上,多个驱动上,但是访问时却还是一样的访问,因为 其实本身并未新建任何表,并且它还可以访问其他服务器以提高速度
相关文章
 
 
 
 
专题策划: IT168技术频道 晓熊  设计制作: 晓熊