日期:2014-05-18  浏览次数:20568 次

SQL数据量太大,如何优化
客户数据存储按年度建立数据库,09年4G,10年15G,11年到现在17G,现在软件运行速度非常慢,网上搜了一下可以尝试的解决方案有两种,
一、重建索引;
二、建立表分区。

但是没有详细的例子,求解决方法和具体参数说明,如DBCC DBREINDEX后边的填充因子如何确定是多少?
另外就是重建索引和建立表分区是否有其他副作用?

------解决方案--------------------
提供一些数字才能知道用什么方法最有效
1、较大的单表数据量(记录数)
2、索引是否优化,以及优化程度(这个可以把你弄呢过跟踪到的常用的最慢的SQL语句及所用时间提供出来)
3、数据特点

------解决方案--------------------
DBCC DBREINDEX后边的填充因子如何确定是多少?
一般来说碎片到了25%就需要重新建立索引了


另外就是重建索引和建立表分区是否有其他副作用?
索引建立得不好的话会失效,另外索引是以空间换取时间,也就是说会增加额外的 I/O开销这些
------解决方案--------------------
DBCC DBREINDEX后边的填充因子如何确定是多少?
--> 这个不是索引的首要参数,建议先按默认的90%即可.

另外就是重建索引和建立表分区是否有其他副作用?
--> 一、重建索引; --> 可能引起锁表,需在系统闲时进行.
二、建立表分区。--> 有限制: 只支持SQL2005及以上版本.


------解决方案--------------------
探讨
引用:

提供一些数字才能知道用什么方法最有效
1、较大的单表数据量(记录数)
2、索引是否优化,以及优化程度(这个可以把你弄呢过跟踪到的常用的最慢的SQL语句及所用时间提供出来)
3、数据特点


客户是做网购的,数据量大的表比如:销售订单子表、到货单子表、入库单子表、发货单子表、出库单子表、销售发票子表。这些是数据量大的表,现在不方便确认每个表的大小……

------解决方案--------------------
之前看过一个关于填充因子的说法(不代表本唐诗的观点):
低更改的表(读写比率为100:1):100%的填充因子
高更改的表(写超过读):50-70%的填充因子 
读写各一半的:80-90%的填充因子

重申: 这个参数不是索引的首要参数(不太重要),建议先按默认的90%即可.
更重要的是,索引的字段选择,排列顺序,索引碎片,类型选择:聚集/非聚集/唯一/复合..
------解决方案--------------------
我给你一段查数据中表的记录数以及各表所占的容量大小,索引大小等几栏,可以很直观得看到数据库中的表的情况,然后根据情况来处理相庆的数据,然后再压缩来解决数据增大的问题代码如下:

==============查看数据库表的容量大小========start
Create Table #TableSpaceInfo --创建结果存储表 
(
NameInfo NVarchar(50) , 
RowsInfo int , 
Reserved NVarchar(20) , 
DataInfo NVarchar(20) , 
Index_Size NVarchar(20) , 
Unused NVarchar(20) 
)


Declare @TableName NVarchar(255) --表名称
Declare @CmdSql NVarchar(1000)

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 NVarchar(255)', @TBName = @TableName

Fetch Next From Info_Cursor 
Into @TableName 
End

Close Info_Cursor 
Deallocate Info_cursor 
GO


--itlearner注:显示数据库信息 
sp_spaceused @UpdateUsage = 'TRUE'

--itlearner注:显示表信息 
Select * 
From #TableSpaceInfo 
Order By cast(left(lTrim(rTrim(Reserved)) , len(lTrim(rTrim(Reserved)))-2) As Int) Desc


Drop Table #TableSpaceInfo
================查看数据库表的容量大小=====end================

另外我个人也有过处理数据库容量增大的案例,我是做ERP开发的,就有发现一个客户的数据库有两百来个G,因为硬盘就500个G,一个数据库都200个G,很久都没有备份过,数据很危险,后来我就是通过上面的代码查到有几个表的数据内容很大,有一个表就是70多G。原来是因为哪个表中有图片的字段,结果我一查,就是因为图片字段占的内容特别大,其它的几个表也是相同的情况,后来查代码发现是因为图片在用ERP程序插入数据库中是用BMP格式保存的,这种格式很点容易,后来做了一个转换程序,把所有的图片全部转成jpg再存过,有存图片的地方也全部改用jpg存当,这样就解决了,最后释放了130G的容量。

还有另外的案例就是把不用的数据备份到另外一个数据库中存档。以减小使用的数据的容量。
------解决方案--------------------
慢和索引碎片关系不是很大 看看执行计划走得对不对