SQLSERVER数据库性能优化研究(论文)毕业论文.doc
. . . . SQL SERVER数据库性能优化研究Researching Of The SQL SERVERDatabase Performance Optimization26 / 31摘 要数据库系统的性能最终决定数据库的可用性和生命力。大多数数据库系统在运行一段时间后都会存在一定的性能问题,主要涉与数据库硬件、数据库服务器、数据库存、应用程序、操作系统、数据库参数等方面。因此,基于数据库系统的性能调整与优化对于整个系统的正常运行起着至关重要的作用。数据库性能调整与优化涉与到多个层面,通过统一规划、系统分析做出相应的调整,可以提高数据库的稳定性和可用性,保障系统高效地运行,解决系统瓶颈,节约系统开销,具有良好的应用价值。同时也对理论研究提供了一定的方法指导。基于此,论文根据本人在实际工作中遇到的问题和平时对数据库的使用经验,将数据库设计、合理的索引添加以与SQL语句优化等方面的性能调整与优化问题作为主要研究容,对其进行了深入地分析和讨论,给出了一般情况下SQL SERVER数据库应用系统的性能调整策略与优化方法。首先,介绍了数据库性能调整的相关研究背景、论文选题意义以与数据库性能调整与优化架构,涉与性能调整与优化的概念、性能评价指标以与数据库优化的主要方面。其次,对常用的几种优化技术进行了详细地介绍与说明。总结归纳了数据库逻辑结构和物理结构的优化、SQL语句优化的实质与目的、方法与技巧,索引创建的相关规则,SQL SERVER分区技术等。最后提出一个针对SQL SERVER数据库的系统性能总体调整策略。最后,对SQL SERVER数据库性能调整与优化问题进行了总结。关键词:数据库;SQL SERVER;性能优化AbstractThe performance of database systems eventually determines their availability andsurvivability.Most of them will bring about some performance problems more orless after running for a period of time,which mainly involve database hardware,database server,database memory,applications,operating systems and databaseparameters,etc.Therefore,performance tuning and optimization of database systems,whichconcern multiple aspects,are very vital to the normal running of the whole system.Through a unified plan and systematical analysis to make appropriate adjustment,thestability and availability of database will be improved,high running efficiency will beguaranteed,system bottleneck will be solved,system overhead will be reduced,considerable applicability and in the meanwhile will be obtained,and some guidelinesfor theoretical research will be provided.Based on the above-mentioned idea,byproblems meeting in working experience of using SQL database,the paperprincipally pays attention to the research on the performance tuning and optimization ofSQL statements, and makes a deepanalysis and discussion.It suggests in general some performance tuning strategies andoptimization approaches of SQL Server application systems to drive the developmentof SQL Server performance management and optimization technology.Firstly,the paper introduces the corresponding research background ofperformance tuning of database,significance of selected topic and framework ofperformance tuning and optimization of database including their concepts,performanceevaluation index and primary aspects of optimization.Secondly,several common optimization techniques are introduced and explainedin detail.This paper summarizes optimization of database logical structure and physical structures,methods and techniques of SQL optimization,relevant rules of index creation,andintelligent use of SQL Server partitioning techniques. Thefore-and-aft performance indexes of various optimization techniques are analyzed andcompared.An overall tuning strategy of system performance for SQL Server databasesis put forward in the end.Finally,this paper summarizes and prospects the problems of performance tuningand optimization of SQL SERVER databases.Keywords:database;SQL SERVER;performance;optimization目录1 绪论11.1课题研究背景11.2研究意义与目的11.3研究的容与组织结构22 数据库性能优化架构32.1性能调整与优化概述32.2数据库优化的目标32.2.1提高系统的吞吐量32.2.2缩短系统的响应时间42.3性能调整的步骤42.3.1优化业务逻辑52.3.2调整数据结构设计52.3.3优化数据库的逻辑结构52.3.4优化数据库的操作53 性能优化技术介绍63.1数据库结构优化63.1.1数据库逻辑结构的优化63.1.2数据库物理存储结构的优化63.1.3使用分区73.2 SQL查询语句的优化93.2.1合理使用索引93.2.2优化SQL语句的一些具体策略114 商品订单管理系统数据库设计165 优化实例185.1数据库物理结构的优化185.2添加必要的索引185.2.1确定预索引字段205.2.2创建适当的索引205.2.3实验结果分析205.3 SQL语句的优化216 总结24参考文献25致261 绪 论1.1课题研究背景数据库技术是计算机科学技术发展最快、应用最广泛的领域之一,在信息管理自动化程度日益提高的今天,数据库技术已经成为现代计算机信息系统和应用系统的基础和核心。数据库技术最初产生于20世纪60年代中期,从最初的层次模型、网状模型,到目前的关系模型、面向对象模型,己经过40年左右的发展。数据库建设是现代信息产业的基本建设工程,一个国家拥有多少自己的数据库,能用数据库提供多少服务,是各国经济实力、文明程度和科技水平的重要标志。我国引进数据库技术始于20世纪70年代末,自进入20世纪80年代以来,我国数据库建设有了较大发展,从微型计算机上运行的数据库到当前大型数据库系统的引入和应用。但从对数据库系统的应用效果和对数据库技术指标掌握上来比较,与发达国家之间仍然存在较大的差距。数据库技术应用从传统的商务数据处理不断扩大到许多新的领域,如计算机图像处理、多媒体应用、商业管理、GIS等,要使这些领域中应用的信息系统高效、正常、安全地运行,其中最为显著的就是数据库的性能问题。在网络应用和电子商务高速发展的时代,信息系统在国民经济建设中担负着越来越重要的任务,如何使有限的计算机系统资源充分发挥应有的作用?如何保证用户的响应速度和服务质量?如何保证未来的某个时间保持现有的运行性能?这些问题都属于数据库性能优化的畴。随着数据库规模的不断扩大,数据库系统的性能问题也越来越突出,数据库应用系统能否正常、高效地运行倍受关注,数据库优化技术方法的探索具有非常重要的意义。1.2研究意义与目的SQL SERVER在数据库领域一直占据着不小的份额。SQL SERVER现在可用于大型机、客户/服务器以与PC平台,适合于各种操作系统,包括Microsotf Windows和Windows NT、0S/390(MVS)、各种UNIX操作系统、LINUX等。同时,SQL SERVER数据库在国外也获得了诸多成功应用。企业资源规划应用程序包、数据仓库以与许多公司的客户应用系统都要依赖SQL SERVER。SQL SERVER数据库产品在整个数据库产品的应用中占据了不小的比例,并且有不断上升的趋势。SQL SERVER数据库系统博大精深,其系统管理工作非常复杂。对于SQL SERVER数据库来说,操作系统的性能、服务器硬件的性能、数据库的设计、表空间的规划、聚簇的使用、并行控制等无一不影响其运行的整体性能。SQL SERVER数据库服务器是高度可优化的软件产品,对SQL SERVER数据库进行性能调整与优化具有非常重要的意义。目前国外关于SQL SERVER数据库系统的应用实例优化并不多,而且讲解比较理论化。因此,本文根据自己平时的实际工作所遇到的一些问题和自己对SQL SERVER数据库的使用经验,主要从数据库设计优化、索引添加、查询优化这三个方面进行实验测试,通过对各种优化技术的介绍、分析和研究,对使用不同优化技术前后的性能评价指标进行比较,体现各种优化技术对数据库运行效率的影响程度,提出SQL SERVER数据库应用系统性能优化的合理方法。使得能有效的使用SQL SERVER数据库产品,将它的性能调整到更适合自己的需要。1.3研究的容与组织结构数据库性能问题是当今诸如管理信息系统等众多数据库应用系统所面临的共同问题,为了解决系统运行过程中遇到的种种瓶颈,对数据库性能调整理论和应用的研究是迫切需要的。本文对目前SQL SERVER数据库性能调整的一些优化技术的应用实践进行了讨论,具有一定的理论研究价值和现实意义。各章节安排如下:第一章综述了数据库性能调整的研究现状和发展概况,阐述了论文研究的意义与目的。第二章介绍了数据库性能调整与优化的主要目标,分析了系统性能评价指标和数据库性能优化的主要方面。第三章对性能优化技术介绍。第四章详细介绍了SQL SERVER数据库性能调整与优化的相关技术,包括数据库逻辑结构和物理结构的优化、SQL语句优化、合适索引的创建、SQL SERVER分区技术等等。第五章开发了一个商品订单管理系统作为测试用例,对如何优化数据库的性能进行具体的测试和分析。第六章总结全文,肯定了数据库性能调整的应用价值。2 数据库性能优化架构2.1性能调整与优化概述性能调整(performance tuning)是一项活动,这项活动通过优化应用程序、修改系统参数、改变系统配置(硬件调整)来改变系统性能。性能调整包括对硬件配置操作系统(OS)与关系型数据库管理系统(RDBMS)配置,以与对访问这些组件的应用的详细分析与优化。系统性能的判定标准依赖于性能衡量的研究,通常认为性能的指标可以通过处理一个事务所需的I/O量、CPU时间量、以与响应时间来衡量。性能会随特定环境的不同而变化,并受应用程序、体系结构和资源、服务器以与并发活动的具体情况影响。性能调整的一个主要目标是消除瓶颈。瓶颈(bottle neck)是性能限制的重要因素,它可以是硬件或软件,如果不是在正确配置和调整的系统中,就会严重地影响系统性能。减少瓶颈可以最发挥一个系统的性能。为有效地对系统进行调整,必须遵循一套特定的步骤或方法,去调整和优化系统中的所有组件,包括应用、硬件与SQL SERVER。首先,讨论将涉与系统调整的不同组件。在本章后面部分,着重介绍性能调整的方法论。2.2数据库优化的目标有不同的方式确定性能调整工作的目标。数据库应用系统可以用各种定量的方法分析,其中最重要指标如下:2.2.1提高系统的吞吐量吞吐量是指给定时间服务器能够处理的查询总数,即每个单元时间完成的工作,以每秒钟的事务量(tps)表示;该值越高越好。提高系统的吞吐量也有两种方法:l 在同样的资源环境下做更多的工作(通过减少服务时间);l 通过减少总的响应时间使工作做得更快。要做到这一点,可以将用户等待的资源加倍,如系统受到CPU限制,则可以增加CPU的数量。在任何一个系统中,吞吐量和反应时间作为调整目标通常是互相对立的。如果反应时间长(坏),吞吐量或许高(好)。如果吞吐量低(坏),反应时间或许短(好)。多数的并发用户在一定时间使用一个系统,每个用户很有可能比平时要经历更长的延迟,但是通过系统的事务数量将会更大。相反,假如减少在某一个时间窗口中访问系统的并发用户数量,以在该时间完成的全部事务量减少为代价,每个用户将会享受到更快的反应时间。现在考虑一个为客户预定体育比赛门票的公司。如果该公司的营业时间为每天8小时,并且在销售市场体育比赛门票的第一天必须卖出25000门票,那么该公司的门票预定系统的吞吐量必须等于或大于每小时3125笔事务。吞吐量=(25000笔事务/8小时)=3125笔事务/小时,或52.1笔事务/分钟。当然,以8小时的时间间隔来计算系统需要达到的吞吐量是不现实的,因为并不是所有需求都是匀速到达系统。在设计系统软硬件规模和规划系统能力时,我们是根据系统最忙碌的时间段来计算系统所要达到的吞吐量的。这是设计数据库系统的一条著名规律:为最糟糕的情况设计系统的软硬件规模。2.2.2缩短系统的响应时间系统响应时间是指从用户按下最后一个提交按钮到所有数据都显示在显示设备上所花费的时间。以毫秒或秒表示,该值越低越好。系统响应时间的实质就是终端用户为等待后台事务处理所花费时间。响应时间通常也称为用户收到查询正被处理的直观确认时刻所感知的时间长度。数据库用户响应时间又可以分为系统服务时间和用户等待时间两项,即:数据库用户响应时间=系统服务时间+用户等待时间。因此,获得满意的用户响应时间有两个途径:l 减少系统服务时间,即提高数据库的吞吐量。l 减少用户等待时间,即减少用户访问同一数据库资源的冲突率。尽管某些数据库系统需要实现系统可能达到的最高吞吐量,但另一些系统可能有严格的系统响应时间要求。在这种环境中,漫长的系统响应时间常常意味着客户只能在线等待,这将阻碍其他用户使用系统。这种情况往往意味着失掉商机,所以缩短系统响应时间是非常重要的。对于那些对响应时间有严格要求的系统,必须采取不同的方法对系统进行调整。为了缩短系统响应时间,可以使系统以远低于其实际吞吐能力的吞吐量运行或是将批理作业放在非营业时间处理。2.3性能调整的步骤不少人认为数据库应用系统的性能调整是在系统运行出现问题时才进行的,其实,这种看法是片面的。性能调整和优化工作是在进行系统计划和设计阶段就已经开始了,并且一直贯穿系统的运行周期。在计划阶段就仔细地考虑性能调整工作,这会大大减轻系统运行后的性能调整工作。在数据库的性能调整过程中需要应用程序设计人员、应用程序开发人员、数据库管理员以与系统管理员共同完成。下面以优先顺序给出性能调整的步骤:2.3.1优化业务逻辑为了得到最佳的性能,在数据库设计过程中要采用业务逻辑。这就关系到对整个系统的高层分析和设计。像是否在系统围采用线程服务器这样的配置问题就是这一阶段需要考虑的问题。这样设计者将性能要求同具体的业务需求直接联系起来。2.3.2调整数据结构设计在数据设计阶段,设计人员必须决定哪些数据是应用所需的,同时还要考虑哪些关系是重要的,以与它们的属性是什么,还要确定哪些属性可以作为主键(Primary Key)或外键(Foreign Key)。最后,要构造好信息来更好地满足性能目标。这一阶段需要对数据进行仔细分析,避免数据冗余,同时要考虑合理分布数据,以防止数据存取的拥挤,如是否使用数据库的分区功能,以与对于经常访问的数据库表是否需要建立局部还是全局索引等。2.3.3优化数据库的逻辑结构这一阶段就是通过增加、减少或调整逻辑结构,如考虑在主键和外键上建立索引之外增加其它索引以提高系统性能。2.3.4优化数据库的操作这一阶段主要是在优化数据库服务器之前,首先确保在应用中已充分利用了为了提高性能而设计的SQL以与其中的一些特殊功能。如在SQL Server数据库中的数组的处理、SQL优化器、行级锁管理以与SQL Server查询分析器等。应用程序的执行最终将归结为数据库中的SQL语句执行,因此SQL语句的执行效率最终决定了数据库的性能。3 性能优化技术介绍3.1数据库结构优化一个数据库系统的生命周期可以分成:设计、开发和成品三个阶段。在设计阶段进行数据库性能优化的成本最低,收益最大。在成品阶段进行数据库性能优化的成本最高,收益最小。要在SQL Server方案中实现最优的性能,最关键的是要有一很好的数据库设计方案。在实际工作中,许多SQL Server方案往往是由于数据库设计得不好导致性能很差。所以,要实现良好的数据库设计就必须考虑这些问题。3.1.1数据库逻辑结构的优化一般来说,逻辑数据库设计的不合理容易产生以下问题,数据冗余、更新异常、插入异常、删除异常。所以逻辑数据库设计至少应满足规化的前3级标准:第1规:没有重复的元组或多值的列。第2规:每个非关键字段必须依赖于主关键字,不能依赖于1个组合式主关键字的某些组成部分。第3规:每个非关键字段必须依赖于主关键字,不能依赖于1个组合式主关键字的某些组成部分,也不能依赖于另1个非关键字段。遵守这些规则的设计会产生较少的列和更多的表,因而也就减少了数据冗余,也减少了用于存储数据的页。但表关系也许需要通过复杂的合并来处理,这样会降低系统的性能。某种程度上的非规化可以改善系统的性能,非规化过程可以根据性能方面不同的考虑用多种不同的方法进行,所在在进行数据库逻辑结构设计时应综合考虑数据冗余和基于连接的查询带来的性能问题。3.1.2数据库物理存储结构的优化数据文件和日志文件的位置和分布对系统的性能非常重要。数据库设计的两条关键性的指导原则如下:将序列访问的文件分离到专用的磁盘上,并通过将数据文件分散到各个磁盘上而允许并行I/O。1.与每个表列相关的数据类型应该反映数据所需的最小存储空间,特别是对于被索引的列更是如此。比如能使用smallint类型就不要用int类型,这样索引字段可以被更快地读取,而且可以在1个数据页上放置更多的数据行,因而也就减少了I/O操作。2.L Server分区技术把一个频繁使用的大表分割开,并放在多个单独的智能型磁盘控制器的数据库设备上,这样也可以提高性能。因为有多个磁头在查找,所以数据分离也能提高性能,SQL SERVER的分区技术将在下面讲到。3.SQL Server段把文本或图像列的数据存放在1个单独的物理设备上可以提高性能。1个专用的智能型的控制器能进一步提高性能。3.1.3使用分区超大型数据库的大小常常达到数百GB,有时甚至要用TB来计算。而单表的数据量往往会达到上亿的记录,并且记录数会随着时间而增长。这不但影响着数据库的运行效率,也增大数据库的维护难度。除了表的数据量外,对表不同的访问模式也可能会影响性能和可用性。这些问题都可以通过对大表进行合理分区得到很大的改善。当表和索引变得非常大时,分区可以将数据分为更小、更容易管理的部分来提高系统的运行效率。如果系统有多个CPU或是多个磁盘子系统,可以通过并行操作获得更好的性能。所以对大表进行分区是处理海量数据的一种十分高效的方法。下面通过一个具体实例,介绍如何创建和修改分区表,以与如何查看分区表。分区功能是SQL SERVER 2005新增的一个功能,表分区分为水平分区和垂直分区。水平分区将表分为多个表。每个表包含的列数一样,但是行更少。例如,可以将一个包含十亿行的表水平分区成12个表,每个小表表示特定年份一个月的数据。任何需要特定月份数据的查询只需引用相应月份的表。而垂直分区则是将原始表分成多个只包含较少列的表。水平分区是最常用分区方式,本文以水平分区来介绍具体实现方法。平分区常用的方法是根据时期和使用对数据进行水平分区。例如本文例子,一个短信发送记录表包含最近一年的数据,但是只定期访问本季度的数据。在这种情况下,可考虑将数据分成四个区,每个区只包含一个季度的数据。下面具体介绍一下使用分区表的方法。1.建文件组立分区表先要创建文件组,而创建多个文件组主要是为了获得好的I/O平衡。一般情况下,文件组数最好与分区数一样,并且这些文件组通常位于不同的磁盘上。每个文件组可以由一个或多个文件构成,而每个分区必须映射到一个文件组。一个文件组可以由多个分区使用。为了更好地管理数据(例如,为了获得更精确的备份控制),对分区表应进行设计,以便只有相关数据或逻辑分组的数据位于同一个文件组中。使用ALTER DATABASE,添加逻辑文件组名:AER DATABASEDeanDBADD FILEGROUPFG1DanDB为数据库名称,FG1文件组名。创建文件组后,再使用ALTER DATABASE将文件添加到该文件组中。ATER DATABASEDeanDBADD FILE(NAME='FG1',FILENAME='C:DeanDataFG1.ndf',SIZE=3072KB,FILEGROWTH=1024KB)TO FILEGROUPFG1类似的建立四个文件和文件组,并把每一个存储数据的文件放在不同的磁盘驱动器里。2.创建分区函数创建分区表必须先确定分区的功能机制,表进行分区的标准是通过分区函数来决定的。创建数据分区函数有RANGE“LEFT|/RIGHT”两种选择。代表每个边界值在局部的哪一边。例如存在四个分区,则定义三个边界点值,并指定每个值是第一个分区的上边界(LEFT)还是第二个分区的下边界(RIGHT)。代码如下:CREATE PARTITION FUNCTIONSendSMSPF(datetime)AS RANGE RIGHT FOR VALUES('20070401','20070701','20071001')3.创建分区方案创建分区函数后,必须将其与分区方案相关联,以便将分区指向至特定的文件组。就是定义实际存放数据的媒体与各数据块的对应关系。多个数据表可以共用一样的数据分区函数,一般不共用一样的数据分区方案。可以通过不同的分区方案,使用一样的分区函数,使不同的数据表有一样的分区条件,但存放在不同的媒介上。创建分区方案的代码如下:CREATEPARTITION SCHEMESendSMSPSASPARTITIONSendSMSPFTO (FG1,FG2,FG3,FG4) 4.创建分区表建立好分区函数和分区方案后,就可以创建分区表了。分区表是通过定义分区键值和分区方案相联系的。插入记录时,SQL SERVER会根据分区键值的不同,通过分区函数的定义将数据放到相应的分区。从而把分区函数、分区方案和分区表三者有机的结合起来。创建分区表的代码如下:CREATE TABLE SendSMSLog(IDintIDENTITY(1,1)NOT NULL,IDNumnvarchar(50)NULL,SendContenttextNULLSendDatedatetimeNOTNULL,)ON SendSMSPS(SendDate)5.查看分区表信息系统运行一段时间或者把以前的数据导入分区表后,我们需要查看数据的具体存储情况,即每个分区存取的记录数,那些记录存取在那个分区等。我们可以通过$partition.SendSMSPF来查看,代码如下:SELECT$partition.SendSMSPF(o.SendDate)ASPartition Number,min(o.SendDate)ASMin SendDate,max(o.SendDate)ASMax SendDate,count(*)ASRows In PartitionFROM dbo.SendSMSLog AS oGROUP BY$partition.SendSMSPF(o.SendDate)ORDER BYPartition Number6.维护分区分区的维护主要设计分区的添加、减少、合并和在分区间转换。可以通过ALTER PARTITION FUNCTION的选项SPLIT,MERGE和ALTER TABLE的选项SWITCH来实现。SPLIT会多增加一个分区,而MEGRE会合并或者减少分区,SWITCH则是逻辑地在组间转换分区。3.2 SQL查询语句的优化数据库的优化通常可以通过对网络、硬件、操作系统、数据库参数和应用程序的优化来进行。最常见的优化手段就是对硬件的升级。根据统计,对网络、硬件、操作系统、数据库参数进行优化所获得的性能提升,全部加起来只占数据库系统性能提升的40%左右,其余的60%系统性能提升来自对应用程序的优化。许多优化专家认为,对应用程序的优化可以得到80%的系统性能的提升。应用程序的优化通常可分为两个方面:源代码和SQL语句。由于涉与到对程序逻辑的改变,源代码的优化在时间成本和风险上代价很高,而对数据库系统性能的提升收效有限。所以SQL语句的优化对数据库系统的性能起着决定性的作用。SQL语言是一种灵活的语言,一样的功能可以使用不同的语句来实现,但是语句的执行效率是很不一样的。程序员可以通过查看查询计划来比较各种实现方案,并选出最优的实现方案。总得来讲,程序员写SQL语句需要满足考虑如下规则:3.2.1合理使用索引索引是一种供服务器在表中快速查找一个行的数据库结构。在关系数据库中,一个行的物理位置无关紧要,除非数据库需要找到它。为了能找到数据。表中的每一行均用一个ROWID来标识,ROWID告诉数据库这一行的准确位置(指出行所在的文件、该文件中的块、该块中的行地址)。每一个索引条目都由一个键值和ROWID组成。可以索引一个列或一组列,SQL SERVER用B树结构存储索引条目,以保证用最短路径访问键值,当一个查询访问索引时,就能找到与查询条件相匹配的索引条目。与条目相匹配的ROWID值指向SQL SERVER提供相关行的物理位置,以减轻定位数据所需要的I/O负担。从大多数系统应用实例来看,查询操作在各种数据库的操作中,所占的比重最大。索引是数据库的重要的数据结构,它的根本目的就是为了提高查询速度。实践证明在数据库编程中,合理使用索引文件,对于改善数据查询速度有着举足轻重的作用,可以极大改善数据库应用程序的性能。在应用过程中,用户的查询条件可能是多种多样的,如果能根据用户查询建立和选择索引,对于保证应用程序的性能很有帮助。1.索引的使用要恰到好处,一般使用的原则为:(1)为主键所在的列创建索引。为经常进行连接,但是没有指定为外键的字段建立索引,而不经常连接的字段由数据库优化器自动建立索引。(2)在频繁进行排序或分组(即使用GROUP BY或ORDER BY操作)的字段上建立索引。(3)在条件表达式中经常用到的不同值较多的字段上建立索引,在不同值较少的字段上不要建立索引,如性别字段就不需要建立索引。不要在在查询很少引用的列上创建索引。(4)如果经常同时使用多个字段排序,可以在这些字段上建立复合索引。要尽量使关键查询形成索引覆盖,其前导字段一定是使用最频繁的字段。(5)查看索引并删除不使用的索引,维护索引需要一定的硬盘空间和时间,需要频繁进行数据查入操作的数据库应该有较少的索引,需要频繁进行读取操作的数据库应该有更多的索引。(6)在聚集索引中,避免包括不必要的列,尽可能使用较小的数据类型,例如用VARCHAR代替CHAR。(7)考虑使用聚集索引来支持排序和围查询,在为数据检索而优化表的时候,聚集索引应该支持对记录组的检索。为了聚集键选择列或列组,其中聚集键根据需要经常排序的排序数据或对必须一起访问的记录进行分组。(8)具有高选择性的列是索引的好候选列,具有高密度的列是索引最糟糕的候选列。2.维护索引在创建索引后,必须维护索引以确保可以获得最佳的性能。经过一段时间后,数据会变得支离破碎,要根据组织环境对数据碎片进行整理。SQL Server 2000索引优化向导是一个你会马上喜欢上的工具。虽然并不完美,但是这个工具可以评估查询运行性能,并基于查询,提出数据表上是否该添加聚集/非聚集索引的建议。索引优化向导在SQL Server 2000事件探查器的“工具”菜单下可以找到。使用索引优化向导前,首先要创建工作负载。工作负载表示一个事件跟踪或者T-SQL脚本。在很多情况下,你应该选择使用事件跟踪,因为它反应了真实的数据库行为。工作负载的创建必须能体现一段时间每天数据库使用的情况。这样,索引优化向导就可以基于这些实际运行的统计行为来提出有用的建议。当工作负载创建后,索引优化向导就很跟踪它。索引优化向导所做的就是从工作负载中提取行为样本,然后利用查询优化器进行分析。一旦索引优化向导分析完工作负载后(如果工作负载很大,这会运行几个小时那么长),基于对工作负载的分析,提出最佳的聚集/非聚集索引建议。另外,如果数据库上已经有索引了,并且索引优化向导发现这些索引不是最佳的,那么会建议你移除。3在数据库中放置索引用户可以指定一个表的索引放置的位置。一个表的索引就该放置在与数据表不同的物理磁盘上,这样可以减少文件之间的磁盘争用。3.2.2优化SQL语句的一些具体策略1.应用程序中,保证在实现功能的基础上,尽量减少对数据库的访问次数;通过搜索参数,尽量减少对表的访问行数,最小化结果集,从而减轻网络负担;能够分开的操作尽量分开处理,提高每次的响应速度;在数据窗口使用SQL时,尽量把使用的索引放在选择的首列。2.算法的结构尽量简单;在查询时,不要过多地使用通配符如SELECT * FROM T1语句,要用到几列就选择几列,如:SELECT COL1,COL2 FROM T1;在可能的情况下尽量限制结果集行数,如:SELECT TOP 300 COL1,COL2,COL3 FROM T1,因为某些情况下用户是不需要那么多的数据的。不要在应用中使用数据库游标,游标是非常有用的工具,但比使用常规的、面向集的SQL语句需要更大的开销;按照特定顺序提取数据的查找。3.避免使用不兼容的数据类型。例如float和int、char和varchar、binary和varbinary是不兼容的。数据类型的不兼容可能使优化器无法执行一些本来可以进行的优化操作。例如:SELECT name FROM employee WHERE salary60000在这条语句中,如salary字段是money型的,则优化器很难对其进行优化,因为60000是个整型数。我们应当在编程时将整型转化成为货币型,而不要等到运行时转化。4.尽量避免在WHERE子句中对字段进行函数或表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:(1)SELECT*FROM T1 WHERE F1/2=100应改为:SELECT*FROM T1 WHERE F1=100*2(2)SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=5378应改为:SELECT*FROM RECORD WHERE CARD_NO LIKE5378%(3)SELECT member_number,first_name,last_name FROM members WHEREDATEDIFF(yy,datofbirth,GETDATE()>21应改为:SELECT member_number,first_name,last_name FROM members WHEREdateofbirth<DATEADD(yy,-21,GETDATE()即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。5.避免使用!=或、IS NULL或IS NOT NULL、IN,NOT IN等这样的操作符,因为这会使系统无法使用索引,而只能直接搜索表中的数据。例如:SELECT id FROM employee WHERE id!='B%'优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。6.尽量使用数字型字段,一部分开发人员和数据库管理人员喜欢把包含数值信息的字段设计为字符型,