SQL数据量太大,如何优化客户数据存储按年度建立数据库,09年4G,10年15G,11年到现在17G,现在软件运行速度非
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的容量。
还有另外的案例就是把不用的数据备份到另外一个数据库中存档。以减小使用的数据的容量。
[解决办法] 慢和索引碎片关系不是很大 看看执行计划走得对不对