【转】性能分析—查询运行慢的原因(SQLServer2008宝典)

https://www.cnblogs.com/weifb/articles/3999273.html

影响查询语句执行性能的常见因素

1.网络通信的速度较慢或者网络通信不稳定。

2.数据库服务器的内存不足,或者没有足够的内存供SQL Server使用。

3.Select的语句设计不合理。

4.数据库结构的设计不合理,导致数据库中存在大量重复数据。

5.没有创建索引或者索引的设计不合理。

6.没有创建有效的索引视图。

7.索引列上缺少有用的统计信息或者统计信息过期。

8.缺少有效的分区设计

如何定位导致查询运行慢的原因

1.首先可以判断影响性能的因素是否与查询语句相关,还是由于数据库服务器的硬件配置造成的。

2.如果确定影响性能的因素与查询语句相关,则可以使用SQL Server profile对SQL Server进行跟踪,通过对跟踪数据的分析,确定执行时间较长或占用系统资源较多的查询语句。

3.在确定了影响数据库性能的查询语句后,可以通过显示计划来了解执行查询语句的过程,通过对查询语句执行过程的分析,或者通过SQLServer数据库引擎优化顾问来分析查询语句可以优化的地方。(参照SqlServer2008学习笔记:日常维护、深入管理、性能优化.pdf的第5章)

4.判断是否使用了有效的统计信息。SQLServer可以自动统计表中各列上值的分布情况,定时根据表中数据的情况更新统计信息,有助于提高查询语句的执行效率。

5.确认表的索引设计是否合理。有效的使用和设计索引可以大大提高查询效率。(参照SqlServer2008学习笔记:日常维护、深入管理、性能优化.pdf的第5章)

6.对于数据量很大的表,可以考虑对表进行分区,将表中的数据分散在不同的分区中,从而缩小查询数据的范围,提高查询效率。(数据分区,参照第19章介绍)。

Select语句优化

在Select语句中应该尽可能不返回多余的数据,需要从行和列两方面进行优化,控制尽量少的输出数据。

分区技术的分类

可以将大型表拆分成更小的单个的表,也可以将表放置在不同的磁盘驱动器上,从而实现分区技术。

1.硬件分区:可以通过增加冗余的硬件设备,将数据库存储和查询任务分配到不同的硬件设备上,构建高效的数据库硬件体系结构。

2.水平分区:水平分区将表分成多个表,每个表中包含的数据列数相同,只是将原来的结果集以行的单位进行了拆分。例如,按照时间进行分区也是一种常用的分区方法。

3.垂直分区:垂直分区也是将表分成多个表,单每个表包含的行数相同,只是将原表的结果集以列进行拆分。对于包含列数较多的大型表而言,如果需要经常访问其中的几列数据,则可以对其进行垂直分区,从而减少分区表中数据的数量,提高查询效率。

分区表技术解析:对于大型表而言,它的索引数据量也会变得很大,仅依靠创建索引来优化查询是不够的。分区可以将数据细分到不同的区域中,使每个区域的数据更少、更易维护。在分区表上创建的索引页会体现在各个分区中,从而减少了分区索引所需要维护的数据量,更好的提高查询的效率。现在数据库服务器中通常会配置多个CPU,在分区表上执行查询语句时,每个CPU可以独立地对每个分区中的数据进行查询,然后再将结果集合并。因此,在配置多个CPU的数据库服务器上,对大型表进行分区能更好的利用系统的硬件资源,提高数据库的工作效率。

分区表采用水平分区技术,将数据按某种规则划分成不同的区域,保存在不同的文件组中。通常在同时满足下面两种情况时需要使用分区表。

1.表中已经存在大量的数据,或者预计表中将会保存大量的数据。

2.不能按预期对表中的数据执行查询或更新。例如,对当前月份的数据主要执行insert、update、delete等操作,而对以前月份的数据主要执行Select操作,此时可以按照月份创建分区表。

事例:以信用卡刷卡消费为例介绍创建和使用分区表的方法。因为银行的信用卡拥有大量的客户,他们在刷卡消费时,会产生大量的数据,保存在银行的后台数据库中,如果不对数据库进行任何优化,在对这些数据进行查询和统计时将非常的慢,同时会占用大量的系统资源。

解决方案:创建数据库Credit,然后创建表Consume2009,用于保存2009年所有信用卡刷卡消费的数据。可以在分区表上创建索引,称为分区索引。在对表或索引分区前,需要创建两个数据库对象,即分区函数和分区方案。

