SQL Server现场优化纪实(二):通过重建索引提高性能

续接上文,通过如下方式观察数据文件过大的情况:

 

--获取数据库的物理文件信息
SELECT df.[name], df.physical_name, df.[size], df.growth, f.[name][filegroup], f.is_default
FROM sys.database_files df
 JOIN sys.filegroups f
 ON df.data_space_id = f.data_space_id
 
--获取数据库磁盘占用情况
exec sp_spaceused
 --@objname = 'CL_BILL_PC' ,
 @updateusage = 'TRUE'
GO

--获取数据库各个表的磁盘占用情况
if not exists
 (select * from dbo.sysobjects where id = object_id(N'[dbo].[tablespaceinfo]')
  and OBJECTPROPERTY(id, N'IsUserTable') = 1)
create table tablespaceinfo --创建表空间统计临时表
(
 nameinfo varchar(50) ,
 rowsinfo int ,
 reserved varchar(20) ,
 datainfo varchar(20) ,
 index_size varchar(20) ,
 unused varchar(20)
)

--清空统计临时表
delete from tablespaceinfo

--存储各个表名称
declare @tablename varchar(255)

--存储查询语句
declare @cmdsql varchar(500)

--创建针对表对象的游标
DECLARE Info_cursor CURSOR FOR
 select o.name from dbo.sysobjects o where OBJECTPROPERTY(o.id, N'IsTable') = 1
    and o.name not like N'#%%' order by o.name

OPEN Info_cursor

 FETCH NEXT FROM Info_cursor INTO @tablename

 WHILE @@FETCH_STATUS = 0

 BEGIN

 --获取当前表的磁盘占用情况,并存储至临时表
 if exists (select * from dbo.sysobjects where id = object_id(@tablename) and OBJECTPROPERTY(id, N'IsUserTable') = 1)
 execute sp_executesql
  N'insert into tablespaceinfo exec sp_spaceused @tbname',
  N'@tbname varchar(255)',
  @tbname = @tablename

 FETCH NEXT FROM Info_cursor INTO @tablename
 END

CLOSE Info_cursor

DEALLOCATE Info_cursor

GO

--显示空间统计临时表信息
select *
from tablespaceinfo
order by cast(left(ltrim(rtrim(reserved)) , len(ltrim(rtrim(reserved)))-2) as int) desc

 

从中可以看出来各个表占用空间情况:

 

我们从中可以看出来某些表记录量比较大,数据文件占用空间也比较大,对此我们可以通过表分区的手段减小单个数据文件的占用空间。

 

在表分区操作之前,先来了解一些基础知识

 

1、文件和文件组的含义与关系

    每个数据库有一个主数据文件.和若干个从文件。文件是数据库的物理体现。 文件组可以包括分布在多个逻辑分区的文件,实现负载平衡。文件组允许对文件进行分组,以便于管理和数据的分配/放置。例如,可以分别在三个硬盘驱动器上创建三个文件(Data1.ndf、Data2.ndf   和   Data3.ndf),并将这三个文件指派到文件组   fgroup1   中。然后,可以明确地在文件组   fgroup1   上创建一个表。对表中数据的查询将分散到三个磁盘上,因而性能得以提高。在   RAID(磁盘冗余阵列)条带集上创建单个文件也可以获得相同的性能改善。然而,文件和文件组使您得以在新磁盘上轻易地添加新文件。另外,如果数据库超过单个   Microsoft   Windows 文件的最大大小,则可以使用次要数据文件允许数据库继续增长。

2、文件、文件组在实践应用中常见的问题

通常情况下我们构造的数据库都只有两个文件,mdf文件和ldf文件.但是这样有两个缺点:

(一)容易导致文件过大

   我们知道,mdf文件是数据库文件,这样的话也就意味着随着数据库的增大mdf就会相应的增大,显然在现在的应用中数据膨胀是太常见的事情了,当你的应用变大后,mdf文件也会变大,然而windows对文件的大小是有要求的,这样的话很容易导致mdf文件达到windows所允许的文件大小的界限(于是数据库就崩溃了)。

(二)没有利用到磁盘阵列

   大型的服务器好多都有磁盘阵列,你可以把磁盘阵列简单的假象成n个一块转动的磁盘,磁盘阵列的设计是希望通过多个磁盘的串联来得到更大的读写效率.但是如果你的数据库只有一个mdf文件(ldf文件暂时不考虑),那么你总是只能够利用这个磁盘阵列里面的一个磁盘而已.那样的话昂贵的磁盘阵列的效率就由并联变成串联了.试想如果我们能够让mdf分散成多个文件,比如说磁盘阵列上的每个磁盘中都分配一个文件,然后把mdf中的数据分散到各个文件中,我在读取的时候就是串联的读取了,这样就充分的利用了磁盘阵的存取效能.

这两个问题平常我们没有遇到过(条件不具备),但是做大型的服务开发的时候这几乎是致命的.

3、MSDN官方解释

了解文件和文件组

每个 SQL Server 数据库至少具有两个操作系统文件:一个数据文件和一个日志文件。数据文件包含数据和对象,例如表、索引、存储过程和视图。日志文件包含恢复数据库中的所有事务所需的信息。为了便于分配和管理,可以将数据文件集合起来,放到文件组中。

 à数据库文件
SQL Server 数据库具有三种类型的文件,如下所示

主要數據文件

 主要数据文件包含数据库的启动信息,并指向数据库中的其他文件。用户数据和对象可存储在此文件中,也可以存储在次要数据文件中。每个数据库有一个主要数据文件。主要数据文件的建议文件扩展名是 .mdf.
 次要数据文件

是可选的,由用户定义并存储用户数据。通过将每个文件放在不同的磁盘驱动器上,次要文件可用于将数据分散到多个磁盘上。另外,如果数据库超过了单个 Windows 文件的最大大小,可以使用次要数据文件,这样数据库就能继续增长。次要数据文件的建议文件扩展名是 .ndf。
事务日志文件
 事务日志文件保存用于恢复数据库的日志信息。每个数据库必须至少有一个日志文件。事务日志的建议文件扩展名是 .ldf.

à文件组
每个数据库有一个主要文件组。此文件组包含主要数据文件和未放入其他文件组的所有次要文件。可以创建用户定义的文件组,用于将数据文件集合起来,以便于管理、数据分配和放置。

例如,可以分别在三个磁盘驱动器上创建三个文件 Data1.ndf、Data2.ndf 和 Data3.ndf,然后将它们分配给文件组 fgroup1。然后,可以明确地在文件组 fgroup1 上创建一个表。对表中数据的查询将分散到三个磁盘上,从而提高了性能。通过使用在 RAID(独立磁盘冗余阵列)条带集上创建的单个文件也能获得同样的性能提高。但是,文件和文件组使您能够轻松地在新磁盘上添加新文件。

以下列出了存储在文件组中的所有数据文件。

主文件组  
主要包含主要文件的文件组。所有系统表都被分配到主要文件组中。
用户定义文件組

用户首次创建数据库或以后修改数据库时明确创建的任何文件组

默认文件组
如果在数据库中创建对象时没有指定对象所属的文件组,对象将被分配给默认文件组。不管何时,只能将一个文件组指定为默认文件组。默认文件组中的文件必须足够大,能够容纳未分配给其他文件组的所有新对象。

PRIMARY 文件组是默认文件组,除非使用 ALTER DATABASE 语句进行了更改。但系统对象和表仍然分配给 PRIMARY 文件组,而不是

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值