SQL 2005 Index占用空间大的问题!

[复制链接]
查看11 | 回复2 | 2007-6-22 01:03:37 | 显示全部楼层 |阅读模式
公司ERP使用SQL 2005作为数据库,由于DB的递增很利害,现在已到达了200多G,备份和维护极为缓慢.
最近我打算要重新整理下DB看看能不能缩小,查看Table原来除了正常数据外,占用空间的主要是是索引(Index),
有的索引占用的空间竟是数据的2倍,(如下图数据). 这样的大的Index占用空间正不正常?
我有什么办法可以重整这些Table 并回收更多的空间?


Top5 Table 占空间列表:
Table Name # Records Reserved (KB) Data (KB) Indexes (KB) Unused (KB)
PRODDTA.F4111 5,168,868 18,943,616 5,909,080 13,023,416 11,120
PRODDTA.F4141 12,363,470 18,861,096 9,817,232 9,043,040 824
PRODDTA.F0911 4,601,244 16,644,864 6,230,288 10,402,496 12,080
PRODDTA.F4105 4,123,378 8,852,248 3,126,208 5,724,512 1,528
PRODDTA.F41021 3,208,572 8,529,024 3,121,592 5,399,464 7,968
回复

使用道具 举报

千问 | 2007-6-22 01:03:37 | 显示全部楼层
索引比实际数据占用的空间大,这一现象,不算稀奇。
建议你用DMV来分析一下,像哪些索引从最后一次Sql Server重启后到目前为止一直没用过。发现了那些索引之后,把它们的定义保存下来,因为有的索引是为月或季度报表用或其它不常发生的事件来用的,并不一定是一点作用都没有。
有了那些索引的名字,你可以按占用空间的大小,酌情删除一些,或许能省一些空间。下面是用来发现这些索引的脚本:
use MyDb
go
select object_name(i.object_id), i.name
from sys.indexes i, sys.objects o
wherei.index_id NOT IN (select s.index_id
from sys.dm_db_index_usage_stats s
where s.object_id=i.object_id and

i.index_id=s.index_id and

database_id = db_id('MyDb') )
and o.type = 'U'
and o.object_id = i.object_id
order by object_name(i.object_id) asc
go
回复

使用道具 举报

千问 | 2007-6-22 01:03:37 | 显示全部楼层
你可以检查sys.dm_db_index_physical_stats的avg_fragmentation_in_percent,对碎片多的index做一个rebuild。如果是企业版的话,尽量使用online,可以减少block。

indexes是data的两倍倒是很正常的。具体情况要具体分析。
还有,可以检查 sys.dm_db_index_usage_stats 的 user_seeks, user_scans, user_lookups, user_updates, last_user_seek, last_user_scan 等字段,去掉不使用的索引。但是一定要谨慎。

online rebuild基本没什么风险,不过如果碎片不多的话,收效不大。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行