分区函数用于定义根据指定的列(分区依据列)的值将表或索引中的记录映射到不同的分区中。例如:在表Consume可以把ConsumeDate列作为分区依据列,将不同月份的消费记录保存在不同的分区中。分区方案将分区函数指定的每一个分区映射到文件组上。

确定分区依据列和分区数

在创建分区表和分区索引之前,要确定分区的方案,首先需要确定分区的依据和分区数量,例如,按照信用卡消费的月份对数据库Credit中的表Consume2009进行分区,可以将Consume2009表分为12个区。

Sql Server规定一张表最多只能有1000个分区。

创建文件组

在创建分区表之前,需要创建数据库的文件组。建议创建与分区数量相同的文件组,在条件允许的情况下,可以将不同的文件组放置在不同的磁盘上,从而提高查询大型表的效率。可以使用 ALTER DATABASE <数据库名> ADD FILEGROUP <文件组名> 语句创建文件组名

以上面的Credit数据库为例。

ALTER DATABASE Credit ADD FILEGROUP filegroup1

ALTER DATABASE Credit ADD FILEGROUP filegroup2

ALTER DATABASE Credit ADD FILEGROUP filegroup3

ALTER DATABASE Credit ADD FILEGROUP filegroup4

ALTER DATABASE Credit ADD FILEGROUP filegroup5

ALTER DATABASE Credit ADD FILEGROUP filegroup6

ALTER DATABASE Credit ADD FILEGROUP filegroup7

ALTER DATABASE Credit ADD FILEGROUP filegroup8

ALTER DATABASE Credit ADD FILEGROUP filegroup9

ALTER DATABASE Credit ADD FILEGROUP filegroup10

ALTER DATABASE Credit ADD FILEGROUP filegroup11

ALTER DATABASE Credit ADD FILEGROUP filegroup12

文件组创建好之后就可以向文件组中添加文件

clip_image001

其他文件组中添加文件依次类推。

执行完上面的脚本后,打开数据库Credit的属性对话框,在"选择页"列表中选择"文件",可以查看到新建的12文件以及他们所属的文件组。

分区技术应用场景

在需要使用分区技术的数据库中,数据库管理员的主要任务是合理规划和创建分区表,并创建分区索引。可以使用向导创建分区表,但通常建议使用CREATE PARTITION FUNCTION 命令和CREATE PARTITION SCHEME命令来创建分区函数和分区方案,因为这样还可以日后重复使用。在维护采用分区技术的数据库时,有时需要对分区执行合并和分区操作

使用CREATE PARTITION FUNCTION语句创建分区函数

分区函数的功能是指定如何对表或索引进行分区,它可以将数据映射到一组分区上。在分区函数中需要指定分区数量、分区依据列和每个分区的分区依据列范围。分区依据只能是一列。可以使用CREATE PARTITION FUNCTION 语句创建创建分区函数,其基本语法结构如下:

clip_image002

语法语句解析:

AS RANGE 子句指定在对表中数据进行分区时,数据库引擎按升序从左向右排序的情况下,每个指定的分区边界值属于左侧分区还是右侧分区。

FOR VALUES子句指定分区的边界间隔值。

在CREATE PARTITION FUNCTION语句中不需要指定具体的分区列,分区列由CREATE TABLE 语句或CREATE INDEX 语句在创建分区表或分区索引时定义。换言之,分区函数只是定义了分区的方法,此方法具体应用在哪个表的哪个列上,则需要在创建表或索引时指定。例如:创建分区函数Consume2009PartitionFunction1,按销售月份对销售数据进行分区,语句内容如下

clip_image003

使用DROP PARTITION FUNCTION 语句删除分区函数

可以使用DROP PARTITION FUNCTION 语句删除分区函数,其基本语法结构如下:

DROP PARTITION FUNCTION <函数名>,注意只有在没有分区方案使用该分区函数时,才能对其进行删除。

使用CREATE PARTITION SCHEME 语句创建分区方案

创建分区函数后,必须将其与指定的分区方案向关联。分区方案用于指定分区对应的文件组,即使多个分区同时位于一个文件组,也需要分别为每个分区定义所属的文件组。

可以使用CREATE PARTITION SCHEME 语句创建分区方案,具体语句结构如下:

CREATE PARTITION SCHEME <分区方案名>

AS PARTITION <分区函数名>

TO(文件组名1,文件组名2……)

例如:为分区函数Consume2009PartitionFunction1指定对应的文件组,可以使用下面的语句。

CREATE PARTITINO SCHEME Consume2009PartitionScheme1

AS PARTITION Consume2009PartitionFunction1

TO (FileGroup1,FileGroup2,FileGroup3,FileGroup4,FileGroup5,FileGroup6,FileGroup7,FileGroup8,FileGroup9,FileGroup10,FileGroup11,FileGroup12)

使用DROP PARTITION SCHEME 语句删除分区方案

clip_image004

【赛迪网-IT技术报道】SQL Server数据库查询速度原因有很多,常见的有以下几种:   1、没有索引或者没有用到索引(这是查询最常见的问题,是程序设计的缺陷)     2、I/O吞吐量小,形成了瓶颈效应。     3、没有创建计算列导致查询不优化。     4、内存不足     5、网络速度     6、查询出的数据量过大(可以采用多次查询,其他的方法降低数据量)     7、锁或者死锁(这也是查询最常见的问题,是程序设计的缺陷)     8、sp_lock,sp_who,活动的用户查看,原因是读写竞争资源。     9、返回了不必要的行和列     10、查询语句不好,没有优化 ●可以通过以下方法来优化查询 : 1、把数据、日志、索引放到不同的I/O设备上,增加读取速度,以前可以将Tempdb应放在RAID0上,SQL2000不在支持。数据量(尺寸)越大,提高I/O越重要。 2、纵向、横向分割表,减少表的尺寸(sp_spaceuse) 3、升级硬件 4、根据查询条件,建立索引,优化索引、优化访问方式,限制结果集的数据量。注意填充因子要适当(最好是使用默认值0)。索引应该尽量小,使用字节数小的列建索引好(参照索引的创建),不要对有限的几个值的字段建单一索引如性别字段。 5、提高网速。 6、扩大服务器的内存,Windows 2000和SQL server 2000能支持4-8G的内存。 配置虚拟内存:虚拟内存大小应基于计算机上并发运行的服务进行配置。运行 Microsoft SQL Server? 2000时,可考虑将虚拟内存大小设置为计算机中安装的物理内存的1.5倍。如果另外安装了全文检索功能,并打算运行Microsoft搜索服务以便执行全文索引和查询,可考虑:将虚拟内存大小配置为至少是计算机中安装的物理内存的3倍。将SQL Server max server memory服务器配置选项配置为物理内存的1.5倍(虚拟内存大小设置的一半)。 7、增加服务器CPU个数;但是必须 明白并行处理串行处理更需要资源例如内存。使用并行还是串行程是MsSQL自动评估选择的。单个任务分解成多个任务,就可以在处理器上运行。例如耽搁查询 的排序、连接、扫描和GROUP BY字句同时执行,SQL SERVER根据系统的负载情况决定最优的并行等级,复杂的需要消耗大量的CPU的查询最适合并行处理。但是更新操作UPDATE,INSERT, DELETE还不能并行处理。 8、如果是使用like进行查询的话,简单的使用index是不行的,但是全文索引,耗空间。 like ''a%'' 使用索引 like ''%a'' 不使用索引用 like ''%a%'' 查询时,查询耗时和字段值总长度成正比,所以不能用CHAR类型,而是VARCHAR。对于字段的值很长的建全文索引。 9、DB Server 和APPLication Server 分离;OLTP和OLAP分离 10、分布式分区视图可用于实现数据库服务器联合体。 联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。有关更多信息,参见设计联合数据库服务器。(参照SQL帮助文件''分区视图'') a、在实现分区视图之前,必须先水平分区表 b、 在创建成员表后,在每个成员服务器上定义一个分布式分区视图,并且每个视图具有相同的名称。这样,引用分布式分区视图名的查询可以在任何一个成员服务器上 运行。系统操作如同每个成员服务器上都有一个原始表的复本一样,但其实每个服务器上只有一个成员表和一个分布式分区视图。数据的位置对应用程序是透明的。 11、重建索引 DBCC REINDEX ,DBCC INDEXDEFRAG,收缩数据和日志 DBCC SHRINKDB,DBCC SHRINKFILE. 设置自动收缩日志.对于大的数据库不要设置数据库自动增长,它会降低服务器的性能。 在T-sql的写法上有很大的讲究,下面列出常见的要点:首先,DBMS处理查询计划的过程是这样的:   1、 查询语句的词法、语法检查     2、 将语句提交给DBMS的查询优化器     3、 优化器做代数优化和存取路径的优化     4、 由预编译模块生成查询规划     5、 然后在合适的时间提交给系统处理执行     6、 最后将执行结果返回给用户。 其次,看一下SQL SERVER的数据存放的结构:一个页面的大小为8K(8060)字节,8个页面为一个盘区,按照B树存放。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值